实例化后在片段上访问TextView时的NPE

时间:2018-03-14 21:07:25

标签: android android-fragments

我是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");

谢谢!

1 个答案:

答案 0 :(得分:0)

onCreate of Fragment是一个生命周期事件,当您使用new实例化Tab1时不会执行。

您必须等到创建它才能调用changeText。

人:

将String作为参数(Bundle和setArguments),这样就可以获得onCreateView(getArguments()。getString(KEY))

OR:

将其存储为changeText中的变量并设置为onCreate。这种做法是一种糟糕的实践,因为如果需要它就无法重建,失去它的价值。