简体   繁体   English

当片段处于​​onCreateView时,将数据从Activity发送到Fragment

[英]Send data from Activity to Fragment when fragment is onCreateView

Sorry for my english. 对不起我的英语不好。 I have one activity and in this activity in FragmentPagerAdapter exist 5 fragments. 我有一个活动,在FragmentPagerAdapter的此活动中,存在5个片段。 All fragments use one object model for inforation(product name, product image ...). 所有片段都使用一个对象模型进行信息传递(产品名称,产品图片...)。

My activity get data from data base. 我的活动从数据库获取数据。 And then it data send to all fragments. 然后将数据发送到所有片段。 My example 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);
        }
    }

my 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());
    }

}

My question: when i send data from activity to fragment, my view do not have time to initialize. 我的问题:当我将数据从活动发送到片段时,我的视图没有时间初始化。 In fragment line text.setText(sepProductModel.getPROPERTY_PR_SUBSTRPREP_UA_VALUE().getTEXT()); 在片段行中text.setText(sepProductModel.getPROPERTY_PR_SUBSTRPREP_UA_VALUE().getTEXT()); error 错误

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ void android.widget.TextView.setText(java.lang.CharSequence)”

Please, help me solve my problem. 请帮我解决我的问题。 I spend many times for this 我为此花了很多次

You can check if the text view is null save the data in a variable inside the fragment and in onCreateView use the data variable if it is filled and set the textview text. 您可以检查文本视图是否为null,然后将数据保存在片段内的变量中;如果已填充数据,请在onCreateView中使用数据变量并设置textview文本。 Something like this: 像这样:

// 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;
}

I can advise you to wait for your data and then show fragments to adapter, moreover all of them use the same model. 我可以建议您等待数据,然后将片段显示给适配器,而且它们都使用相同的模型。 While you dont have data, you can show progress bar. 没有数据时,可以显示进度栏。 When you have needed model, you can create instances of your fragments and set bundle arguments for them. 当需要模型时,可以创建片段的实例并为其设置捆绑参数。 You can use method like this: 您可以使用如下方法:

public static MyFragment newInstance(MyModel model){
    MyFragment fragment = new MyFragment();
    Bundle args = new Bundle();
    args.putSerializable(KEY, model);//or args.putParcelable(KEY, model);
    fragment.setArguments(args);
    return fragment;
}

Notice : your model need to implement Serializable or Parcelable to be putted in bundle. 注意 :您的模型需要实现Serializable或Parcelable放在捆绑中。 You may read about difference here . 您可以在这里阅读有关差异的信息 Then in your set data method, when you already have your model you can setup your adapter and set it to view pager, but with this approach: 然后,在设置数据方法中,当您已经有了模型时,可以设置适配器并将其设置为查看寻呼机,但是使用这种方法:

adapter.addFrag(MyFragment.newInstance(model), getString(R.string.sep_prep_base));

It have to help you, ask me if you have some questions. 它必须对您有所帮助,问我是否有任何问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM