nflater.inflate() 获取),可以使用该对象来使用findViewById()。
然后我最先使用了在onCreateView使用了getActivity()来使用findViewById():getActivity().findViewById()。然后写了一个监听器,结果程序运行就报错,报错的地方就是监听器的第一行。
然后写写了下面的代码:
public class NewsFragment extends Fragment{
private Button mybutton;
private TextView textview;
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// TODO Auto-generated method stub
view=inflater.inflate(R.layout.news,container,false);
textview = (TextView) getActivity().findViewById(R.id.head_themes);
mybutton = (Button) getActivity().findViewById(R.id.mybutton);
mybutton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
textview.setText("按下了按钮了");
}
});
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
}
}
后来怀疑是不是应为getActivity()在onCreateView中不能使用,或者不能在onCreateView中设置监听器类,后来将监听器都放到了onActivityCreated()中,但是还是不行,最后是放弃使用了getActivity(),该用getView()后来就行了。
下面的代码是对getActivity()和在ragment生命周期之间的关系研究:
public class NewsFragment extends Fragment{
private TextView textview;
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// TODO Auto-generated method stub
view=inflater.inflate(R.layout.news,container,false);
textview = (TextView) getActivity().findViewById(R.id.head_themes);
if(getActivity() == null)
Log.i("onCreateView","activity is null");
else {
Log.i("onCreateView", "activity is not null");
}
if(textview == null)
Log.i("onCreateView","textview is null");
else {
Log.i("onCreateView", "textview is not null");
}
return view;
}
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
textview = (TextView) getActivity().findViewById(R.id.head_themes);
if(getActivity() == null)
Log.i("onAttach","activity is null");
else {
Log.i("onAttach", "activity is not null");
}
if(textview == null)
Log.i("onAttach","textview is null");
else {
Log.i("onAttach", "textview is not null");
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
textview = (TextView) getActivity().findViewById(R.id.head_themes);
if(getActivity() == null)
Log.i("onActivityCreated","activity is null");
else {
Log.i("onActivityCreated", "activity is not null");
}
if(textview == null)
Log.i("onActivityCreated","textview is null");
else {
Log.i("onActivityCreated", "textview is not null");
}
}
}
上面的代码是分别在测试fragment三个生命周期内(onAttach, onCreateView, onActivityCreated)使用getActivity()和获取view控件。分别判断getActivity()和textview是否为空,其结果如下:
11-04 21:30:40.593: I/onAttach(3899): activity is not null
11-04 21:30:40.593: I/onAttach(3899): textview is null
11-04 21:30:40.601: I/onCreateView(3899): activity is not null
11-04 21:30:40.601: I/onCreateView(3899): textview is null
11-04 21:30:40.603: I/onActivityCreated(3899): activity is not null
11-04 21:30:40.603: I/onActivityCreated(3899): textview is not null
很明显,在onAttach, onCreateView, onActivityCreated中getActivity()都不为空,即都可以获取到activity对象,但是在onActivityCreated前,textview都为空,就是说通过getActivity()获取指定view控件不可行。既然getActivity()不为空,但不能通过getActivity()获取,最可能就是activity和fragment的view对象之间还没连接,从而无法通过activity来获取对象。
然后试了一下将获取元素的的操作放到了onActitityCreated中,也可以。所以猜测应该是在onActivityCreated调用之前(onCreateView在onActivityCreated之前被调用)activity和fragment还没有相关联,所以fragment中的控件对象不能使用activity对象来获取,只能使用fragment对应的view对象来获取。而在onActivityCreated调用的时候,activity才与fragment关联,所以这是才能使用getActivity返回的activity对象使用findViewById。