Butter Knife-离线时获取空指针但在线时工作

Butter Knife- Getting null pointer when in offline but working when online

我正在使用 Butter Knife 在我的应用程序 Fragment 中绑定视图,但是当应用程序没有互联网连接但在线时工作正常时我得到空点异常。不知道为什么会这样。任何人都可以告诉我。提前致谢..

这就是我在代码中使用它的方式..

public class MyFragment extends Fragment {

    @BindView(R.id.myTextView)
    TextView myTextView;

    public MyFragment() {

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Home");

        getInfo();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_about_us, container, false);
        ButterKnife.bind(this, view);

        return view;
    }

    private void getInfo () {
        if(isOnline(getActivity())) {
        // Do some thing

        myTextView.setText("Hi");

        } else {
        // do some thing

        myTextView.setText("Hello");

        }
    }

}

日志:

FATAL EXCEPTION: main
 java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
                                                                                at butterknife.internal.Utils.findRequiredView(Utils.java:87)
                                                                                at butterknife.internal.Utils.findRequiredViewAsType(Utils.java:104)

来自Documentation

非ACTIVITY绑定

您还可以通过提供自己的视图根来对任意对象执行绑定。

public class FancyFragment extends Fragment {
  @BindView(R.id.button1) Button button1;
  @BindView(R.id.button2) Button button2;

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fancy_fragment, container, false);
    ButterKnife.bind(this, view);
    // TODO Use fields...
    return view;
  }
}

您正在 onCreate() 中调用 getInfo();,在 onCreateView()

之前调用片段生命周期

片段生命周期

所以你的 myTextView.setText("Hello"); returns 无效视图

关于在联机模式下工作:

if(isOnline(getActivity())) 

此方法会消耗一些时间,同时在您的 fragment 中创建视图并执行 ButterKnife.bind(this, view);

编辑

在您的 viewpager 中使用 setOffscreenPageLimit() 以避免每次都重新创建片段。

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);

您正在从 onCreate() 调用 getInfo(),但 butterknife 仅在 onCreateView() 中执行绑定,该绑定由系统 after onCreate()。所以 myTextView 没有初始化,当你在 getInfo().

中访问它时

Butterknife.bind() 之后将 getInfo() 移动到 onCreateView() 中,它应该可以正常工作。