所有活动的自定义工具栏未按预期工作?

Custom Toolbar for all activities not working as expected?

我想为除主要 activity.

从几篇文章中了解到,我创建了一个自定义工具栏 activity,代码如下:

activity_toolbar_back_arrow.xml

<LinearLayout
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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ToolbarBackArrow">

<androidx.appcompat.widget.Toolbar
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/colorPrimary"
    app:title="My First App"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    android:id="@+id/toolbar_back_arrow"
    app:contentInsetLeft="0dp"
    app:contentInsetStart="0dp"
    app:contentInsetStartWithNavigation="0dp"/>
</LinearLayout>

ToolbarBackArrow.class

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.appcompat.widget.Toolbar;

public class ToolbarBackArrow extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_toolbar_back_arrow);

    Toolbar toolbar = findViewById(R.id.toolbar_back_arrow);
    setSupportActionBar(toolbar);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
}

现在创建另一个 activity 来扩展上述自定义 activity: VisionMission.java

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.os.Bundle;

public class VisionMission extends ToolbarBackArrow {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_vision_mission);

}
}

在 activity_vision_mission.xml 中,我有一些特定于 activity 的代码。

根据解决方案,我读到应该在 VisionMission activity 中创建一个工具栏,但事实并非如此。我错过了什么? 在清单中,我将所有活动的主题设置为 No ActionBar。

如果您的唯一需求是后退按钮,则无需使用自定义工具栏。

在您的 manifest.xml 文件中指定 activity,

<activity
    android:name="com.example.app_name.A" ...>
    ...
</activity>
<!-- A child of the main activity -->
<activity
    android:name=".B"
    android:label="B"
    android:parentActivityName="the activity to go on back click" >
    <!--android:parentActivityName="com.examle.myparentactivity" -->
    <!-- Parent activity meta-data to support 4.0 and lower -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.app_name.A" />
</activity>

它将自动显示具有所需行为的后退按钮。

这是因为在 ToolbarBackArrow 中,您首先设置布局,然后在 VisionMission 中重置布局,并且工具栏的旧布局被另一个调用 setContentView.为了达到预期的结果,使用包括:

include_toolbar.xml:

<androidx.appcompat.widget.Toolbar
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/colorPrimary"
    app:title="My First App"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    android:id="@+id/toolbar_back_arrow"
    app:contentInsetLeft="0dp"
    app:contentInsetStart="0dp"
    app:contentInsetStartWithNavigation="0dp"/>

activity_vision_mission.xml:

<LinearLayout
    ...>

   <include layout="@layout/include_toolbar" />

   ... Your other views ...

</LinearLayout>

并在超级 class ToolbarBackArrow

public class ToolbarBackArrow extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Not needed anymore
        // setContentView(R.layout.activity_toolbar_back_arrow);

        Toolbar toolbar = findViewById(R.id.toolbar_back_arrow);

        // always check because you can forget to add an 'include' and
        // toolbar will be null here, so you'll get NullPointerException
        if (toolbar != null) {
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        }
    }
}