如何使用 bundle 将字符串从 activity 发送到片段
How to send string from activity to fragment using bundle
当我尝试 运行 这段代码时,它显示了一个异常,它是 "nullPointer exception"。我找不到这段代码的错误,谁能帮我修复那个错误?我的代码出错了,请帮我修复它。
这是我的 MainActivity
public class MainActivity extends AppCompatActivity {
private TabLayout tabLayout;
private ViewPager viewPager;
EditText testInputTV;
Button send;
Bundle bundle;
String welcome ="Welcome";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testInputTV = (EditText) findViewById(R.id.testInput);
send= (Button) findViewById(R.id.send);
viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
public void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
bundle =new Bundle();
bundle.putString("welcome", welcome);
FragmentOne fragobj = new FragmentOne();
fragobj.setArguments(bundle);
adapter.addFragment(new FragmentOne(), "ONE");
viewPager.setAdapter(adapter);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(android.support.v4.app.FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
}
我的片段class
public class FragmentOne extends Fragment {
String storeText;
private Bundle bundle;
public FragmentOne() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view=inflater.inflate(R.layout.fragment_fragment_one, container, false);
bundle = this.getArguments();
storeText = bundle.getString("welcome");
Toast.makeText(getContext().getApplicationContext(),storeText,Toast.LENGTH_SHORT).show();
return view;
}
}
Logcat
中的错误文本
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
问题就在这里
adapter.addFragment(new FragmentOne(), "ONE");
因为您正在创建一个新对象而不是带有 bundle 对象的旧对象。
试试下面的代码:
adapter.addFragment(fragobj, "ONE");
您要添加一个新片段而不是使用您制作的片段并将参数设置为:
adapter.addFragment(new FragmentOne(), "ONE");
将此更改为:
adapter.addFragment(fragobj, "ONE");
另外建议在实例化片段时使用带有 newInstance
方法的抽象工厂设计模式,例如:
public static FragmentOne newInstance(Bundle b) {
FragmentOne fragment = new FragmentOne();
fragment.setArguments(b);
return fragment;
}
然后像这样创建片段:
FragmentOne fragobj = FragmentOne.newInstance(bundle);
在这一行中,您将设置参数并创建它。
变化:
adapter.addFragment(new FragmentOne(), "ONE");
收件人:
adapter.addFragment(fragobj, "ONE");
您正在创建 FragmentOne
的新实例,但 Bundle
设置为 fragobj
。
这些行似乎有问题:
FragmentOne fragobj = new FragmentOne();
fragobj.setArguments(bundle);
adapter.addFragment(new FragmentOne(), "ONE");
您在调用添加片段时创建了一个新片段(未使用您用于设置参数的片段)
更改为:
FragmentOne fragobj = new FragmentOne();
fragobj.setArguments(bundle);
adapter.addFragment(fragobj, "ONE");
当我尝试 运行 这段代码时,它显示了一个异常,它是 "nullPointer exception"。我找不到这段代码的错误,谁能帮我修复那个错误?我的代码出错了,请帮我修复它。
这是我的 MainActivity
public class MainActivity extends AppCompatActivity {
private TabLayout tabLayout;
private ViewPager viewPager;
EditText testInputTV;
Button send;
Bundle bundle;
String welcome ="Welcome";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testInputTV = (EditText) findViewById(R.id.testInput);
send= (Button) findViewById(R.id.send);
viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
public void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
bundle =new Bundle();
bundle.putString("welcome", welcome);
FragmentOne fragobj = new FragmentOne();
fragobj.setArguments(bundle);
adapter.addFragment(new FragmentOne(), "ONE");
viewPager.setAdapter(adapter);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(android.support.v4.app.FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
}
我的片段class
public class FragmentOne extends Fragment {
String storeText;
private Bundle bundle;
public FragmentOne() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view=inflater.inflate(R.layout.fragment_fragment_one, container, false);
bundle = this.getArguments();
storeText = bundle.getString("welcome");
Toast.makeText(getContext().getApplicationContext(),storeText,Toast.LENGTH_SHORT).show();
return view;
}
}
Logcat
中的错误文本 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
问题就在这里
adapter.addFragment(new FragmentOne(), "ONE");
因为您正在创建一个新对象而不是带有 bundle 对象的旧对象。
试试下面的代码:
adapter.addFragment(fragobj, "ONE");
您要添加一个新片段而不是使用您制作的片段并将参数设置为:
adapter.addFragment(new FragmentOne(), "ONE");
将此更改为:
adapter.addFragment(fragobj, "ONE");
另外建议在实例化片段时使用带有 newInstance
方法的抽象工厂设计模式,例如:
public static FragmentOne newInstance(Bundle b) {
FragmentOne fragment = new FragmentOne();
fragment.setArguments(b);
return fragment;
}
然后像这样创建片段:
FragmentOne fragobj = FragmentOne.newInstance(bundle);
在这一行中,您将设置参数并创建它。
变化:
adapter.addFragment(new FragmentOne(), "ONE");
收件人:
adapter.addFragment(fragobj, "ONE");
您正在创建 FragmentOne
的新实例,但 Bundle
设置为 fragobj
。
这些行似乎有问题:
FragmentOne fragobj = new FragmentOne();
fragobj.setArguments(bundle);
adapter.addFragment(new FragmentOne(), "ONE");
您在调用添加片段时创建了一个新片段(未使用您用于设置参数的片段)
更改为:
FragmentOne fragobj = new FragmentOne();
fragobj.setArguments(bundle);
adapter.addFragment(fragobj, "ONE");