1

我有一個ViewPager與3片段。我可以選擇性地設置操作欄菜單選項,僅用於我想要的片段。如何在僅在特定片段上可見的ViewPage的操作欄上添加導航列表?

同樣,我想通過操作欄中的微調器提供導航列表。在這裏再次,導航列表應該只出現在ViewPager的片段之一,而不是所有的片段。但是我的嘗試失敗了。導航列表出現在操作欄中,但保留所有片段。

下面是我在ViewPager中使用的片段之一。我希望導航列表僅在我滑動此片段時出現。

public class TransactionsFragment extends SherlockFragment implements 
    ActionBar.OnNavigationListener{ 

    private ActionBar mActionBar; 

    @SuppressLint("NewApi") 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     ViewGroup rootView = (ViewGroup) inflater.inflate(
       R.layout.fragment_transactions, container, false); 

     // Set up the action bar to show a dropdown list 
     mActionBar = getActivity().getActionBar(); 
     mActionBar.setDisplayShowTitleEnabled(false); 
     mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 

     final String[] dropdownValues = {"Test","Old"}; 

    // Specify a SpinnerAdapter to populate the dropdown list 

     ArrayAdapter<String> adapter = null; 
     if(android.os.Build.VERSION.SDK_INT >= 14) { 
      adapter = new ArrayAdapter<String>(mActionBar.getThemedContext(), 
        android.R.layout.simple_spinner_item, android.R.id.text1, 
        dropdownValues); 
     } else { 
      adapter = new ArrayAdapter<String>(getActivity().getBaseContext(), 
        android.R.layout.simple_spinner_item, android.R.id.text1, 
        dropdownValues); 
     } 

     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

     // Set up the dropdown list navigation in the action bar. 
     mActionBar.setListNavigationCallbacks(adapter, this); 

     return rootView; 
    } 

如何限制導航列表僅在該片段可見時出現?

回答

1

Fragment#setUserVisibleHint(boolean isVisibleToUser)將在片段變得可見/不可見時觸發。

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 
    if (isVisibleToUser) { 
     // enable action bar list navigation 
    } else { 
     // disable action bar list navigation 
    } 
} 
+0

如何啓用它? –

2

我和OP有相同的需求,並使用Matthias建議的方法,以及來自其他來源的位。對於我來說,作爲Android的新手,這是一個挑戰。我將提供更多細節,這可能對通過搜索到達此處的其他人有所幫助。

這個的所有代碼都在顯示導航微調器的一個Fragment中。其他片段沒有混亂。

private ActionBar actionBar; 


public void onResume() { 
    super.onResume(); 

    if(actionBar==null) { 

     actionBar = getActivity().getActionBar(); 

     // get spinner items defined in values/strings/dropdown 
     final String[] dropdownValues = getResources().getStringArray(R.array.dropdown); 

     // set up the actionbar appearance 
     actionBar.setDisplayShowTitleEnabled(false); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 

     // Specify a SpinnerAdapter to populate the dropdown list. 
     ArrayAdapter<String> aAdapter = new ArrayAdapter<String>(actionBar.getThemedContext(), 
       android.R.layout.simple_spinner_item, android.R.id.text1,dropdownValues); 

     aAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

     // setup for callbacks to detect item selection 
     actionBar.setListNavigationCallbacks(aAdapter, this); 
    } 
} 

@Override 
public boolean onNavigationItemSelected(int itemPosition, long itemId) { 

    //System.err.println("Spinner selection: " + itemPosition); 
    //do stuff based on itemPosition 

    return false; 
} 

最後,用於打開和關閉導航微調更完整的代碼:

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 

    if (actionBar!=null) { 
     if (isVisibleToUser) { 
      actionBar.setDisplayShowTitleEnabled(false); 
      actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
     } 
     else { 
      actionBar.setDisplayShowTitleEnabled(true); 
      actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 
     } 
    } 
} 

編輯:另外,片段必須實現ActionBar.OnNavigationListener,像這樣...

public class DisplayStuffFragment extends Fragment implements ActionBar.OnNavigationListener { 

... 
} 
相關問題