2012-03-01 117 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不同的解决你的问题后。