从MainActivity访问PlaceholderFragment中的TextView

时间:2015-08-15 08:08:18

标签: android fragment tabbed

我有一个ActivityMainActivity),其中包含一个FragmentPlaceholderFragment),其中包含TextViewmyTextView)。我尝试通过以下代码从TextView更改MainActivity的文字,但始终myTextViewnull

我的MainActivity课程:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
     int id = item.getItemId();

    if (id == R.id.action_settings) {

          PlaceholderFragment myPlace =   mSectionsPagerAdapter.getPlaceholde(1);
          myPlace.setText("New Text");
          return true;
    }

    return super.onOptionsItemSelected(item);
}

我的SectionsPagerAdapter课程:

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {

        return PlaceholderFragment.newInstance(position + 1);
    }

    @Override
    public int getCount() {
        return 4;
    }

    public PlaceholderFragment getPlaceholde(int position) {

      return PlaceholderFragment.newInstance(position);
    }
}

我的PlaceholderFragment课程:

 public static class PlaceholderFragment extends Fragment {

        private static final String ARG_SECTION_NUMBER = "section_number";
        TextView myTextView;

        public static PlaceholderFragment newInstance(int sectionNumber) {
            PlaceholderFragment fragment = new PlaceholderFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            return fragment;
        }

        public PlaceholderFragment() {

        }

        public void setText(String s){

            if(myTextView!=null) {
                myTextView.setText(s);
            }else{
                Log.w("myTextView","NULL");    // problem is here: that this line is always launched
            }

        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {

            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            myTextView =  (TextView)rootView.findViewById(R.id.section_label);
            myTextView.setText("some text");//work well
            return rootView;
        }
    }

}

1 个答案:

答案 0 :(得分:0)

您的问题似乎是对FragmentPagerAdapterFragment lifecycle工作原理的错误理解。

  • 让我们从更基本的东西开始:片段生命周期。 致电mSectionsPagerAdapter.getPlaceholde(1)时,您正在创建新的片段实例。此刻碎片'视图尚未创建,因此您将myTextView视为null。基于碎片'生命周期视图只有在片段附加到活动后onCreateView()回调后才会创建。在您的情况下,这将永远不会发生,因为您正在创建新的片段(mSectionsPagerAdapter.getPlaceholde(1))而不是将其附加到任何地方。

  • 关于FragmentPagerAdapter。它为您创建和缓存片段,因此您不需要自己创建和附加每个片段 - 寻呼机将保留它。根据代码,您可能希望在某些选项选择中更新寻呼机中的第一个片段。有关如何操作,请参阅this question:基本的想法是,您需要覆盖ViewPager中的两个方法,以便了解片段名称并能够使用FragmentManager.findFragmentByTag()找到它。