我是Android新手。
我已经阅读了线程并尝试了各种解决方案,但没有一个对我有用。这就是我的工作原理。
public class Tab1 extends Fragment {
TextView mTextView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.tab1, container, false);
mTextView = (TextView)rootView.findViewById(R.id.myTextView1);
mTextView.setText("This works"); //This works fine
return rootView;
}
}
这将使用“This works”字样更新TextView。
但是,当我尝试使其更灵活,以便我可以在应用程序运行时更新它时,我失败了这个错误:
java.lang.NullPointerException:尝试在空对象引用上调用虚方法'void android.widget.TextView.setText(java.lang.CharSequence)' 在com.example.schoolproject.tabs.Tab1.changeText(Tab1.java:29)
public class Tab1 extends Fragment {
TextView mTextView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.tab1, container, false);
mTextView = (TextView)rootView.findViewById(R.id.myTextView1);
return rootView;
}
public void changeText(String mText) {
mTextView.setText(mText);
}
}
它甚至不让我编译。如果我注释掉mTextView.setText(mText)行,那么它将编译。为什么.setText()会触发此错误?我的目标是从我的MainActivity更新TextView,如下所示:
Tab1 tab1 = new Tab1();
tab1.changeText("Please Update This Text");
谢谢!
答案 0 :(得分:0)
onCreate of Fragment是一个生命周期事件,当您使用new实例化Tab1时不会执行。
您必须等到创建它才能调用changeText。
人:
将String作为参数(Bundle和setArguments),这样就可以获得onCreateView(getArguments()。getString(KEY))
OR:
将其存储为changeText中的变量并设置为onCreate。这种做法是一种糟糕的实践,因为如果需要它就无法重建,失去它的价值。