2012-03-01 87 views
11

我開發Android 3+Android操作欄,onNavigationItemSelected

在我的行動吧,我有一個下拉列表(見how to hide/unhide the actionbar list on android 3?的下拉我打算)。問題是我需要在用戶選擇某些內容時執行某些操作,但Android會在繪製視圖時調用onNavigationItemSelected(),因此實際上沒有發生選擇。

我該如何檢測用戶是否真的按了一些東西,而不是來自android的假電話?

public class ListDittaListener implements OnNavigationListener{ 

    private BaseActivity activity; 

    private ListDittaListener() 
    { 

    } 

    public ListDittaListener(BaseActivity activity) 
    { 
     this.activity = activity; 
    } 

    @Override 
    public boolean onNavigationItemSelected(int itemPosition, long itemId) 
    { 
     MyApp appState = ((MyApp)this.activity.getApplicationContext()); 
     appState.setDittaSelezionata((int) itemId); 

     SharedPreferences settings = this.activity.getSharedPreferences(MyApp.PREFS_NAME, 0); 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putInt("ditta_id_selezionata", (int) itemId); 

      ////////restart activity this.activity.recreate(); 

     return false; 
    } 

} 

回答

16

你可以很容易忽略到onNavigationItemSelected第一個電話,如果你喜歡:

public class Whatever implements OnNavigationListener { 
    private boolean synthetic = true; 

    @Override 
    public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
     if (synthetic) { 
      synthetic = false; 
      return true; 
     } 

     // do whatever you really wanted here 
    } 
} 
+1

謝謝,但就像我在賞金描述中寫道的,「我想避免使用計數器和忽略第一個電話「,這看起來更像是一個黑客,我想弄清楚爲什麼發生在第一個地方 – max4ever 2012-03-14 08:15:40

+3

我有同樣的問題,這是非常惱人的黑客這樣。這種行爲有目的嗎? – 2012-08-15 21:51:10

+0

我使用此解決方案來防止碎片不必要地在屏幕方向改變並丟失其狀態時重新創建兩次。請參閱[這裏](http://stackoverflow.com/a/14295474/963396)。 – 2013-01-12 17:24:35

0

嗯,我看不出你的當前代碼有什麼問題。

你是如何創建你的下拉元素的。在創建視圖後,由Android「選擇」什麼元素。你在執行ActionBar初始化的onCreate方法時做了些什麼。

我做了如下指示和它的工作對我來說: http://developer.android.com/guide/topics/ui/actionbar.html#Dropdown

+0

它「選擇」下拉列表元素的第一項,onCreate我通常只是調用其他鏈接問題的代碼(基本上只是action_bar.setNavigationMode和action_bar.setListNavigationCallbacks) – max4ever 2012-03-07 10:05:30

+0

Mhh從視角來看,您做的一切都是正確的。你在旋轉你的屏幕嗎?我在這裏發現了一個類似的問題:http:// stackoverflow。com/questions/9039045/how-to-set-active-item-in-the-action-bar-drop-down-navigation – Moritz 2012-03-07 12:40:30

+0

nope不旋轉屏幕 – max4ever 2012-03-09 10:17:50

2

Android系統將調用onNavigationItemSelected( 0,0)。 (這意味着比onResume()晚)。

正如其他人提到的,你最好不要像忽略第一次調用那樣做任何破解,否則當你選擇第一個索引時,android系統不會再調用onNavigationItemSelected()。 (該系統認爲第一個項目已被選中)

我的解決方法是在設置操作欄後調用actionbar.setSelectedNavigationItem(您想要的真實項目)。然後系統會調用onNavigationItemSelected()兩次。首先onNavigationItemSelected(0,0),然後onNavigationItemSelected(實際項目#)。

+0

首先,你已經說過,最好不要忽略第一個呼叫,但是當你調用onNavigationItemSelected(0,0)時你會怎麼做? – skywall 2014-09-14 22:00:00

0

我有一個片段viewpager,我需要在尋呼機 爲每個片段設置自定義動作條在所需的網頁我有導航列表中,當我刷頁面片段火災自動onNavigationItemSelected,想避免這種行爲,並運行的任務只有當我手動選擇導航項目。

public class MyFragment extends Fragment implements ActionBar.OnNavigationListener { 

    private boolead fireReady = false; 

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

     // every time make it false, this method invoked on swipe action 
     fireReady = false; 

     if (isVisibleToUser) { 
      // setup actionbar, you also can setup action bar in activity 
      String[] array = getActivity().getResources().getStringArray(R.array.users_order); 
      ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, array); 
      adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

      getActivity().getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
      getActivity().getActionBar().setListNavigationCallbacks(adapter, this); 
     } 

    } 

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

     if (fireReady) { 
      // task fire only when you directly press navigation item 
      UsersTask task = new UsersTask(getActivity()); 
      task.setTaskListener(this); 
      task.execute(usersUrls[itemPosition]); 
     } else { 
      // make it true first time when page displayed 
      fireReady = true; 
     } 
     return false; 
    } 

} 

} 
4

方法onNavigationItemSelected(int itemPosition, long itemId)無論如何都會通過操作欄被調用。

你可能想要做的是告訴操作欄它應該傳遞給第一次調用的方法的itemPosition。 (換言之,要告訴操作欄在創建活動後應該設置哪個導航項目)。下面是代碼:

mActionBarMenuSpinnerAdapter = ...; 
mActionBar = getActionBar(); 
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
mActionBar.setListNavigationCallbacks(mActionBarMenuSpinnerAdapter, this); 
mActionBar.setSelectedNavigationItem(###your_default_navigation_item_here###); 

這樣做,你可以通過應用onNavigationItemSelected(int itemPosition, long itemId)的變化,如果僅僅是itemPosition不同的解決你的問題後。