java - 当fragment onCreateView时从Activity发送数据到Fragment

标签 java android android-fragments activity-oncreateview

抱歉我的英语不好。我有一个 Activity ,在 FragmentPagerAdapter 的这个 Activity 中存在 5 个 fragment 。所有 fragment 都使用一个对象模型来获取信息(产品名称、产品图像...)。

我的 Activity 从数据库获取数据。然后将数据发送到所有 fragment 。我的示例 Activity :

           @BindView(R.id.tabs_sep_prod) TabLayout tabs_sep_prod;
            @BindView(R.id.viewpager_sep_prod) ViewPager viewpager_sep_prod;
            PrepBaseProdFragment prepBaseProdFragment;

         @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_sep_product);
                ButterKnife.bind(this);

                prepBaseProdFragment = new PrepBaseProdFragment();
                // there i have another fragments
                // ...
                setupViewPager(viewpager_sep_prod);
                tabs_sep_prod.setupWithViewPager(viewpager_sep_prod);
        }

         private void setupViewPager(ViewPager viewPager) {
                SepProductActivity.ViewPagerAdapter adapter = new SepProductActivity.ViewPagerAdapter(
                adapter.addFrag(prepBaseProdFragment, getString(R.string.sep_prep_base));
                 // there i have another addFrag
                // ...
                viewPager.setOffscreenPageLimit(5);
                viewPager.setAdapter(adapter);
            }

     @Override
        public void onResume() {
            super.onResume();
        // this i call method from presenter, it return data in method setData
            if(idCat != null && idProd != null)
                sepProductPresenter.getSepProd(idCat, idProd);
        }

    @Override
        public void setData(SepProductModel sepProductModel) {
        // there i send data to fragment
            prepBaseProdFragment.setDataInf(sepProductModel);
        // ...
        }

class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFrag(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }

我的 fragment

public class PrepBaseProdFragment extends BaseFragment {

    @BindView(R.id.text) TextView text;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_about_prod_prepare_base, parent, false);
        ButterKnife.bind(this, view);
        Log.e("PrepBaseProdFragment", "PrepBaseProdFragment");

        return view;
    }

    public void setDataInf(SepProductModel sepProductModel) {
        text.setText(sepProductModel.getPROPERTY_PR_SUBSTRPREP_UA_VALUE().getTEXT());
    }

}

我的问题:当我将数据从 Activity 发送到 fragment 时,我的 View 没有时间初始化。在 fragment 行 text.setText(sepProductModel.getPROPERTY_PR_SUBSTRPREP_UA_VALUE().getTEXT()); 错误

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference

请帮我解决我的问题。为此我花费了很多次

最佳答案

您可以检查 TextView 是否为空,将数据保存在 fragment 内的变量中,并在 onCreateView 中使用数据变量(如果已填充)并设置 TextView 文本。 像这样的事情:

// Inside the Fragment body
private SepProductModel sepProductModel;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_about_prod_prepare_base, parent, false);
    ButterKnife.bind(this, view);
    Log.e("PrepBaseProdFragment", "PrepBaseProdFragment");
    if(this.sepProductModel != null)
        text.setText(this.sepProductModel.getPROPERTY_PR_SUBSTRPREP_UA_VALUE().getTEXT());
    return view;
}

public void setDataInf(SepProductModel sepProductModel) {
     if(text != null){
         // use text 
     }
     else this.sepProductModel=sepProductModel;
}

关于java - 当fragment onCreateView时从Activity发送数据到Fragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51384338/

相关文章:

javascript - 在集成 React native 和 android 应用程序时更改 MainActivity 条目

android - 如何从android中的 Assets 中获取XML数据?

Android - FFmpeg 获取视频帧的替代方法。 (由于许可)

android - BottomSheetDialog/BottomSheetDialogFragment——使用哪个以及如何使用?

android - 即使 fragment 被隐藏,FragmentTabHost 也会触发 onCreateView

java - 尝试保留已使用毫秒参数初始化的日期时出现 MysqlDataTruncation 异常

java - 在没有根架构的情况下验证 XML

android - ViewPager getItemPosition() 从未调用过。谁应该调用它?

java - 更新字符串字段,将 mongodb 中的另一个字符串与 spring-data 连接起来

java - 有没有办法在 Java 中使 ImageIcon 的一部分变灰?