1

使用一個應用程序,其中使用多個片段,並使用 以下代碼來獲取片段的選定位置。片段GetTag返回空對象參考

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()'在空對象引用上。

通過使用下面的代碼

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

有啥實際問題的原因更換一個片段?挖掘到這個代碼。 任何幫助很appriciated。 在此先感謝

+0

雖然替換片段,你正在給一個'標籤'片段或不? –

+0

@SurenderKumar:是的,在替換片段時證明標籤,用片段替換代碼更新答案。 – Swift

+0

您可以從調用此方法的位置添加代碼。因爲可能是片段管理器即將空。 –

回答

1

Document

報價替換被添加到容器中的現有片段。這是 基本上與爲所有當前所有 調用remove(Fragment)相同的containerViewId添加片段,然後使用此處給定的相同參數add(int,Fragment,String)添加片段相同。

替換Fragment將完全將其從堆棧中刪除。因此,如果您在與其他Fragment交易後嘗試檢索Tag,那麼它將不可用。您應該使用 addToBackStack(tagName)Fragment添加到背堆棧。

+0

感謝您的建議。你提到的問題的深度。 – Swift

+0

在提交前添加addTobackstack(標籤)解決了 – Swift

+0

的問題,歡迎大家使用。很高興知道它有幫助 –

0

從您的崩潰日誌,它似乎這不是你遇到崩潰的行號。崩潰是由於從空片段調用getTag()所致。也許在這個方法返回null之後,你正在使用那個給出空指針異常的片段實例。

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

也許把調試點放在fragment != null可能會說明您的問題。

UPDATE

代碼更新後,你不應該再獲得任何空指針。但你應該寫一個日誌來檢查它是否爲空。

+0

bpr10:我在行號顯示的地方添加了一個註釋,並嘗試進行調試,但是這個問題的實際原因是什麼? – Swift

+0

我在這行下面添加了一條日誌,BaseFragment fragment =(BaseFragment)fragmentManager.findFragmentByTag(tag);最後fragment.getTag顯示第0位,應用程序崩潰!!!! – Swift

+0

您可以請更新您的問題中的完整代碼。 – bpr10

0

對於上述問題,如上所述,片段即將爲空。

所以,

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

通過把的空引用檢查解決了這個問題。