在android中动态更改日夜模式

时间:2014-07-14 07:04:55

标签: android

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

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

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

2 个答案:

答案 0 :(得分:2)

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的子项,因此如果您折叠两个布局,它应该是

  • &LT; ViewFlipper&GT;
    • &LT;的RelativeLayout&GT; 日元素在这里&lt; / RelativeLayout的&GT;
    • &LT;的RelativeLayout&GT; 夜元素进入&lt; / RelativeLayout的&GT;
  • &LT; / ViewFlipper&GT;

麻烦就是:每个元素必须具有唯一的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));

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

-Stephen

答案 1 :(得分:0)

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

因此,如果你想在运行时更改它们,你必须在JAVA代码中做所有事情,如setBackground(color)setImageRes(xxx)setTextColor(xxx)