2015-04-18 1 views
0

Я - разработчик iOS, абсолютно не имеющий опыта работы с андроидом, поэтому простите меня, если мне сложно выразить свой вопрос:Неожиданный жизненный цикл, вызывающий фатальное исключение?

Я получаю Неустранимое исключение в приложении для Android. Мне поручено поддерживать.

Fatal Exception: java.lang.RuntimeException Unable to start activity ComponentInfo{…}: java.lang.NullPointerException 

Я могу видеть из отчета аварии (прилагается ниже), что авария происходит в одном из моих фрагментов в методе, называемом «bindLocation»

Вот строка это сбой на:

  mLocationHeaderTextView.setVisibility(View.VISIBLE); 

Так что проблема в том, что mLocationHeaderTextview имеет значение null. mLocationHeaderTextView вводится с помощью roboguice следующим образом:

@InjectView(R.id.filter_location_header) 
TextView mLocationHeaderTextView; 

Теперь, я думаю, что ошибка вызвана моя TextView не будучи «впрыскивается». Посмотрев на трассировку стека, я определяю, что это, скорее всего, результат того, что onViewCreated() не получает вызов до вызова bindLocation().

Это то место, где я теряюсь. Я очень незнакома с Android, поэтому я не уверен, как возможно, что мой метод onViewCreated пропущен. Я попробовал миллион вещей на устройстве, чтобы попытаться воспроизвести эту ситуацию, но я не могу. Независимо от того, какие действия пользователя я могу придумать, мой метод onViewCreated вызывается, а моя переменная не является нулевой. Возможно, я неправильно читаю трассировку стека. Я надеюсь, что мой трассировка стека ниже предоставляет достаточно информации для y'all, чтобы помочь мне, но если нет, сообщите мне, что еще я могу рассказать вам о приложении. Я не могу опубликовать свой полный исходный код (поскольку он не принадлежит мне), но я предоставлю любую информацию, я могу.

Большое вам спасибо за помощь!

enter image description here

С моей FilterDrawerFragment:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_filter_drawer, container, false); 

    ButterKnife.inject(this, view); 

    return view; 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    mRulesHeaderReset.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      resetRules(); 
     } 
    }); 

    if (getActivity() != null && mDrawerLayout == null) { 
     mDrawerLayout = (DrawerLayout) getActivity().findViewById(R.id.filter_drawer_layout); 

     if (mDrawerLayout != null) { 
      mDrawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() { 
       @Override 
       public void onDrawerSlide(View view, float v) { 

       } 

       @Override 
       public void onDrawerOpened(View view) { 
        NavigationUtils.invalidateOptionsMenu(getActivity()); 
       } 

       @Override 
       public void onDrawerClosed(View view) { 
        notifyFiltersChanged(); 

        NavigationUtils.invalidateOptionsMenu(getActivity()); 
       } 

       @Override 
       public void onDrawerStateChanged(int i) { 

       } 
      }); 

      // set a custom shadow that overlays the main content when the drawer opens 
      mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.END); 
     } 
    } 

    mlocationChangeButton.setOnClickListener(this); 

    bindUI(); 
} 

private void bindUI() { 
    if (isAdded() && mConfiguration != null) { 

     // bind the location 
     bindLocation(); 
     … 
    } 
} 

private void bindLocation() { 
    if (isAdded() && mConfiguration != null && mConfiguration.isLocationEnabled()) { 

     // show the location related items 
     mLocationHeaderTextView.setVisibility(View.VISIBLE);//Crash reported here. 
     … 
      } 
     }); 

    } 
} 


/** 
* Users of this fragment must call this to update the filter configuration 
*/ 
public void updateConfiguration(FilterConfiguration configuration) { 
    if (configuration != null && !configuration.equals(mConfiguration)) { 
     mConfiguration = configuration; 

     bindUI(); 
    } 
} 

И updateConfiguration() вызывается из LocationFinderFragment:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    if (getArguments() != null) { 
      ……… 
    if (savedInstanceState == null) { 
     mFilterDrawerFragment = FilterDrawerFragment.newInstance(); 
     getChildFragmentManager() 
       .beginTransaction() 
       .replace(R.id.filter_drawer, mFilterDrawerFragment) 
       .commit(); 

    } else { 
     mFilterDrawerFragment = (FilterDrawerFragment) getChildFragmentManager().findFragmentById(R.id.filter_drawer); 
    } 

    ………   
); 
    ………………… 
    populateFilters(); 
} 


private void populateFilters() { 
    // these might be passed into the fragment 
    if (mFacets != null) { 
     FilterConfiguration config = new FilterConfiguration() {{ 
     …………………… 
     }}; 

     mFilterDrawerFragment.updateConfiguration(config); 
+0

попробуйте, если (mLocationHeaderTextView! = Null) mLocationHeaderTextView.setVisibility (View.VISIBLE); Дайте мне знать, если это решит проблему. –

+0

Я знаю, как проверить нулевые переменные, но я действительно не пытаюсь исправить тот факт, что эта переменная имеет значение null, я пытаюсь понять, что вызывает ее значение null. –

+0

Я предполагаю, что он рушится, когда вы пытаетесь сохранить состояние? –

ответ

0

Теперь я думаю, что я вижу проблему.

  1. В изображениях roboguice вводятся в onViewCreated().
  2. onViewCreated() вызывается после onCreateView().
  3. bindLocation() вызывается в onCreateView().

Следовательно, к этому времени виды еще не впрыскиваются roboguice.

Попробуйте позвонить bindLocation() в onViewCreated() после звонка на номер super.

+0

Я добавил методы onCreateView() и onViewCreated() в мой вопрос выше. bindLocations вызывается в onViewCreated() –

+0

Итак, вы также используете butterknife в том же проекте? В этом случае, какая библиотека вставляет ваши фрагменты в фрагмент? Я бы сказал, что одна библиотека инъекций слишком много для начала, но две с теми же именами аннотаций ... Чей @InjectView используется в текстовом виде? – AndroidEx

+0

Я бы не использовал библиотеки для инъекций, если бы это зависело от меня, но я беру на себя этот (очень большой) проект, поэтому у меня нет выбора. Во всяком случае, @injectView - ButterKnife. Я добавил еще немного кода выше. Надеюсь, это поможет! –

0

Вот как я это исправил. Когда вы используете ButterKnife. Без этой конфигурации ButterKnife выбрасывает NPE.

Перед тем, как использовать эту библиотеку, вы должны сделать некоторые настройки в ButterKnife Eclipse Configuration или ButterKnife Android Studio Configuration

Если вы используете ADT и отсутствует Annototion Обработка Проверьте это установить Android Eclipse - Cannot see annotation processing option

Счастливый кодирования ... :)

 Смежные вопросы

  • Нет связанных вопросов^_^