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

时间:2017-04-17 06:32:43

标签: android butterknife

我正在使用Butter Knife绑定我的应用片段中的视图,但是当应用没有互联网连接但在线时工作正常时,我得到零点异常。不知道为什么会这样发生..任何人都有任何想法让我知道。提前谢谢..

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

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)

2 个答案:

答案 0 :(得分:3)

来自Documentation

非活动绑定

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

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;
  }
}

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

之前在片段生命周期中调用了myTextView.setText("Hello");

片段生命周期

enter image description here

所以你的if(isOnline(getActivity())) 会返回空视图

关于在onLine模式下工作:

fragment

此方法会消耗一些时间,同时视图会在ButterKnife.bind(this, view);中创建,setOffscreenPageLimit()也会被执行。

修改

在viewpager中使用mViewPager = (ViewPager)findViewById(R.id.pager); mViewPager.setOffscreenPageLimit(2); ,以避免每次都重新创建片段。

JSONParser parser = new JSONParser();
        JSONObject infoJSON = (JSONObject) parser.parse(new FileReader(new File("resources/abc.json")));                
 for(int j=0; infoJSON.size(); j++){
     for(int i=0 ;i< infoJSON.get(j).size(); i++){          
        JSONObject innerJSON = (JSONObject) infoJSON.get(j);            
        System.out.println(innerJSON.keySet());
    }
 }

答案 1 :(得分:1)

您正在从getInfo()拨打onCreate(),但是butterknife正在onCreateView()执行绑定,系统在{/ strong> onCreate()之后调用。因此,当您在myTextView中访问getInfo()时,getInfo()未初始化。

Butterknife.bind()之后将<input id="contractor-submit" type="submit" value="Send" onmouseup="formSubmit12(14)" style="display:none;"> 移动到onCreateView()上,它应该可以正常工作。