Android 片段空指针异常
Android Fragment Null pointer exception
我正在学习android开发(新手)。我想用textview向mainActivity添加一个片段并更改文本。此代码完美运行:
public class Fragment1 extends Fragment {
//@Nullable
//@Override
TextView textt;
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_fragment1, container, false);
((TextView)view.findViewById(R.id.textview)).setText("some text");
return view;
}
}
但是这段代码调用了空指针异常:
public class Fragment1 extends Fragment {
//@Nullable
//@Override
TextView textt;
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_fragment1, container, false);
textt = (TextView)view.findViewById(R.id.textview);
return view;
}
public void updateText() {
textt.setText("some text");
}
}
和:
public class Fragment1 extends Fragment {
//@Nullable
//@Override
View view;
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_fragment1, container, false);
return view;
}
public void updateText() {
((TextView)view.findViewById(R.id.textview)).setText("some text");
}
}
主要活动:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment1 frg1 = new Fragment1();
ft.replace(R.id.fragment_container, frg1);
ft.addToBackStack(null);
ft.commit();
frg1.updateText();
}
}
为什么这些代码提供不同的结果?
这里调用updateText函数的时候并没有创建textview
在您的片段中执行此类调用。不在包含片段的 activity 上。
frg1.updateText();
在片段的 onCreateView 生命周期方法被调用之前调用。您应该在设置
之后调用该方法
textt = (TextView)view.findViewById(R.id.textview);
View view = inflater.inflate(R.layout.fragment_fragment1, container, false);
textt = (TextView)view.findViewById(R.id.textview);
this.updateText();//here
return view;
查看有关 onCreateView
的 fragment lifecycle 文档
The system calls this when it's time for the fragment to draw its user interface for the first time.
加载片段时会发生这种情况,而不是在 activity 中创建片段时发生。
我正在学习android开发(新手)。我想用textview向mainActivity添加一个片段并更改文本。此代码完美运行:
public class Fragment1 extends Fragment {
//@Nullable
//@Override
TextView textt;
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_fragment1, container, false);
((TextView)view.findViewById(R.id.textview)).setText("some text");
return view;
}
}
但是这段代码调用了空指针异常:
public class Fragment1 extends Fragment {
//@Nullable
//@Override
TextView textt;
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_fragment1, container, false);
textt = (TextView)view.findViewById(R.id.textview);
return view;
}
public void updateText() {
textt.setText("some text");
}
}
和:
public class Fragment1 extends Fragment {
//@Nullable
//@Override
View view;
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_fragment1, container, false);
return view;
}
public void updateText() {
((TextView)view.findViewById(R.id.textview)).setText("some text");
}
}
主要活动:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment1 frg1 = new Fragment1();
ft.replace(R.id.fragment_container, frg1);
ft.addToBackStack(null);
ft.commit();
frg1.updateText();
}
}
为什么这些代码提供不同的结果?
这里调用updateText函数的时候并没有创建textview
在您的片段中执行此类调用。不在包含片段的 activity 上。
frg1.updateText();
在片段的 onCreateView 生命周期方法被调用之前调用。您应该在设置
textt = (TextView)view.findViewById(R.id.textview);
View view = inflater.inflate(R.layout.fragment_fragment1, container, false);
textt = (TextView)view.findViewById(R.id.textview);
this.updateText();//here
return view;
查看有关 onCreateView
The system calls this when it's time for the fragment to draw its user interface for the first time.
加载片段时会发生这种情况,而不是在 activity 中创建片段时发生。