为什么在Fragment的onCreateView里实例化了的控件也会被提示空指针?

Zunefans 2016-08-14 11:38:44
我的是用viewpager封装了三个Fragment,其实fragment1里留了一个接口,在Mainactivity里继承,然后Mainactivity去调用fragment2里的一个公开的方法去更新,但是这个时候经常报fragment2里的控件是空指针,是什么原因?

大致代码如下:


Fragment1的:

public class fragment1 extends Fragment {
private View view;
private Button btn;
private OnItemSelectedListener mListener;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment1,container,false);

bindViews();
setListener();

return view;
}
private void bindViews(){
btn = (Button) view.findViewById(R.id.btn);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try{
mListener = (OnItemSelectedListener) context;
}catch (ClassCastException e){
throw new ClassCastException(context.toString()+" must implement the Interface");
}
}
private void setListener(){
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onSelected("1");
}
});
}
public interface OnItemSelectedListener{
void onSelected(String str);
}
}


Fragment2的:

public class fragment2 extends Fragment {
private View view;
private TextView tv;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment2,container,false);
bindViews();
return view;
}
private void bindViews(){
tv = (TextView) view.findViewById(R.id.tv);
}
public void doSomething(String str){
tv.setText(str);
}
}


Mainactivity的:

public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener, Fragment1.OnItemSelectedListener {
private MyPagerAdapter myPagerAdapter = null;
private ViewPager viewPager = null;
private final int PAGE_ONE = 0;
private final int PAGE_TWO = 1;
private final int PAGE_THREE = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onResume() {
super.onResume();
myPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setAdapter(myPagerAdapter);
viewPager.setCurrentItem(PAGE_TWO);
viewPager.setOffscreenPageLimit(3);
viewPager.addOnPageChangeListener(this);
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
public void onSelected(String str) {
Fragment2 fragment2 = (Fragment2) myPagerAdapter.getItem(PAGE_TWO);
fragment2.doSomething(str);
viewPager.setCurrentItem(PAGE_TWO);
}
}



这样的代码下,经常会在调用fragment2.doSomething(str)的时候显示空指针,有两种情况
一个是我现在这样,把findview的都写在bindViews()的函数里,它的空指针说的是view
第二个是,如果我把findview都写在onCreateView里,那么它的空指针说的就是在fragment2里调用的tv这个textview了

想知道我这样的问题的原因是什么,怎么解决?
...全文
586 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
梦境之末lol 2016-08-15
  • 打赏
  • 举报
回复
你在哪里初始化的Fragment?
Zunefans 2016-08-15
  • 打赏
  • 举报
回复
引用 3 楼 qq_31934293 的回复:
你在哪里初始化的Fragment?
在activity里用viewpager进行封装的,默认初始访问的就是fragment2
Zunefans 2016-08-15
  • 打赏
  • 举报
回复
引用 2 楼 alanjet 的回复:
楼上有理。我也感觉可能是你调用dosomething()的时候fragment的View还没初始化。生命周期的原因。
在activity里用viewpager进行封装的,默认初始访问的就是fragment2,也会导致没有初始化么?
Zunefans 2016-08-15
  • 打赏
  • 举报
回复
引用 1 楼 a81658804 的回复:
猜测是当你刚刚启动activity的时候viewpager没滑到过fragment2时view没有初始化 你可以在fragment2里的oncreateView和onCreate里你加断点看看是不是call了
我是在viewpage里设置的默认访问那个fragment2,也就是说,后面dosomething调用的就是fragment2里的,也会没有初始化?
xiaofei_java 2016-08-15
  • 打赏
  • 举报
回复
那肯定是fragment没有初始化咯~ 你调用那个方法前可以判断一下这个view初始化没有~然后在做操作~
Alan_Mo 2016-08-14
  • 打赏
  • 举报
回复
楼上有理。我也感觉可能是你调用dosomething()的时候fragment的View还没初始化。生命周期的原因。
a81658804 2016-08-14
  • 打赏
  • 举报
回复
猜测是当你刚刚启动activity的时候viewpager没滑到过fragment2时view没有初始化 你可以在fragment2里的oncreateView和onCreate里你加断点看看是不是call了

80,362

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧