在我正在使用的应用程序中,我正在从数据库中检索一些数据。我的活动布局上有片段,我需要将数据推送到特定的选项卡。由于存在标签,我正在使用ViewPagerAdapter;
,因此数据从MainActivity
到ViewPagerAdapter
到捆绑包中的片段。我认为这是因为那额外的停顿使我无法将束捆绑到片段本身,但我可能是错的。
问题是创建DescriptionTab.java
并使用getArguments().getString("Description")
时,getString()为null,因此没有数据被重新显示。
MainActivity.java
public class MainActivity extends AppCompatActivity {
public String description;
private TabLayout tabLayout;
private ViewPager viewpager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
description = "some text";
tabLayout = findViewById(R.id.takenTabs);
viewpager = findViewById(R.id.viewpager);
setupViewPager(viewpager);
tabLayout.setupWithViewPager(viewpager);
}
private void setupViewPager(ViewPager viewpager) {
ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
Bundle bundle = new Bundle();
bundle.putString("Description", description);
Fragment fragmentDesc = new DescriptionTab();
fragmentDesc.setArguments(bundle);
viewPagerAdapter.addFragment(fragmentDesc, "Beschrijving");
viewPagerAdapter.addFragment(new UsersTab(), "Ingeschreven");
viewPagerAdapter.addFragment(new CommentsTab(), "Opmerkingen");
viewpager.setAdapter(viewPagerAdapter);
}
}
我从数据库中获得了说明字符串,但是为了使其更简单,现在我只是在MainActivity中创建它。我确实知道它实际上是从数据库中检索数据的,因为当我将其推送到TextView
时它会显示数据。
有3个标签,但现在我仅尝试将数据传递到“描述”标签。
ViewPagerAdapter.java
public class ViewPagerAdapter extends FragmentPagerAdapter {
private final ArrayList<Fragment> fragmentsList = new ArrayList<>();
private final ArrayList<String> fragmentTitle = new ArrayList<>();
public ViewPagerAdapter(FragmentManager fm) {
super(fm); }
@Override
public Fragment getItem(int position) {
return fragmentsList.get(position);
}
@Override
public int getCount() {
return fragmentsList.size();
}
public void addFragment(Fragment fragment, String tabTitle) {
fragmentsList.add(fragment);
fragmentTitle.add(tabTitle);
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return fragmentTitle.get(position);
}
}
在将片段添加到fragmentsList之前,我曾尝试使用addFragment()方法创建包含数据的片段和捆绑包,但这也不起作用。
DescriptionTab.java
public class DescriptionTab extends Fragment {
public DescriptionTab() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle state) {
View rootView = inflater.inflate(R.layout.description_tab, container, false);
final Bundle args = getArguments();
final String description = args.getString("Description");
TextView descriptionText = rootView.findViewById(R.id.descriptionTxt);
descriptionText.setText(description);
// Inflate the layout for this fragment
return inflater.inflate(R.layout.description_tab, container, false);
}
}
getString(“ Description”)应该可以检索数据,但是Android Studio已经对其进行了检查,并告诉我它可能会产生NullPointerException。我猜它会产生NullPointerException,因为我自己在代码的其他部分找不到问题。
请告诉我,如果您知道我在做什么错或者为什么它不起作用。
答案 0 :(得分:0)
viewPagerAdapter.addFragment()
是一种反模式,因为它在生产中进程死亡后不可避免地会导致崩溃。
实现常规 FragmentPagerAdapter 的正确方法是:
public class ViewPagerAdapter extends FragmentPagerAdapter {
public ViewPagerAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public Fragment getItem(int position) {
if(position == 0) return new RulesFragment();
if(position == 1) return new TreeFragment();
if(position == 2) return new PredictionFragment();
throw new IllegalStateException("Unexpected position " + position);
}
@Override
public int getCount() {
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
if(position == 0) return "TREE RULES";
if(position == 1) return "REGRESSION TREE";
if(position == 2) return "PREDICTION";
throw new IllegalStateException("Unexpected position " + position);
}
}
要获取对 ViewPager 创建的 Fragment 的引用,请使用以下 findFragmentByTag
方案:
Fragment fragment = supportFragmentManager.findFragmentByTag("android:switcher:" + viewPager.getId() + ":" + fragmentPosition)
要将属性作为 Bundle 参数传递给 Fragment,必须将其传递给在 getItem()
内创建的实例。
答案 1 :(得分:-1)
尝试一下
this.getArguments();
代码段
final Bundle args = this.getArguments();