HarmonyOS 浅色模式与深色模式

设置了深色模式与浅色模式的文字颜色,但是在选中时,当前页面(图01)和下一页(图02)的文字颜色都没有跟着变化。点击图01的image进入下一页(图02)

HarmonyOS 浅色模式与深色模式 -鸿蒙开发者社区

HarmonyOS 浅色模式与深色模式 -鸿蒙开发者社区

HarmonyOS
17h前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
FengTianYa

参考下面代码,点击文字深色模式、浅色模式可以切换对应的模式

import ConfigurationConstant from '@ohos.app.ability.ConfigurationConstant';
import window from '@ohos.window';

import deviceInfo from '@ohos.deviceInfo';//设备信息
import connection from '@ohos.net.connection';

import promptAction from '@ohos.promptAction';

import '../pages/nextIndex'
import { router } from '@kit.ArkUI';

type ResourceStr = string;

@Entry({ routeName: 'Index' })

@Component
export struct Index {
  // banner
  @State banner: Resource = $r('app.media.fit_for_dark_mode_dark_mode_banner');
  // @StorageProp + @Watch 获取并监听当前颜色模式
  @StorageProp('currentColorMode') @Watch('onColorModeChange') currentMode: number| undefined | null = ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT;
  // @Watch回调函数,监听颜色模式刷新状态变量
  onColorModeChange(): void {
    if (this.currentMode === ConfigurationConstant.ColorMode.COLOR_MODE_DARK) {
      console.info('深色模式')
      this.banner = $r('app.media.fit_for_dark_mode_dark_mode_banner');
      setStatusBar(ConfigurationConstant.ColorMode.COLOR_MODE_DARK);
    } else {
      console.info('浅色模式')
      this.banner = $r('app.media.fit_for_dark_mode_light_mode_banner');
      setStatusBar(ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT);
    }
  }
  // 在自定义组件生命周期aboutToAppear中,根据当前颜色模式刷新banner状态变量,切换不同的图片。
  aboutToAppear(): void {
    const applicationContext = getContext(this).getApplicationContext();
    if (this.currentMode == ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT) {
      //当前为浅色模式,资源初始化逻辑
      applicationContext.setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT);
    }else {
      //当前为深色模式,资源初始化逻辑
      applicationContext.setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_DARK);
    }
  }
  // 在自定义组件生命周期aboutToDisappear中,重置导航栏的背景色避免影响其它页面的导航栏为红色。
  aboutToDisappear(): void {
    const applicationContext = getContext(this).getApplicationContext();
    applicationContext.setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT);
    setStatusBar(ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT);
  }
  build() {
    Column() {
      Column() {
        Row() {
          Text('主题模式')
            .fontColor($r('app.color.fit_for_title_bg_color'))
            .margin({ top: 0})
            .textAlign(TextAlign.Center)
            .fontSize(20)
        }
        .width('100%')
        .height(64)
        .borderRadius(5)
      }
      .padding({ left: 12, right:12 })
      .backgroundColor("#F2F2F2")
      .width('100%')
        .height(64)

      Column() {
        Image(this.banner)
          .width(200)
          .height(80)
          .borderRadius(20)
          .onClick(() => {
            // 点击
            router.pushNamedRoute({ name: "nextIndex" });
          })
      }

      Column({ space: 1 }) {

        Row(){
          Text('自动跟随系统')
            .margin({ left:20 })

          Radio({ value: 'Radio1', group: 'radioGroup' })

            .checked(true)
            .height(30)
            .width(30)
            .margin({ right:20 })
            .onChange((isChecked: boolean) => {
              if (isChecked) {
                console.log('111')
                this.currentMode = ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT;
              }
            })
        }
        .justifyContent(FlexAlign.SpaceBetween)
        .width('100%')
        .height(50)
        .backgroundColor($r('app.color.fit_for_backgroundColor'))
        Row(){
          Text('浅色模式')
            .margin({ left:20 })
            .onClick(()=>{
              let context = getContext().getApplicationContext()
              context.setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT);
            })
          Radio({ value: 'Radio1', group: 'radioGroup' })
            .checked(true)
            .height(30)
            .width(30)
            .margin({ right:20 })
            .onChange((isChecked: boolean) => {
              if (isChecked) {
                console.log('222')
                // this.currentMode = ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT;
              }
            })
        }
        .justifyContent(FlexAlign.SpaceBetween)
        .width('100%')
        .height(50)
        .backgroundColor($r('app.color.fit_for_backgroundColor'))

        Row(){
          Text('深色模式')
            .margin({ left:20 })
            .onClick(()=>{
              let context = getContext().getApplicationContext()
              context.setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_DARK);
            })
          Radio({ value: 'Radio1', group: 'radioGroup' })
            .checked(true)
            .height(30)
            .width(30)
            .margin({ right:20 })
            .onChange((isChecked: boolean) => {
              if (isChecked) {
                console.log('222')
                // this.currentMode = ConfigurationConstant.ColorMode.COLOR_MODE_DARK;
              }
            })
        }
        .justifyContent(FlexAlign.SpaceBetween)
        .width('100%')
        .height(50)
        .backgroundColor($r('app.color.fit_for_backgroundColor'))
      }
      .width('100%')
      .margin({ top:20 })

    }
    .backgroundColor('#ffffff')
    .width('100%')
    .height('100%')

  }
}
/**

 根据不同的颜色模式来设置banner图和statusBar的背景色

 */
function setBanner(currentMode: number) {
  if (currentMode === ConfigurationConstant.ColorMode.COLOR_MODE_DARK) {
    // 在当前为深色模式中,确保界面美观且颜色统一,设置导航栏的背景色。
    setStatusBar(ConfigurationConstant.ColorMode.COLOR_MODE_DARK);
    console.log('000000')
  } else {
    // 在当前为浅色模式中,确保界面美观且颜色统一,设置导航栏的背景色。
    setStatusBar(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
    console.log('77777')
  }
}
async function setStatusBar(currentMode: number) {
  // 1.获取应用主窗口。
  const windowStage: window.WindowStage = AppStorage.get('windowStage') as window.WindowStage;
  windowStage.getMainWindow((err, data) => {
    if (err.code) {
      console.log('Failed to obtain the main window. Cause: ' + JSON.stringify(err));
      return;
    }
    console.log('Succeeded in obtaining the main window. Data: ' + JSON.stringify(data));
    let color = '';
    if (currentMode === ConfigurationConstant.ColorMode.COLOR_MODE_DARK) {
      color = '#48AF92';
    } else if (currentMode === ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT) {
      color = '#FFFFFF';
    } else {
      color = '#FA5a3C';
    }
    const sysBarProps: window.SystemBarProperties = {
      statusBarColor: color
    };

    data.setWindowSystemBarProperties(sysBarProps, (err) => {
      if (err.code) {
        console.log('Failed to set the system bar properties. Cause: ' + JSON.stringify(err));
        return;
      }
      console.log('Succeeded in setting the system bar properties.');
    });
  })
}
分享
微博
QQ
微信
回复
16h前
相关问题
app适配深色浅色切换模式
1900浏览 • 1回复 待解决
HarmonyOS 如何设置固定浅色模式
85浏览 • 1回复 待解决
HarmonyOS 主动设置深浅色模式
25浏览 • 1回复 待解决
应用如何适配深色模式
1102浏览 • 1回复 待解决
应用如何适配深色模式
2364浏览 • 1回复 待解决
HarmonyOS 如何禁止深色模式使用
38浏览 • 1回复 待解决
有关深色模式开发的文档
1709浏览 • 1回复 待解决
HarmonyOS app内如何禁用深色模式
277浏览 • 1回复 待解决
HarmonyOS 组件切换深色模式不生效
424浏览 • 1回复 待解决
HarmonyOS 深色模式切换后界面不刷新
33浏览 • 1回复 待解决
如何设置Web组件的深色模式
384浏览 • 1回复 待解决
深色模式如何屏蔽?有人知道吗?
375浏览 • 0回复 待解决
深色模式怎么开发? 有没有相关api?
4247浏览 • 1回复 待解决