2015-08-15 3 views
0

У меня есть Activity (MainActivity), который содержит Fragment (PlaceholderFragment) с TextView (myTextView) на нем. Я пытаюсь изменить текст TextView от MainActivity по нижеследующему кодексу, но всегда myTextView is null.Доступ к TextView в PlaceholderFragment от MainActivity

мой 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

Ваш вопрос, кажется, в неправильном понимании того, как FragmentPagerAdapter и Fragment lifecycle горе RKS.

  • Начнем с более простой вещи: фрагментов жизненного цикла. При вызове mSectionsPagerAdapter.getPlaceholde(1) вы создаете экземпляр нового фрагмента. В настоящий момент представление Фрагментов еще не создано, поэтому вы видите myTextView как null. На основе жизненного цикла фрагментов представление создается только после обратного вызова onCreateView() после присоединения фрагмента к активности. В вашем случае это никогда не произойдет, потому что вы создаете новый фрагмент (на mSectionsPagerAdapter.getPlaceholde(1)) и не прикрепляете его нигде.

  • Относительно FragmentPagerAdapter. Он создает и кэширует фрагменты для вас, поэтому вам не нужно создавать и прикреплять каждый фрагмент самостоятельно - пейджер сохранит его. Основываясь на коде, похоже, что вы хотите обновить 1-й фрагмент в пейджере при некотором выборе опции. Обратитесь к this question о том, как это сделать: основная идея заключается в том, что вам необходимо переопределить два метода из ViewPager, чтобы узнать имя фрагментов и найти его с помощью FragmentManager.findFragmentByTag().

Смежные вопросы