【问题标题】:Custom Toolbar for all activities not working as expected?所有活动的自定义工具栏未按预期工作?
【发布时间】:2019-09-27 09:00:41
【问题描述】:

我想为除主要活动之外的所有活动设置一个带有后退箭头的自定义工具栏(转到上一个活动,在这种情况下始终返回到主要活动)。

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

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

现在创建了一个扩展上述自定义活动的另一个活动: 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 中,我有一些特定于该活动的代码。

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

【问题讨论】:

  • 你为什么不做一个单独的布局包含工具栏和include它在你想要的任何地方
  • 我们是否需要通过包含在 xml 和 .java 文件中扩展类或使用 setSupportActionBar() 进行添加?
  • 就在 xml 中,包括布局,它就会在那里。您甚至可以在包含的布局中找到视图并对其进行处理。像这样stackoverflow.com/a/4787064/8528047

标签: android android-toolbar


【解决方案1】:

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

在指定活动的 manifest.xml 文件中,

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

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

【讨论】:

  • 伙计,你救了我!我一直在挠头一天。我确实在清单文件中添加了它以及设置工具栏,但不知道仅声明该属性 android:parentActivityName="the activity to go on back click" 就足够了。 >但有一个问题,当活动打开时,它从右向左滑入,当我们单击后退箭头时,它应该从左向右滑入。但它再次从右向左滑动!- 如何解决这个问题?
  • 我已经尝试修改styles.xml添加自定义动画,但默认的打开和关闭过渡没有到来。
  • 我找到了这个动画/过渡问题的解决方案。我必须将 att 'android:launchMode="singleTop" ' 添加到 manifests.xml 中的 '.MainActivity' (或我们必须返回的任何活动)
  • 很高兴你找到它。
【解决方案2】:

这是因为在您的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>

在超类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);
        }
    }
}

【讨论】:

  • 感谢您的快速回复。我确实提出了“包含”声明,但问题是整个 VisionMission 都在 ScrollView --> Linear Layout --> include 中,工具栏也随内容滚动。我应该改为 LL --> include --> ScrollView --> LL 吗?
  • 是的,它可能会起作用。实际上,我在我的一个生产项目中使用了这种技术。我在所有片段中都有LL -&gt; (include)/toolbar, NestedScrollView -&gt; ConstraintLayout -&gt; otherviews
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 2018-03-09
  • 1970-01-01
  • 2017-01-01
  • 2021-10-22
  • 2015-11-24
相关资源
最近更新 更多