Android (安卓)为什么主题的风格只是部分适用?

Android (安卓)为什么主题的风格只是部分适用?,android,toolbar,android-theme,android-statusbar,Android,Toolbar,Android Theme,Android Statusbar,我想知道为什么主题的风格只是部分应用 我将基本主题设置为NoActionBar 我使用CoordinatorLayout、AppBarLayout和toolbar在Main.xml中创建了一个新工具栏 我还为此工具栏定义了新的主题样式,并更改了stauts bar颜色并应用了此主题 但它不起作用。但是,当我更改BaseTheme中定义的标记栏颜色时 它工作得很好。我很困惑 我清楚地应用了我定义的主题样式。但是BaseTheme的状态栏颜色仍然适用 当我更改工具栏颜色时,它应用得很好 我不知道原因

我想知道为什么主题的风格只是部分应用

我将基本主题设置为
NoActionBar

我使用
CoordinatorLayout
AppBarLayout
toolbar
Main.xml
中创建了一个新工具栏

我还为此工具栏定义了新的主题样式,并更改了
stauts bar
颜色并应用了此主题

但它不起作用。但是,当我更改
BaseTheme
中定义的标记栏颜色时

它工作得很好。我很困惑

我清楚地应用了我定义的
主题样式。但是
BaseTheme的状态栏颜色仍然适用

当我更改
工具栏
颜色时,它应用得很好

我不知道原因

“我的自定义工具栏”是否受“清单主题”的影响

请告诉我原因

Main.xml

<androidx.constraintlayout.widget.ConstraintLayout
    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"
    tools:context=".MainActivity">
    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:id="@+id/coordinator"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintTop_toTopOf="parent">
        <com.google.android.material.appbar.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:elevation="0dp"
            android:theme="@style/Theme.AppBarOverlay">
            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:titleTextColor="@color/black"
                app:titleMarginStart="30dp"
                android:paddingRight="30dp"
                android:theme="@style/Theme.PopupOverlay"/>
        </com.google.android.material.appbar.AppBarLayout>

    </androidx.coordinatorlayout.widget.CoordinatorLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

themes.xml

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.WriteWeight" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/purple_500</item>
        <item name="colorPrimaryVariant">@color/purple_700</item>
        <item name="colorOnPrimary">@color/white</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/teal_200</item>
        <item name="colorSecondaryVariant">@color/teal_700</item>
        <item name="colorOnSecondary">@color/black</item>
        <!-- Status bar color. -->
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
        <!-- Customize your theme here. -->
    </style>

    <style name="Theme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" >
        <item name="colorPrimary">@color/light_green</item>

        <item name="android:statusBarColor" tools:targetApi="l">@color/light_green_dark</item> <!-- not apply -->
<!--        <item name="colorPrimaryVariant">@color/light_green_dark</item> ///////////////// not apply -->
<!--        <item name="colorPrimaryDark">@color/light_green_dark</item>    ///////////////// not apply -->
    </style>

    <style name="Theme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light">
        <item name="colorPrimary">@color/light_green</item>
        <item name="colorPrimaryVariant">@color/light_green_dark</item>
        <item name="colorPrimaryDark">@color/light_green_dark</item>
    </style>
</resources>

@颜色/紫色500
@颜色/紫色\u 700
@颜色/白色
@颜色/青色200
@颜色/青绿色700
@颜色/黑色
?attr/colorPrimaryVariant
@颜色/浅绿色
@颜色/浅色\绿色\深色
@颜色/浅绿色
@颜色/浅色\绿色\深色
@颜色/浅色\绿色\深色
Manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.writeweight">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.WriteWeight">
        <activity android:name=".data.DailyRecordDetailActivity"></activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

MainActivity.java

public class MainActivity extends AppCompatActivity {
    RecyclerView rcv_dailyRecord;
    Toolbar toolbar;
    LinearLayoutManager layoutManager;

    DailyRecordAdapter dailyRecordAdapter;
    ArrayList<DailyRecordModel> dailRecordItems;

    final static String TAG = "MainActivity";

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

        rcv_dailyRecord = findViewById(R.id.rcv_dailyrecord);
        toolbar = findViewById(R.id.toolbar);
        
        setSupportActionBar(toolbar);
//        getSupportActionBar().setDisplayShowTitleEnabled(false);
//        toolbar.setTitle("목 록");

public类MainActivity扩展了AppCompatActivity{
RecyclerView rcv_dailyRecord;
工具栏;
直线布局经理布局经理;
DailyRecordAdapter DailyRecordAdapter;
ArrayList dailRecordItems;
最终静态字符串标记=“MainActivity”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rcv_dailyRecord=findViewById(R.id.rcv_dailyRecord);
toolbar=findviewbyd(R.id.toolbar);
设置支持操作栏(工具栏);
//getSupportActionBar().setDisplayShowTitleEnabled(false);
//工具栏。设置标题(“목 록");

您在styles.xml中创建了一个自定义的
主题.AppBarOverlay
样式。现在,除非您将此样式应用于某个视图/小部件,否则此样式将毫无用处

第一点:

将样式应用于特定视图不会影响其他视图/小部件

查看布局以查看将此样式设置为哪个视图:这是
AppBarLayout
小部件

AppBarLayout
区域不包括状态栏区域,这是因为状态栏是android系统组件,而不是活动小部件(不是活动的一部分)。因此,当将此样式应用于
AppBarLayout
时,它只能将此样式的属性应用于此
AppBarLayout
视图在屏幕上占据的区域

第二点:

每个视图/小部件都有某些属性可以影响其样式;不仅有可应用于任何视图的公共属性,还有特定于某些视图的其他独特属性。将样式属性应用于无法使用它们的视图不会对这些视图产生影响,或者它们可能会产生意外行为基于这些观点

在示例中应用这两点:

您使用了可应用于系统/状态栏的
android:statusBarColor
属性,并将其添加到应用于
AppBarLayout
的样式中;因此此样式只能应用于
AppBarLayout
周围区域,即不应用于状态栏本身(第1点),而且
AppBarLayout
不会使用它,因为它不会影响其布局中的任何内容,因为它不是可以影响
AppBarLayout
的属性的一部分(第2点)

状态栏是一个系统组件,而不是应用程序/活动组件/小部件,因此更改它必须在应用程序的全局主题中,或者您可以通过编程方式进行更改


你可以查看更多信息。

你能告诉我如何在你的行为(java/kotlin)中设置动作栏吗?你是说在代码中?你从应用程序的主题中删除了动作栏。你已经用java设置了吗?我刚刚修改了文字。请看代码。我已经使用设置支持动作栏(工具栏)设置了工具栏
@ybyb是的,你是对的。它是
AppBarLayout
包括它的任何内部视图。就像在你的例子中,
工具栏
…我指的是它的周围框架,即它的宽度/高度,如果这不是描述性的,很抱歉……但是请确保内部视图属性覆盖它们的父视图..即
工具B中的属性ar
覆盖其父级
AppBarLayout
中相同/相似的属性。例如,如果使用
android:background=“@android:color/black"
工具栏中
,您将看到的整体颜色是
工具栏
黑色,而不是样式中设置的
AppBarLayout
颜色非常感谢。我理解了。但是,我还不明白一件事。在您的回答中,在计算机
中应用示例中的两个点:
,我没有取消了解
第2点
(来自和也是~AppBarLayout)。您能更容易地解释它吗?抱歉..我的意思是
AppBarLayout
具有可能影响其外观和行为的属性集…如果您添加属性(该属性不是该属性集的一部分)对于
AppBarLayout
,此属性可能对
AppBarLayout
的外观没有影响,或者可能会有意外行为(因为此特定属性与
AppBarLayout
属性集无关……在您的示例中,您将
android:statusBarColor