Butter Knife - получение нулевого указателя в автономном режиме, но работающее в сети

Я использую 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)

person Shailendra Madda    schedule 17.04.2017    source источник
comment
onCreate вызывается перед onCreateView, поэтому вызовите свой метод getInfo() в onCreateView сразу после привязки представлений   -  person Burhanuddin Rashid    schedule 17.04.2017
comment
а он нормально работает когда в онлайне нет?   -  person Shailendra Madda    schedule 17.04.2017
comment
Здесь я хочу загрузить данные только один раз, если сеть доступна, поэтому я вызываю ее в onCreate.. в противном случае она загружается каждый раз, если я вызываю ее в onCreateView   -  person Shailendra Madda    schedule 17.04.2017
comment
Он работает нормально, потому что для его выполнения isOnline требуется некоторое время, в то время как в это время представление привязано, поэтому его рабочий метод isOnline   -  person Burhanuddin Rashid    schedule 17.04.2017
comment
onCreateView также вызывается только один раз   -  person Burhanuddin Rashid    schedule 17.04.2017
comment
@BurhanuddinRashid Нет, здесь, когда я вызываю этот getInfo() в onCreateView, он звонил каждый раз, когда я перемещался между вкладками..   -  person Shailendra Madda    schedule 17.04.2017
comment
вам нужно вызвать setoffscreenpagelimit()... на странице просмотра, чтобы предотвратить воссоздание представления фрагмента...   -  person rafsanahmad007    schedule 17.04.2017
comment
эй спасибо все работает   -  person Shailendra Madda    schedule 17.04.2017


Ответы (2)


Вы вызываете getInfo() из onCreate(), но Butterknife выполняет привязку только в onCreateView(), который вызывается системой после onCreate(). Таким образом, myTextView не инициализируется, когда вы обращаетесь к нему в getInfo().

Переместите getInfo() в onCreateView() после Butterknife.bind(), и все должно работать нормально.

person Ridcully    schedule 17.04.2017

Из документации

ПРИВЯЗКА НЕДЕЯТЕЛЬНОСТИ

Вы также можете выполнить привязку к произвольным объектам, указав свой собственный корень представления.

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"); возвращает нулевое представление

По поводу работы в режиме onLine:

if(isOnline(getActivity())) 

этот метод займет некоторое время, в то время как представление создается в вашем fragment, а также выполняется ButterKnife.bind(this, view);.

ИЗМЕНИТЬ

используйте setOffscreenPageLimit() в своем пейджере, чтобы избежать повторного создания фрагмента каждый раз.

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
person rafsanahmad007    schedule 17.04.2017
comment
Привет! добро пожаловать в stackOverflow! если ответ поможет, отметьте его как правильный, нажав на галочку рядом с ответом!! - person rafsanahmad007; 18.04.2017