10

我正在使用带有下拉菜单的 ActionBar,并onNavigationItemSelected()在创建 Activity 后立即调用,因此调用了第一项。我的下拉菜单的第一项是 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

4 回答 4

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
}
于 2013-02-18T11:30:36.173 回答
4

我正在使用带有下拉菜单的 ActionBar,并且在创建 Activity 后立即调用 onNavigationItemSelected()

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

我的下拉菜单的第一项是 Home 与按下应用程序图标 android.R.id.home 的操作相同,因此当应用程序启动时它会调用自身。

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

于 2012-04-16T00:06:48.627 回答
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),它总是会正确设置导航菜单。

于 2014-03-12T00:24:04.967 回答
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 方法。如果有人可以对此有所了解,那将很有用。

于 2013-07-12T06:17:24.990 回答