1

我有一个Activity( MainActivity) ,其中包含一个Fragment( PlaceholderFragment) 和一个TextView( myTextView) 。我尝试通过下面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;
        }
    }

}
4

1 回答 1

0

您的问题似乎是对FragmentPagerAdapterFragment 生命周期如何工作的理解不正确。

  • 让我们从更基本的事情开始:片段生命周期。调用时mSectionsPagerAdapter.getPlaceholde(1),您正在创建新的片段实例。此时 Fragments 的视图尚未创建,因此您观察myTextView为 null。根据片段的生命周期,只有在片段附加到活动后的onCreateView()回调之后才会创建视图。在您的情况下,这将永远不会发生,因为您正在创建新片段(by mSectionsPagerAdapter.getPlaceholde(1))并且没有将其附加到任何地方。

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

于 2015-08-21T00:15:29.237 回答