繁体   English   中英

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

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

对不起我的英语不好。 我有一个活动,在FragmentPagerAdapter的此活动中,存在5个片段。 所有片段都使用一个对象模型进行信息传递(产品名称,产品图片...)。

我的活动从数据库获取数据。 然后将数据发送到所有片段。 我的示例活动:

           @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);
        }
    }

我的片段

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

}

我的问题:当我将数据从活动发送到片段时,我的视图没有时间初始化。 在片段行中text.setText(sepProductModel.getPROPERTY_PR_SUBSTRPREP_UA_VALUE().getTEXT()); 错误

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ void android.widget.TextView.setText(java.lang.CharSequence)”

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

您可以检查文本视图是否为null,然后将数据保存在片段内的变量中;如果已填充数据,请在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;
}

我可以建议您等待数据,然后将片段显示给适配器,而且它们都使用相同的模型。 没有数据时,可以显示进度栏。 当需要模型时,可以创建片段的实例并为其设置捆绑参数。 您可以使用如下方法:

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

注意 :您的模型需要实现Serializable或Parcelable放在捆绑中。 您可以在这里阅读有关差异的信息 然后,在设置数据方法中,当您已经有了模型时,可以设置适配器并将其设置为查看寻呼机,但是使用这种方法:

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

它必须对您有所帮助,问我是否有任何问题。

暂无
暂无

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

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