(android) 为什么主题的样式只应用了一部分?
(android) Why does the style of the theme only partially apply?
我想知道为什么只应用了部分主题样式。
我把基本主题设为NoActionBar
。
我在 Main.xml
中使用 CoordinatorLayout
、AppBarLayout
和 Toolbar
创建了一个新工具栏。
我还为此工具栏定义了新的主题样式并更改了 stauts bar
颜色并应用了这个主题。
但是没有用。但是,当我更改 BaseTheme
.
中定义的 stauts 栏颜色时
效果很好。我很困惑。
我清楚地应用了我定义的theme style
。但是 BaseTheme's status bar color
仍然适用。
当我改变Toolbar
颜色时,它应用得很好。
我不知道原因。
我的自定义工具栏是否受到“清单主题”的影响?
请告诉我为什么..
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>
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("목 록");
您在 styles.xml 中创建了自定义 Theme.AppBarOverlay
样式。现在这种风格是没有用的,除非你把它应用到某个view/widget.
第一点:
将样式应用于特定视图,不会影响其他视图views/widgets。
查看您的布局以查看您将此样式设置为哪个视图:它是 AppBarLayout
小部件。
AppBarLayout
区域不包括状态栏区域,这是因为状态栏是 android 系统组件,而不是 activity 小部件(不是您的 activity).因此,将此样式应用到 AppBarLayout
时,只能将此样式的属性应用到此 AppBarLayout
视图在屏幕上占据的区域。
第二点:
每个 view/widget 都有一些可以影响其风格的属性;不仅有可以应用于任何视图的通用属性;但也有特定于某些视图的其他独特属性。将样式属性应用于无法利用它们的视图不会对这些视图产生影响,或者它们可能会对这些视图产生意外行为。
在您的示例中应用两点:
您使用了可应用于 system/status 栏的 android:statusBarColor
属性,并将其添加到应用于 AppBarLayout
的样式;所以这种风格只能应用于 AppBarLayout
周围区域,即不是状态栏本身(第 1 点),而且 AppBarLayout
也不会使用它,因为它不会影响它的任何东西布局,因为它不是可以影响 AppBarLayout
(第 2 点)的属性的一部分。
状态栏是一个系统组件,不是app/activitycomponent/widget,所以改变它必须在你的应用程序的全局主题中,或者你可以通过编程来改变它。
您可以查看 here 了解更多信息。
我想知道为什么只应用了部分主题样式。
我把基本主题设为NoActionBar
。
我在 Main.xml
中使用 CoordinatorLayout
、AppBarLayout
和 Toolbar
创建了一个新工具栏。
我还为此工具栏定义了新的主题样式并更改了 stauts bar
颜色并应用了这个主题。
但是没有用。但是,当我更改 BaseTheme
.
效果很好。我很困惑。
我清楚地应用了我定义的theme style
。但是 BaseTheme's status bar color
仍然适用。
当我改变Toolbar
颜色时,它应用得很好。
我不知道原因。
我的自定义工具栏是否受到“清单主题”的影响?
请告诉我为什么..
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>
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("목 록");
您在 styles.xml 中创建了自定义 Theme.AppBarOverlay
样式。现在这种风格是没有用的,除非你把它应用到某个view/widget.
第一点:
将样式应用于特定视图,不会影响其他视图views/widgets。
查看您的布局以查看您将此样式设置为哪个视图:它是 AppBarLayout
小部件。
AppBarLayout
区域不包括状态栏区域,这是因为状态栏是 android 系统组件,而不是 activity 小部件(不是您的 activity).因此,将此样式应用到 AppBarLayout
时,只能将此样式的属性应用到此 AppBarLayout
视图在屏幕上占据的区域。
第二点:
每个 view/widget 都有一些可以影响其风格的属性;不仅有可以应用于任何视图的通用属性;但也有特定于某些视图的其他独特属性。将样式属性应用于无法利用它们的视图不会对这些视图产生影响,或者它们可能会对这些视图产生意外行为。
在您的示例中应用两点:
您使用了可应用于 system/status 栏的 android:statusBarColor
属性,并将其添加到应用于 AppBarLayout
的样式;所以这种风格只能应用于 AppBarLayout
周围区域,即不是状态栏本身(第 1 点),而且 AppBarLayout
也不会使用它,因为它不会影响它的任何东西布局,因为它不是可以影响 AppBarLayout
(第 2 点)的属性的一部分。
状态栏是一个系统组件,不是app/activitycomponent/widget,所以改变它必须在你的应用程序的全局主题中,或者你可以通过编程来改变它。
您可以查看 here 了解更多信息。