1

Использование приложения, в котором используются несколько фрагментов, и следующий код для извлечения выбранной позиции фрагмента.GetTag of Fragment возвращает нулевую ссылку на объект

private BaseFragment getSelectedFragment(FragmentManager fragmentManager) 
    { 
     int item = getModel().getSelectedItem();//0th position last 
     String tag = String.valueOf(item); 
     BaseFragment fragment = (BaseFragment) fragmentManager.findFragmentByTag(tag); //error shown at this line 
     return fragment; 
    } 

и вызов метода выше из

public boolean onBackPressed() 
{ 
    FragmentManager fragmentManager = activity.getFragmentManager(); 
    BaseController fragmentController =    getSelectedFragment(fragmentManager).getController(); 
} 

и разбился из-за следующие ошибки

java.lang.NullPointerException: Попытка вызвать виртуальный метод «java.lang.String xxx.android .fwk.app.fragment.BaseFragment.getTag() 'в отношении нулевого объекта refrence.

замены фрагмента, используя следующий код

private void displaySelectedFragment() 
    { 

     FragmentManager fragmentManager = getFragmentManager(); 
     if (fragmentManager.getBackStackEntryCount() > 0) { 
      // pop any inner fragments that have been added. 
      fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     } 

     // get the selected item position 
     int selectedItem = model.getSelectedDrawerItem().getItemId(); 

     String tag = String.valueOf(selectedItem); 
     Bundle extras = model.getExtras(); 

     BaseFragment newFragment = NomadFragmentManager.getInstance().getFragment(selectedItem, extras); 
     if (newFragment != null) { 
      FragmentTransaction ft = fragmentManager.beginTransaction(); 
      ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
      ft.replace(R.id.container, newFragment, tag); 
      ft.commit(); 
     } 
    } 

Итак, что фактическая причина проблемы? копаясь в этом коде. Любая помощь в значительной степени. Заранее спасибо

+0

При замене фрагмента вы даете «тег» фрагменту или нет? –

+0

@SurenderKumar: да, проверяя тег при замене фрагмента, обновленный ответ с заменяющим код кодом. – Swift

+0

Можете ли вы добавить код, из которого вы вызываете этот метод. Потому что может быть менеджером фрагментов. –

ответ

1

Цитируя Document

Заменить существующий фрагмент, который был добавлен в контейнер. Это , по существу, то же самое, что и вызов remove (Fragment) для всех в настоящее время добавлены фрагменты, которые были добавлены с помощью того же containerViewId, а затем add (int, Fragment, String) с теми же аргументами, приведенными здесь.

Замена Fragment полностью удалит его из задней стопки. Итак, если вы пытаетесь получить Tag после транзакции другим Fragment, тогда он будет недоступен. Вы должны добавить Fragment s в задний стек, используя addToBackStack(tagName).

+0

спасибо за предложение. глубину проблемы, о которой вы говорили. – Swift

+0

, добавляя addTobackstack (тег) перед фиксацией, разрешенную проблему – Swift

+0

, пожалуйста. Рад знать, что это помогло –

0

Из вашего журнала сбоев, похоже, это не номер строки, где вы получаете сообщение об аварии. Сбой вызван вызовом getTag() из нулевого фрагмента. Может быть, после того, как этот метод вернет null, а затем вы используете этот экземпляр фрагмента, который дает исключение из null-указателя.

BaseFragment fragment = (BaseFragment) fragmentManager.findFragmentByTag(tag); 
if(fragment != null){ 
    return fragment. 
} 
return null; 

Может поставить отладки точку в fragment != null может прояснить проблему.

UPDATE

После обновления вашего кода, вы не должны получить какой-либо пустой указатель дальше. но вы должны поместить журнал для проверки того, что он становится нулевым или нет.

+0

bpr10: Я добавил комментарий, где номер строки показывает, и попытается отложить отладку, но какова фактическая причина этой проблемы? – Swift

+0

Я добавил журнал под этой строкой, фрагмент BaseFragment = (BaseFragment), фрагментManager.findFragmentByTag (тег); и последний фрагмент.getTag показывает 0-ю позицию и приложение разбилось драматически !!!! – Swift

+0

Не могли бы вы обновить полный код в своем вопросе. – bpr10

0

Для вышеуказанной проблемы, как описано выше, Фрагмент идет как null.

Так,

BaseFragment frag = getSelectedFragment(fragmentManager); 
if(frag == null) return true; 
BaseController fragmentController = frag.getController(); 

Решенный вопрос, поставив проверки нулевой ссылки.

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