在android中动态改变昼夜模式

2023-12-05

我正在开发一个基于Android的GPS导航应用程序,有必要根据光传感器值为该应用程序实现自动日夜主题切换。问题是我必须更改主题而不重新启动活动或应用程序。

我试图通过遵循本教程来实现这一目标(http://sriramramani.wordpress.com/2012/12/06/runtime-theme-change/)其中自定义状态用于在白天和夜间模式之间切换。但它需要大量更改,因为我的应用程序有很多布局。此外,通过这种实现,开发人员还必须考虑未来屏幕的日间和夜间模式。

有没有简单有效的方法来实现这一目标?


查看翻转器!这就是我在应用程序中使用的内容,允许用户选择白天或夜间主题。另外,由于 java 的性质,它可以根据任何布尔值进行更改(即,如果光线比 2 秒前更暗)。话虽如此,没有真正简单的方法可以自动切换所有布局,而无需为切换编写代码或构建其他人的工作。

就是这样:

我有一个应用程序,有 1 个活动、1 个布局和一个用于切换颜色的按钮。

  • MainActivity.java
  • Activity_main.xml(包含按钮)

ViewFlipper 被放置为每个布局子元素,如下所示:(每个需要白天和夜间模式的布局)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

  <ViewFlipper
    android:id="@+id/viewFlipper"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

  </ViewFlipper>

</RelativeLayout>

然后对于每个布局,我制作白天彩色布局和夜间彩色布局

白天和夜间布局都必须是 ViewFlipper 的子级,因此如果您折叠这两个布局,它应该是

  • < ViewFlipper>
    • 白天元素放在这里相对布局>
    • 夜间元素在这里相对布局>

麻烦来了:每个元素必须有一个唯一的 id,因为它们位于同一个文档中,例如,如果您希望在同一屏幕上显示白天按钮和夜间按钮。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ViewFlipper
  android:id="@+id/viewFlipper"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <LinearLayout
    android:id="@+id/DayLayout"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:layout_marginBottom="15dp">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/profileDayBtn"
        android:textStyle="bold"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:background="#fff"
        android:textColor="#000" />
</LinearLayout>
<LinearLayout
    android:id="@+id/NightLayout"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/profileNightBtn"
    android:layout_marginBottom="20dp"
    android:layout_marginTop="15dp"
    android:textStyle="bold"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:background="#000"
    android:textColor="#fff" />
</LinearLayout>

</ViewFlipper>
</RelativeLayout>

这就是布局,现在要实际更改它:

在具有白天或夜间布局的每个活动内添加以下代码:(我将我的代码添加到每个活动的 onCreate 中,但这不适用于基于时间的切换)

    setContentView(R.layout.activity_main);

    Button dayBtn = (Button) findViewById(R.id.profileDayBtn);
    Button nightBtn = (Button) findViewById(R.id.profileNightBtn);

    View.OnClickListener changeColorMode = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          ViewFlipper vf = (ViewFlipper) findViewById( R.id.viewFlipper );
          if (v == dayBtn) {
            vf.showNext();
          } else if (v == nightBtn) {
            vf.showPrevious();
          }
    };
    dayBtn.setOnClickListener(changeColorMode);
    nightBtn.setOnClickListener(changeColorMode);
    }

布局设置为activity_main,但由于activity_main有一个viewflipper,所以将其设置为第一根(索引 0)在 viewflipper(这是我的白天布局)内,.showNext() 将显示下一个根元素(索引 1 我的夜间布局,依此类推,如果我添加更多)

关闭,如果您需要显示特定布局而不是使用 .showNext() 猜测,您可以调用

   viewFlipper.setDisplayedChild(viewFlipper.indexOfChild(XXX));

其中 XXX 可以替换为布局的索引(0、1 等),或者 XXX 可以替换为特定布局 id,如下所示 viewFlipper.setDisplayedChild(viewFlipper.indexOfChild(findViewById(R.id.DayLayout));

这就是我使用的,它效果很好,因为它非常容易理解并且非常可定制!希望这可以帮助

-Stephen

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在android中动态改变昼夜模式 的相关文章

  • 低于 64K 方法时出现“方法超出编译器指令限制”消息

    我经常在日志中看到类似这样的重复消息 Method exceeds compiler instruction limit 29278 in void com xxxxxxapp xxxxxx MyGLRenderer onDrawFrame
  • 在webview android上显示网页的一部分

    我想制作一个将网页内容加载到 webview 中的应用程序 我只想显示整个网页视图中的特定内容 而不是网页的全部内容 这是一个例子 如果我使用 作为 webview 的 URL 它会加载 webview 上页面的所有内容 但我想删除页面的横
  • 在 JellyBean 上使用 LogCat

    我有一个非常随机发生的错误 所以我依赖LogCat我从 Play 商店购买的监控应用程序 以查看发生时设备上抛出的异常 自从使用 Jelly Bean 以来 我没有看到任何日志记录 我读过 使用 Jelly Bean 应用程序只能看到Log
  • 如何在 Android 上以编程方式截取屏幕截图?

    如何不通过任何程序而是通过代码截取手机屏幕的选定区域的屏幕截图 以下代码允许将我的屏幕截图存储在 SD 卡上 并在以后满足您的任何需求 首先 您需要添加适当的权限来保存文件
  • Android 全屏对话框片段(如日历应用程序)

    我正在尝试实现如下图所示的全屏对话框 我能够显示全屏对话框 但是当显示对话框时 状态栏颜色变为黑色并且不保留原色深色 这是我的对话片段 public class IconsDialogFragment extends DialogFragm
  • 从本机代码访问 AsyncStorage

    我需要使用 JS 代码中的 AsyncStorage 将数据保存在本地存储中 我想知道是否有一种方法可以从本机代码 Objective C 或 Java 访问 AsyncStorage 存储的数据 Thanks 如果你导入RCTAsyncL
  • 动态创建形状

    我有一个在 XML 中定义的形状对象 如下所示
  • getWidth() 和 getHeight 在 onMeasure() 之后返回零(特定设备)

    我注意到在调用 onMeasure 后 我的应用程序的视图为 getWidth 和 getHeight 返回 0 这种情况只发生在少数设备上 对于大多数 Android 设备 以下代码可以正常工作 我的 checkViewAndLoad 函
  • Android SIP 客户端 SipManager.open() 未打开

    我一直在使用 Android SDK 的本机 SIP 库编写 SIP 客户端 由于某种原因 我无法让我的帐户在服务器上注册 以下是测试场地 Linux Mint 17 XFCE 运行 Kamailio 服务器 启用 MySQL 和 TLS
  • Android 4.3 的 Google 地图 Android API V2 问题

    我是谷歌地图的新手 刚刚点击此链接http www androidhive info 2013 08 android working with google maps v2 http www androidhive info 2013 08
  • 当您处于飞行模式并退出飞行模式时,我只收到最后一条 FCM 推送通知?

    我只在退出飞行模式后收到最后的推送通知 FCM 但是 如果我的应用程序位于前台 一旦我离开飞行模式 我将收到所有推送通知 我已将 FCM 消息类型实现为通知消息 笔记 无法将 FCM 消息类型实现为数据消息 因为 APNS 只接受我的 iO
  • Android Fitness API 未从可穿戴传感器读取数据

    我一直在阅读有关 Google Fit API 的内容 特别是传感器 API https developers google com fit android sensors https developers google com fit a
  • 从 Android 模拟器使用 WebView WebGL

    据我了解 WebGL 仅在 Android Lollipop 中的 WebView 更新 Play 商店中的 WebView 组件 和较新版本 无需 Play 商店更新 中受支持 但是 我有一个使用 Android 7 1 1 的模拟器 并
  • 已使用不兼容的格式定义属性(此处定义的原始属性)

    添加后无法构建项目 compile com android support design 24 2 0 一直报如下错误 看起来 问题在于支持矢量绘图 某处某些属性被添加两次 例如 构建的values xml文件包含
  • 在 Facebook 上分享文本和 URL

    我想分享一条消息 例如 查看图片http someUrl com http someUrl com从应用程序共享ABCapp 用户必须能够选择任何已安装的应用程序进行共享 我正在使用以下代码 Intent intent new Intent
  • 没有 ContentProvider 的 SyncAdapter

    我想为我想要与服务器同步的内容实现 SyncAdapter 看来要做到这一点 您需要为 SyncAdapter XML 属性文件中指定的权限注册一个 ContentProvider 由于我不希望手机的其余部分可以访问此内容 因此我没有实现自
  • 文本转语音无法在 Android 设备上运行

    下面是我的代码 我无法在 Kitkat 设备中听到声音 Toast 出现 但声音没有播放 我正在遵循本教程 https www tutorialspoint com android android text to speech htm ht
  • Paint.setTextSize(float) 使用哪种测量单位?

    我想使用在视图上绘制具有特定高度 以像素为单位 的文本Canvas 你可以简单地使用Paint setTextSize float 与像素数或者这是使用dp or sp 它使用像素 但您可以使用以下代码将其转换为 dp double get
  • Android:制作/显示 9patch 图像时的对齐错误

    九号补丁 截屏 布局 XML
  • 安卓框架?

    是否有任何框架比构建 Android 应用程序更容易 您会对其中一个感兴趣吗 很快就会有 我正在开发 DroidFu 一个 Android 共享库 它将为您提供 活动 和服务 中直接提供大量实用功能 例如生成列表和错误对话框 检查 Inte

随机推荐