我有一个Activity
(MainActivity
),其中包含一个Fragment
(PlaceholderFragment
),其中包含TextView
(myTextView
)。我尝试通过以下代码从TextView
更改MainActivity
的文字,但始终myTextView
为null
。
我的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;
}
}
}
答案 0 :(得分:0)
您的问题似乎是对FragmentPagerAdapter和Fragment lifecycle工作原理的错误理解。
让我们从更基本的东西开始:片段生命周期。
致电mSectionsPagerAdapter.getPlaceholde(1)
时,您正在创建新的片段实例。此刻碎片'视图尚未创建,因此您将myTextView
视为null。基于碎片'生命周期视图只有在片段附加到活动后onCreateView()回调后才会创建。在您的情况下,这将永远不会发生,因为您正在创建新的片段(mSectionsPagerAdapter.getPlaceholde(1)
)而不是将其附加到任何地方。
关于FragmentPagerAdapter
。它为您创建和缓存片段,因此您不需要自己创建和附加每个片段 - 寻呼机将保留它。根据代码,您可能希望在某些选项选择中更新寻呼机中的第一个片段。有关如何操作,请参阅this question:基本的想法是,您需要覆盖ViewPager
中的两个方法,以便了解片段名称并能够使用FragmentManager.findFragmentByTag()找到它。