片段中的getArguments()。getString()返回null

时间:2019-12-03 14:56:29

标签: java android android-fragments android-viewpager android-bundle

在我正在使用的应用程序中,我正在从数据库中检索一些数据。我的活动布局上有片段,我需要将数据推送到特定的选项卡。由于存在标签,我正在使用ViewPagerAdapter;,因此数据从MainActivityViewPagerAdapter到捆绑包中的片段。我认为这是因为那额外的停顿使我无法将束捆绑到片段本身,但我可能是错的。

问题是创建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,因为我自己在代码的其他部分找不到问题。

请告诉我,如果您知道我在做什么错或者为什么它不起作用。

2 个答案:

答案 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();