所有活动的自定义工具栏未按预期工作?
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);
}
}
}
我想为除主要 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);
}
}
}