ActionBar中的onNavigationItemSelected在启动时被调用怎么能避免呢?

时间:2012-04-15 23:42:29

标签: android android-actionbar

我正在使用带有下拉菜单的ActionBar,并且在创建Activity后立即调用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,因此每次启动每个活动时它都会自动调用,所以我必须为每个活动放置代码。怎么了?我该如何防止这种情况发生?

4 个答案:

答案 0 :(得分:5)

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

然而,这是一种快速而肮脏的方法来忽略第一个电话:

声明此类字段:

//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
}

答案 1 :(得分:4)

  

我正在使用ActionBar whit下拉菜单,并且很快就会调用onNavigationItemSelected()

这不是设计为“菜单”,只是标签设计为“菜单”。列表导航旨在允许用户通常通过替换片段来指示当前活动的某些内容。操作项(例如,工具栏按钮,操作溢出区域)用于在活动之间导航。

  

我的下拉菜单中的第一项是Home与按下应用程序图标whit.exe.R.id.home的操作相同,所以当应用程序启动时它会自行调用。

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

答案 2 :(得分:3)

您可以在"菜单中强制使用正确的默认选项"以下内容:

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

反直觉地说,这必须在设置回调之后完成(我认为这会使回调有机会在导航索引为0的情况下触发)。例如,我的应用程序有两个活动ListView和PageView,我喜欢按字母顺序排序的导航菜单,但默认的启动活动是PageView。所以我在PageView的onCreate()中有以下内容:

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

并在ListView' onCreate()中:

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

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

答案 3 :(得分:0)

首先感谢@CommonsWare提醒我们它是标签的替代品,因此应该使用该视角设计代码。虽然它不像看上去那么直截了当,但我们可以在那里工作。

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

确保它被调用一次。 除此之外,它还是一个内在的类而不是一个匿名的。这将阻止每次执行此部分代码时调用它。代码如下:

if(localOnNavigationListener != null)
    localOnNavigationListener = new LocalOnNavigationListener();

class LocalOnNavigationListener implements OnNavigationListener{

    @Override
    public boolean onNavigationItemSelected(int itemPosition, long itemId) {
    // do something
    return true;
  }

}

我在这里看到一个奇怪的事件,如果我把它变成一个内部类,它不会调用onNavigationItemSelected(),如果我们将它设为匿名类,它将触发onNavigationItemSelected方法。如果有人可以对此有所了解,那将会很有用。