Android 应用程序中 v21 的导航栏和状态栏颜色无主题库

问题描述

我正在开发一些不是我创建的应用程序,我想为 API 21 及更高版本设置导航栏和通知栏颜色。该应用程序的主题是纯 XML,没有新的应用程序主题库。我什至可以设置那些具有如此奇怪的主题设置并仅使用 xml 的颜色吗?有人可以解释一下菜鸟友好的地方要添加什么吗?

我尝试了各种东西

<item name="android:navigationBarColor">@color/theme_color</item>

但我似乎总是把事情搞糊涂。


我只有 themes.xml

    <?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="Theme.phttpp.TitleBar" parent="android:Theme">
    <item name="android:windowTitleBackgroundStyle">@style/windowTitleBackgroundStyle</item>
    <item name="android:windowTitleStyle">@style/windowTitleStyle</item>
    <item name="android:windowTitleSize">50dip</item>
  </style>
  <style name="Theme.dialog.TitleBar" parent="@android:style/Theme.Dialog">
    <item name="android:windowTitleStyle">@style/windowTitleStyle</item>
    <item name="android:windowTitleSize">50dip</item>
  </style>
</resources>

values 文件夹中的styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="windowTitleBackgroundStyle">
    <item name="android:background">#00BCD4</item>
  </style>
  <style name="windowTitleStyle">
    <item name="android:textColor">#FFFFFF</item>
    <item name="android:padding">12dip</item>
    <item name="android:textStyle">bold</item>
    <item name="android:textSize">16sp</item>
    <item name="android:background">#00BCD4</item>
    <item name="android:maxLines">1</item>
  </style>
</resources>

解决方法

在 themes.xml 中添加这些行在我的情况下有效

<style name="Theme.MyApp" parent="Theme.MaterialComponents.DayNight.NoActionBar">
     ...
     colors and other stuff
     ...
     <!-- Status bar color. -->
     <item name="android:statusBarColor" >@color/my_color</item>
     <item name="android:fitsSystemWindows">true</item>
     <item name="android:windowLightStatusBar">true</item>
     <!-- Navigation bar color. -->
     <item name="android:navigationBarColor">@color/my_color</item>
</style>
,

我找到了一个适用于 API21 及更高版本的解决方案。 我没有更改主题和样式的任何内容,但是我将colors.xml 添加到/values-v21

    if (Build.VERSION.SDK_INT >= 21) {
        Window window = this.getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.setStatusBarColor(this.getResources().getColor(R.color.colorPrimaryDark));
        getWindow().setNavigationBarColor(getResources().getColor(R.color.colorGray));
    }

并将其添加到我的 Java 代码中的 onCreate 的主要活动中

import { StatusBar } from 'expo-status-bar';
import React,{ useState } from 'react';
import { SafeAreaProvider } from 'react-native-safe-area-context';

import useCachedResources from './hooks/useCachedResources';
import useColorScheme from './hooks/useColorScheme';
import Navigation from './navigation';
import PlayerWidget from './components/PlayerWidget';
import Amplify from 'aws-amplify';
import awsmobile from './src/aws-exports';

import { withAuthenticator } from 'aws-amplify-react-native';
Amplify.configure(awsmobile);
//import the contexts
import { AppContext } from './AppContext';
import { StatusContext } from './StatusContext';
import { AlbumContext } from './AlbumContext';
import { songFinishContext } from './songFinishContext';
import { AlbumHeaderPause } from './AlbumPauseContext';
import { playlistContext } from './playlistContext';
import { CurrentSongIDContext } from './CurrentSongIDContext';



 export default function App() {
  const isLoadingComplete = useCachedResources();
  const colorScheme = useColorScheme();
  const [currentSongId,setCurrentSongId] = useState<string | null>(null);
  const [songId,setSongId] = useState<string | null>(null);
  const [songStatus,setSongStatus] = useState<boolean | null>(false);
  const [Albumid,setAlbumid] = useState<string | null>(null);
  const [finish,setFinish] = useState<boolean | null>(false);
  const [pauseAlbum,setPauseAlbum] = useState<boolean | null>(false);
  const [playlist,setPlaylist] = useState<string | string[]>([]);




  if (!isLoadingComplete) {
    return null;
  } else {
    return (

      <SafeAreaProvider>
        <AppContext.Provider value={{
          songId,setSongId: (id: string) => setSongId(id),}}>
          <StatusContext.Provider value={{
            songStatus,setSongStatus: (isPlaying: boolean) => setSongStatus(isPlaying),}}>


            <AlbumContext.Provider value={{
              Albumid,setAlbumid: (albumId: string) => setAlbumid(albumId),}}>
              <songFinishContext.Provider value={{
                finish,setFinish: (didJustFinish: boolean) => setFinish(didJustFinish),}}>

                <AlbumHeaderPause.Provider value={{
                  pauseAlbum,setPauseAlbum: (pauseAl: boolean) => setPauseAlbum(pauseAl),}}>
                  <playlistContext.Provider value={{
                    playlist,setPlaylist: (songID: string[]) => setPlaylist(songID),}}>
                    <CurrentSongIDContext.Provider value={{
                      currentSongId,setCurrentSongId: (id: string) => setCurrentSongId(id),}}>

                      <Navigation colorScheme={colorScheme} />
                      <StatusBar />
                      <PlayerWidget />
                    </CurrentSongIDContext.Provider>
                  </playlistContext.Provider>
                </AlbumHeaderPause.Provider>
              </songFinishContext.Provider>
            </AlbumContext.Provider>
          </StatusContext.Provider>
        </AppContext.Provider>
      </SafeAreaProvider>
    );
  }
}