在动作条onNavigationItemSelected正在启动名为怎么能避免呢?(onNaviga

2019-06-23 16:22发布

我使用的动作条有一个下拉菜单, onNavigationItemSelected()是只要活动创建调用,所以第一项被调用。 我的下拉菜单中的第一项是家庭,相同的动作与按应用程序图标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);
}

但我动作条上我所有的活动,让每家每户活动启动它的时候称自己永远所以我必须把这些代码每个活动。 怎么了? 我怎样才能防止这种情况发生?

Answer 1:

我使用的动作条白衣一个下拉菜单,onNavigationItemSelected()被调用,一旦活动创建

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

我的下拉菜单中的第一项是家庭的相同的动作按应用程序图标丝毫android.R.id.home所以应用程序启动时,它调用自身。

因此,删除从您的“菜单”。 用户可以在左侧按您的应用程序图标,导航回家。



Answer 2:

正如马克指出的那样,它不是设计成一个菜单。

但是,这里有一个快速和肮脏的方法来忽略第一个电话:

声明这个类领域:

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


Answer 3:

您可以强制正确的默认选项,在您的“菜单”有以下几点:

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

反直觉这个一定要设置之后回调(这在我的脑海里给回调的机会在火中的0导航索引)来完成。 例如,我的应用程序有两个活动ListView和浏览量,我喜欢我的导航菜单中按字母顺序排序,但默认的启动活动浏览量。 所以我在浏览量的onCreate()以下内容:

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

在ListView控件的onCreate():

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

然后,不管我多少次调用startActivity(奥瑟维尤),它总是正确设置导航菜单。



Answer 4:

首先感谢@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方法。 如果任何人都可以扔在这一些轻,这将是有益的。



文章来源: onNavigationItemSelected in ActionBar is being called at startup how can avoid it?