Редактировать: Ответил мой собственный вопрос.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;
}
}
Это не работает. На самом деле, если я сначала покажу фрагмент, textview не является нулевым. Но если фрагмент не добавлен в действие, текстовое изображение равно null. – mushmuch
Вы имеете в виду код findViewById удален из onActivityCreated, и вы добавили мой предложенный код? –