Доступ к TextView в PlaceholderFragment из MainActivity
У меня есть 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;
}
}
}
1 ответ
Похоже, ваша проблема в неправильном понимании того, как работает жизненный цикл FragmentPagerAdapter и Fragment.
Давайте начнем с более простой вещи: жизненного цикла фрагментов. Когда звоните
mSectionsPagerAdapter.getPlaceholde(1)
Вы создаете новый экземпляр фрагмента. На данный момент вид фрагментов еще не создан, поэтому вы наблюдаетеmyTextView
как ноль. Основываясь на жизненном цикле фрагментов, представление создается только после обратного вызова onCreateView() после того, как фрагмент прикрепляется к действию. В вашем случае это никогда не произойдет, потому что вы создаете новый фрагментmSectionsPagerAdapter.getPlaceholde(1)
) и никуда его не прикреплять.относительно
FragmentPagerAdapter
, Он создает и кэширует фрагменты для вас, поэтому вам не нужно создавать и прикреплять каждый фрагмент самостоятельно - пейджер сохранит его. Исходя из кода, похоже, что вы хотите обновить 1-й фрагмент в пейджере при выборе какой-либо опции. Обратитесь к этому вопросу о том, как это сделать: основная идея заключается в том, что вам нужно переопределить два метода изViewPager
чтобы узнать имя фрагмента и найти его с помощью FragmentManager.findFragmentByTag ().