0

TLDR:爲片段添加菜單項會導致onTabSelected被無限調用。Android中的選項卡和片段菜單是否兼容?


我在使用Android 4.0+的應用程序,並且遇到問題。我目前使用帶有製表符的ActionBar,效果很好。當我點擊一個標籤時,方法onTabSelected(Tab, FragmentTransaction)被調用一次,並且我切換屏幕上顯示的片段。下面是方法:

@Override 
public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    onTabSelected(tab, ft); 

} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    FragmentManager fragmentManager = getFragmentManager(); 
    switch(tab.getPosition()) { 
     case 0 : 
      fragmentManager.beginTransaction() 
       .replace(R.id.buttons_box, ButtonsFragment.newInstance(0)) 
       .commit(); 

      fragmentManager.beginTransaction() 
       .replace(R.id.container, ControlsFragment.newInstance(0)) 
       .commit(); 
      break; 
     case 1 : 
     ... 
     case 2 : 
     ... 
    } 
} 

的問題出現時,我想添加菜單項的片段。在ControlsFragment,我添加了以下方法:

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 
{ 
    inflater.inflate(R.menu.controls, menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    switch(item.getItemId()) 
    { 
     case R.id.control_1 : 
     Toast.makeText(getActivity(), "Clicked Control 1", Toast.LENGTH_SHORT).show(); 
     return true; 
     default : 
     return super.onOptionsItemSelected(item); 
    } 

} 

,並將此行onCreate(Bundle):只有現在

setHasOptionsMenu(true); 

,運行應用程序時,第一個選項卡被默認選中,而方法onTabSelected在我的活動中被反覆調用。爲什麼會發生?選項卡和片段菜單項不兼容?

編輯

我試圖從onTabReselected刪除調用onTabSelected,但這並沒有解決問題。

+0

他們不應該是不相容的。您使用的是什麼操作欄(原生API Level 11?AppCompat?ActionBarSherlock?)和片段(原生API Level 11?Android支持backport?)的實現?順便說一句,有沒有理由使用兩個'FragmentTransactions'而不是一個? – CommonsWare

+0

@CommonsWare我正在使用原生一切 - API 14+。至於兩個'FragmentTransactions' - 我還沒有使用'Fragment's,並且不完全熟悉它的工作原理。你會建議在第二個事務中添加'replace'行到第一個事務嗎? 「 – Phil

+0

」您會建議只將第二筆交易中的替換行添加到第一筆交易中嗎?「 - 這會更有效率。可以想象,它甚至可以幫助解決您的問題,儘管這會讓我感到驚訝。再次,問題本身讓我感到驚訝。 – CommonsWare

回答

0

這導致了各種各樣的問題,所以我找到了一個簡單的解決方法。這個簡單的黑客修復了這個奇怪的問題。

  1. 創建一個變量:

    private Tab currentTab; 
    
  2. onTabSelected頂部添加以下行:

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
        if (currentTab == null) 
         currentTab = tab; 
        else if (currentTab == tab) 
         return; 
        else 
         currentTab = tab; 
        //your code here 
    }