2015-03-28 12 views
0

Редактировать: Ответил мой собственный вопрос.NullPointerException, не может получить мой текст из моего макета

Мой текстView является нулевым, и я не понимаю, почему. Я использую личный менеджер фрагментов, возможно, это проблема. Мой идентификатор верен, потому что, если я добавлю фрагмент в основное действие и изменим текст из метода фрагмента onCreate, функция изменения текста будет работать. Что не работает, так это то, что у меня есть фрагмент, который добавлен к моей активности, я нажимаю на кнопку и подсчитываю количество времени, которое я нажимаю на нее. Затем я хочу изменить Textview моего FragmentC на «счетчик равен ..», и ТОЛЬКО тогда мое текстовое изображение равно null. Я подозреваю, что причиной этого является то, что он еще не добавлен в действие. Поэтому onCreateView на самом деле не вызывается. Как я могу это исправить? Должен ли я вызвать Fragment.OnCreateView в моей функции ответа?

Мой класс с TextView:

public class FragmentC extends Fragment { 
    TextView textView; 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragmentc, container,false); 
     //textView = (TextView) view.findViewById(R.id.txtinfo2); 
     return view; 
    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     textView = (TextView) getActivity().findViewById(R.id.txtinfo2); 
    } 

    public void changeText(String str){ 
     if(textView==null) 
      Log.e("truc", "null txt"); 
     textView.setText("jghjh"); 
    } 
} 

Log дает Txt Null

fragmentc.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#854f98be"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Fragment C" 
     android:id="@+id/txtinfo2" 
     android:layout_gravity="center_horizontal" /> 
</LinearLayout> 

Я положил остальную часть кода, потому что Я h пр мой собственный FragmentManager и может быть проблема приходит оттуда:

Мой MainActivity:

public class MainActivity extends ActionBarActivity implements Communicator{ 

    private MonFragmentManager monFragmentManager; 
    public static final String TAG="truc"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     monFragmentManager = new MonFragmentManager 
       (getSupportFragmentManager(),R.id.container,new FragmentA(),new FragmentB(), new FragmentC()); 
     monFragmentManager.add(1, false); 
    } 
    @Override 
public void respond(String data) { 
    FragmentC frag = (FragmentC) monFragmentManager.getFragments()[2]; 
    if(frag.getClass()==FragmentC.class) 
     Log.e("truc","fragment correct"); 
     //log gives "fragment correct". 
    frag.changeText(data); 
} 
} 

MyOwnFragmentManager класс:

public class MonFragmentManager { 
    private FragmentManager fm; 


    private Fragment[] fragments; 
    int container; 

    public MonFragmentManager(FragmentManager fm){ 
     this.fm = fm; 
     fragments = fm.getFragments().toArray(new Fragment[fm.getFragments().size()]); 
    } 
    public MonFragmentManager(FragmentManager fm, int container,Fragment...frags){ 
     this.fm = fm; 
     this.container=container; 
     fragments = new Fragment[frags.length]; 
     for(int i=0;i<fragments.length;i++){ 
      fragments[i]=frags[i]; 
     } 
    } 

    public void hideAllFragments(){...} 

    public void showFragment(int fragmentIndex, boolean addToBackStack) {...} 
    public void add(int fragmentIndex, boolean addToBackStack){ 
     FragmentTransaction transaction = fm.beginTransaction(); 

     for (int i = 0; i < fragments.length; i++) { 
      if (i == fragmentIndex) { 
       transaction.add(container,fragments[i]); 
      } else if(fragments[i].isAdded()) { 
       transaction.remove(fragments[i]); 
      } 
     } 
     if (addToBackStack) { 
      transaction.addToBackStack(null); 
     } 
     transaction.commit(); 
    } 
    public void removeAllFragments(){ 
     FragmentTransaction transaction = fm.beginTransaction(); 
     for(int i = 0; i < fragments.length; i++) { 
      transaction.remove(fragments[i]); 
     } 
     transaction.commit(); 
    } 
    public Fragment[] getFragments() { 
     return fragments; 
    } 
} 

ответ

0

Это безопаснее сделать findViewById() в onViewCreated метод.

Пример кода:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    textView = (TextView) view.findViewById(R.id.txtinfo2); 

Примечания:

  • С onViewCreated, The View параметр подается, то есть только намек.
  • Я понимаю, что вы используете onActivityCreated метод, потому что он запускается после onCreateView. Но я верю в свой опыт, а не из документации, что View может быть еще не готов к использованию. Вы можете проверить это поведение, повернув экран.
+0

Это не работает. На самом деле, если я сначала покажу фрагмент, textview не является нулевым. Но если фрагмент не добавлен в действие, текстовое изображение равно null. – mushmuch

+0

Вы имеете в виду код findViewById удален из onActivityCreated, и вы добавили мой предложенный код? –

0

Проблема в том, что мой фрагмент не добавлен в мою деятельность (я не определял фрагменты в макете активности). Простое исправление - просто добавить их все в макет действия и использовать hide/show вместо add/remove.

+0

Спасибо за объяснение. Однако менеджер фрагментов выглядит сложнее. Тем не менее, я думаю, что onViewCreated лучше для вашего использования, чем onActivityCreated, потому что в вашем случае активность может быть недоступна. –

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