【问题标题】:Changing day night mode dynamically in android在android中动态改变昼夜模式
【发布时间】:2015-07-14 00:39:46
【问题描述】:

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

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

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

【问题讨论】:

  • 您是否对光传感器值应用了任何类型的过滤器?我正在做类似的事情,只是好奇。
  • 是的。我每 1 或 2 秒读取一次传感器值变化的传感器值,并找到 20 个观察值的平均值。如果这个平均值大于阈值,那么我改变了颜色
  • 您尝试过 night 和 notnight 布局的限定符值吗?就像这个链接中提到的developer.android.com/guide/topics/resources/…

标签: android


【解决方案1】:

ViewFlipper! 这是我在我的应用程序中使用的,允许用户选择白天或晚上的主题。同样由于 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>

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

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

    • Day 元素进入这里
    • 夜间元素进入这里

麻烦来了:每个元素都必须有一个唯一的 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);
    }

layout 设置为 activity_main 但因为 activity_main 有一个 viewflipper,它将其设置为 viewflipper(这是我的一天布局)内的 第一个根(索引 0),.showNext() 将显示下一个根元素(如果我添加更多,索引 1 我的夜间布局等等)

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

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

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

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

-斯蒂芬

【讨论】:

    【解决方案2】:

    不,必须在创建视图/布局之前应用主题/样式。

    因此,如果您想在运行时更改它们,则必须在 JAVA 代码中执行所有操作,例如 setBackground(color) setImageRes(xxx) setTextColor(xxx)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 2018-08-15
      • 2022-06-17
      • 2020-10-10
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多