onNavigationItem被选中的ActionBar在启动时被调用如何避免呢?

我在下拉菜单中使用ActionBar,一旦Activity被创build, onNavigationItemSelected()就会被调用,所以第一个项目被调用。 我的下拉菜单中的第一项是Home,与使用android.R.id.home按下应用程序图标的操作相同,所以当应用程序启动时它会调用它自己。 为了避免这种情况发生,我有这样的代码:

 if(this.getClass() != FrecView.class){ //if i am not currently on the Activity Intent frec = new Intent(this, FrecView.class); frec.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(frec); } 

但是我所有的活动都有ActionBar,所以每次开始活动时都会自动调用它自己,所以我必须为每个活动添加代码。 发生什么事? 我怎样才能防止这种情况发生?

Solutions Collecting From Web of "onNavigationItem被选中的ActionBar在启动时被调用如何避免呢?"

我正在使用ActionBar白色下拉菜单和onNavigationItemSelected()被称为活动创build

这不是devise成一个“菜单”,除了制表符被devise成一个“菜单”。 列表导航被devise为允许用户指示当前活动的一些内容,典型地通过replace片段。 行动项目(例如,工具栏button,行动溢出区域)用于在活动之间进行导航。

我的下拉菜单中的第一项是家庭与按下应用程序图标惠普android.R.id.home相同的行动,所以当应用程序启动它自己调用。

所以,从你的“菜单”中删除。 用户可以按下左侧的应用程序图标导航回家。

正如马克所说,它并不是一个菜单。

但是,忽略第一个呼叫是一种快速而肮脏的方法:

声明这个类字段:

 //mNaviFirstHit should be initialized to true private boolean mNaviFirstHit = true; 

并在onNavigationItemSelected:

 @Override public boolean onNavigationItemSelected(int itemPosition, long itemId) { if (mNaviFirstHit) { mNaviFirstHit = false; return true; } // DO WHAT YOU WOULD NORMALLY DO } 

你可以用下面的方法在你的“菜单”中强制使用正确的默认选项:

 bar.setListNavigationCallbacks(mNavigationAdapter, this); bar.setSelectedNavigationItem(indexOfCurrentActivityInTheMenu); 

与此相反,这必须在设置callback之后完成(我认为这会给callback一个导航索引为0的机会)。 例如,我的应用程序有两个活动ListView和PageView,我喜欢我的导航菜单按字母顺序排列,但默认启动活动是PageView。 所以我在PageView的onCreate()中有以下几点:

 bar.setListNavigationCallbacks(mNavigationAdapter, this); bar.setSelectedNavigationItem(1); 

并在ListView的onCreate()中:

 bar.setListNavigationCallbacks(mNavigationAdapter, this); bar.setSelectedNavigationItem(0); 

然后,无论我调用startActivity(otherView)多less次,它都会正确设置导航菜单。

首先感谢@CommonsWare提醒我们这是一个制表符的替代scheme,所以代码应该用这个angular度来devise。 虽然它不像看起来那么直截了当,但是我们可以在那里工作。

这也可以避免使用一个标志。 但是,无论如何,我build议我采取的方法来解决这个问题。

只要确保它被调用一次。 除此之外,使之成为内心阶层而不是匿名。 这将防止每次执行这部分代码时被调用。 代码如下:

 if(localOnNavigationListener != null) localOnNavigationListener = new LocalOnNavigationListener(); class LocalOnNavigationListener implements OnNavigationListener{ @Override public boolean onNavigationItemSelected(int itemPosition, long itemId) { // do something return true; } } 

我在这里看到一个奇怪的事件,如果我使它成为一个内部类,它不会调用onNavigationItemSelected(),如果我们使它成为一个匿名类,它会触发onNavigationItemSelected方法。 如果有人能够对此有所了解,这将是有益的。