21

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

动作栏活动

我所有的活动。一切都很好,除了

onSupportNavigateUp()

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

每当用户从操作栏中选择在应用程序的活动层次结构中向上导航时,都会调用此方法。

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

4

8 回答 8

37

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                // handle ⬅️ button here 
                break;
        }
        return true;
}
于 2016-11-16T07:56:22.777 回答
11

如前所述,如果您覆盖OnOptionsItemSelectedOnSupportNavigateUp将不会被调用。您可以通过添加 default: case 来确保它被调用,OnOptionsItemSelected如下所示:

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

于 2017-07-13T09:02:59.083 回答
8

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

于 2014-03-13T14:56:42.583 回答
3

谁知道...onSupportNavigateUp()仅适用于 4.0 及更高版本。因为下面onNavigateUp()被称为。

于 2013-09-13T10:11:57.877 回答
3

从 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)
        }
    }
于 2018-08-02T11:45:22.140 回答
0

我有同样的问题onSupportNavigateUp并且onOptionsItemSelected没有调用

我需要防止对子片段进行 backPress,因此我在工具栏中覆盖 setNavigationOnClickListener

 toolbar.setNavigationOnClickListener {

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

或者,如果您不想在开始/根片段上打开导航抽屉菜单,则可以使用navController.navigateUp()

于 2020-02-10T12:00:34.880 回答
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
}
于 2021-02-04T13:57:09.490 回答
-1

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

supportActionBar?.setDisplayHomeAsUpEnabled(true)

连同 ononSupportNavigateUp()方法

于 2021-01-21T09:24:24.557 回答