未调用onSupportNavigateUp()

时间:2013-09-13 06:57:40

标签: android

我正在开发一个带ActionBars的应用程序,它支持Gingerbread及以上版本。所以基本上我正在使用支持库并扩展

  

ActionBarActivity

我的所有活动。除了

之外,一切运作良好
  

onSupportNavigateUp()

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

  

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

这很容易,但我无法弄清楚为什么它没有按预期工作,也没有谷歌搜索帮助。这是一个错误吗?或者我错过了什么?

8 个答案:

答案 0 :(得分:18)

如果您覆盖onOptionsItemSelected,则不会调用onSupportNavigateUp

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

答案 1 :(得分:7)

您是否在Manifest.xml文件中设置了父活动?如果是,则不会被呼叫。 @see http://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html#onSupportNavigateUp()

答案 2 :(得分:6)

如前所述,如果您覆盖OnOptionsItemSelected,则不会调用OnSupportNavigateUp。你可以通过在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。这是因为您不希望在OnOptionsItemSelected

中处理此案件

答案 3 :(得分:2)

谁知道...... onSupportNavigateUp()仅适用于4.0及以上版本。对于onNavigateUp()以下的名称。

答案 4 :(得分:1)

从onCreateOptionsMenu()返回true也很重要,因为我有自定义菜单,所以我将此设置为false,但是未调用onOptionsItemSelected()!

因此使用:

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

答案 5 :(得分:0)

我遇到了相同的问题 onSupportNavigateUp onOptionsItemSelected 没有打电话

我需要防止子片段上的backPress,所以我覆盖了工具栏上的setNavigationOnClickListener

 toolbar.setNavigationOnClickListener {

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

,或者如果您不想在开始/根目录片段

上打开导航抽屉菜单,则可以使用 navController.navigateUp()

答案 6 :(得分:0)

所以实际上,当您覆盖 onOptionsItemSelected 时,默认情况下您应该返回 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
}

答案 7 :(得分:-1)

您需要在 onCreate() 方法中添加这一行

supportActionBar?.setDisplayHomeAsUpEnabled(true)

连同 onSupportNavigateUp() 方法