Android 未调用onSupportNavigateUp()

Android 未调用onSupportNavigateUp(),android,Android,我正在开发一个带有ActionBars的应用程序,它支持姜饼和其他东西。所以我基本上是在使用支持库和扩展 行动性 为了我所有的活动。除了那辆车外,一切都很好 方法。只是没有按照文档中的说明调用它 只要用户选择在中向上导航,就会调用此方法 从操作栏中选择应用程序的活动层次结构 这很容易,但我还没有弄明白为什么它不能像预期的那样工作,谷歌搜索也帮不上忙。这是虫子吗?还是我遗漏了什么?谁知道onSupportNavigateUp()仅适用于4.0及以上版本。对于以下内容,调用onNavigateUp

我正在开发一个带有ActionBars的应用程序,它支持姜饼和其他东西。所以我基本上是在使用支持库和扩展

行动性

为了我所有的活动。除了那辆车外,一切都很好

方法。只是没有按照文档中的说明调用它

只要用户选择在中向上导航,就会调用此方法 从操作栏中选择应用程序的活动层次结构


这很容易,但我还没有弄明白为什么它不能像预期的那样工作,谷歌搜索也帮不上忙。这是虫子吗?还是我遗漏了什么?

谁知道
onSupportNavigateUp()
仅适用于4.0及以上版本。对于以下内容,调用onNavigateUp()。

是否在Manifest.xml文件中设置了父活动?如果是,它将不会被调用@请参见

如果您覆盖了选定的选项项,则将不会调用支持导航EUP上的

@Override
public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                // handle ⬅️ button here 
                break;
        }
        return true;
}

如前所述,如果覆盖选项项Selected,则不会调用支持导航EUP。您可以通过在
OnOptionsItemSelected
中添加一个default:case来确保调用它,如下所示:

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.something:
            Intent intent = new Intent(this,someActivity.class);
            startActivity(intent);
            finish();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

super.onOptionsItemSelected(item)
将确保调用
OnSupportNavigateUp
。这是为了防止您不希望在您的
onoptionItemSelected

中处理该案例。从onCreateOptions菜单()返回true也很重要,我将此设置为false,因为我有自定义菜单,但没有调用onoptionItemSelected()

因此,请使用:

 override fun onCreateOptionsMenu(menu: Menu): Boolean {
        // Inflate the menu; this adds items to the action bar if it is present.
        //menuInflater.inflate(R.menu.main, menu)
        return true
    }
然后

 override fun onOptionsItemSelected(item: MenuItem): Boolean {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        when (item.itemId) {
            R.id.action_share -> return true
            else -> return super.onOptionsItemSelected(item)
        }
    }

我在SupportNavigateUp上遇到了相同的问题,并且选择的选项项未调用

我需要防止子片段上的反压,以便覆盖工具栏中的setNavigationOnClickListener

 toolbar.setNavigationOnClickListener {

       if(childFragmentHandleBackPressed()){
          NavigationUI.navigateUp(
            navController,
            AppBarConfiguration(navController.graph, drawerLayout)
        )
       }
    }

或者您可以使用navController.navigateUp()如果您不想在开始/根片段上打开导航抽屉菜单,则需要在onCreate()方法中添加此行


与on
onSupportNavigateUp()
method

一起使用,因此实际上,当您重写OnOptions ItemSelected时,默认情况下应返回
false
以调用
onSupportNavigateUp
方法。见下文

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    when (item.itemId) {
        R.id.action_print -> {
            doSomething()
            return true
        }
    }
    return false
}

override fun onSupportNavigateUp(): Boolean {
    onBackPressed()
    return true
}

是否启用了向上按钮
getActionBar()。setDisplayHomeAsUpEnabled(true)它实际上是
getSupportActionBar()
对我来说是的,它是在
onCreate()上调用的。
OK我刚刚注意到它在运行Android 2.3的Nexus One上被正确调用,但在任何高于4.0的设备上都没有。我不能证实这一点
onSupportNavigateUp()
在API 10仿真器和API 18设备上为我调用,正如它应该调用的那样。因此,要么使用较旧/有缺陷的
ActionBarCompat
库,要么正在进行其他操作。当使用
ActionBarActivity
时,所有API级别都会调用
onSupportNavigateUp()
。Hey@Estorino感谢您的回复。这个问题在很久以前就发布了,坚持我上面提到的解决方案(或者只是一个补丁)到目前为止对我很有效。谢谢你的帮助。:)我当时也有同样的问题,没有透露问题的日期(如果返回
true
,则实际情况就是这样,否则将调用
onSupportNavigateUp
override fun onOptionsItemSelected(item: MenuItem): Boolean {
    when (item.itemId) {
        R.id.action_print -> {
            doSomething()
            return true
        }
    }
    return false
}

override fun onSupportNavigateUp(): Boolean {
    onBackPressed()
    return true
}