向上导航按钮在没有自定义工具栏的基本 Android 应用程序中不起作用

Up navigation button does not work in basic Android Application without custom toolbar

我的应用程序工具栏向上按钮有问题,当在 child activity 中按下时,它永远不会通过 onOptionsItemSelected 方法上的 R.id.home

主要activity

package com.foocorp.firstapp;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class InstrumentListActivity extends AppCompatActivity
        implements IUdpNotificationListener
{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_my);

        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.menu_my, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();


        if (id == R.id.action_settings) {
            return true;
        }
        if (id == R.id.home) {
            Toast.makeText(getApplicationContext(), "Clicked Menu back from Main", Toast.LENGTH_SHORT).show();
            finish();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onBackPressed() {

        Toast.makeText(getApplicationContext(), "Clicked Hard back from Main", Toast.LENGTH_SHORT).show();
        finish();
    }
}

child activity 这里我设置了 setDisplayHomeAsUpEnabled(true);

package com.foocorp.firstapp;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class InstrumentViewDetailsActivity extends AppCompatActivity implements IUdpNotificationListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_instrument_view_details);

        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        Intent intent = getIntent();

        //whatever here
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.menu_instrument_view_details, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();


        if (id == R.id.action_settings) {
            return true;
        }
        //=> never get called because passed ID is never R.id.home
        if (id == R.id.home) {
            Toast.makeText(getApplicationContext(), "Clicked Menu back from Details", Toast.LENGTH_SHORT).show(); 
            finish();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onBackPressed() {

        Toast.makeText(getApplicationContext(), "Clicked Hard back from Details", Toast.LENGTH_SHORT).show(); // this works fine
        finish();
    }

}

定义 parent child 关系的清单文件

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.foocorp.firstapp">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_tap_and_play_white_24dp"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <activity
            android:name="com.foocorp.firstapp.InstrumentListActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".InstrumentViewDetailsActivity"
            android:label="@string/instrum_details"
            android:parentActivityName="com.foocorp.firstapp.InstrumentListActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.foocorp.firstapp.InstrumentListActivity" />
        </activity>
    </application>

</manifest>

childactivity的菜单布局文件(顺便说一句,UP按钮虽然在应用程序运行时出现,但在这里没有定义是正常的吗? )

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.foocorp.firstapp.InstrumentViewDetailsActivity">

<item
    android:id="@+id/action_settings"
    android:orderInCategory="100"
    android:title="@string/action_settings"
    app:showAsAction="never" />
</menu>

在互联网上搜索此解决方案时,我在清单文件和 getSupportActionBar().setHomeButtonEnabled(true); 中找到了有关 parent/child 关系的提示,但尽管有这些提示,我还是无法获得此 UP 工具栏按钮正常工作:它 return 到 parent activity 但不是以正确的方式,就像我按下后退按钮调用 onBackPressed() 方法并且工作正常.

关于我在这里遗漏了什么的任何线索?

将后退按钮的 ID 从 R.id.homeandroid.R.id.home 在你的 onOptionsItemSelected() 方法中。

您也可以使用 NavUtils.navigateUpFromSameTask(this); 而不是 finish();,正如您在 AndroidManifest.xml.

中提到的 parentActivityName