一直很希望Android有个系统全局功能:夜间模式。
就是在设置里提供一个ToggleButton,打开或者关闭夜间模式。同时在新的API里提供接口,对所有支持夜间模式的应用进行统一调度。打开总开关,默认开启其他第三方应用的夜间模式。然后也设置一个规则,可忽略某个软件。再自动化一些,可以设置个时间段,即默认开启夜间模式的时间段。
这个Feature的实现必然要第三方开发者支持。虽然有时候夜间模式看起来可有可无,但是对于喜欢睡前玩一下手机的人来说,也是个挺人性化的功能呢。
当然目前Android API还没有这个,不过我们还是可以在自己应用中给用户接口,让用户选择夜间模式,或者设置个时间段触发该功能。
写了个小Demo,简单了实现了切换夜间模式,总结一下:
在工程目录res/values/下新建attrs.xml,内容如下:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <attr name="btnColor" format="color" />
- <attr name="mainBackground" format="color" />
- <attr name="mainTextColor" format="reference|color" />
- <attr name="textString" format="string" />
- </resources>
然后就是在style中定义两种主题,每一种主题都要至少包含以上attrs中的几种属性:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <!-- 默认 -->
- <style name="MyThemeDefault" parent="@android:style/Theme">
- <item name="btnColor">#00ff00</item>
- <item name="mainBackground">#ffffff</item>
- <item name="mainTextColor">#000000</item>
- <item name="textString">默认主题</item>
- </style>
- <!-- 夜间 -->
- <style name="MyThemeNight" parent="@android:style/Theme">
- <item name="btnColor">#0000ff</item>
- <item name="mainBackground">#000000</item>
- <item name="mainTextColor">#ffffff</item>
- <item name="textString">夜间主题</item>
- </style>
- </resources>
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="?mainBackground"
- android:orientation="vertical" >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="?textString" />
- <ImageView
- android:id="@+id/ivBook"
- android:layout_width="62dip"
- android:layout_height="42dip"
- android:layout_gravity="center"
- android:layout_marginTop="0dip"
- android:gravity="center"
- android:src="?btnColor" />
- <Button
- android:id="@+id/btnSet"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="50dp"
- android:text="改变主题" />
- <Button
- android:id="@+id/btnGet"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="50dp"
- android:text="Get Flag" />
- </LinearLayout>
下面就是在Activiy中定义要使用那种主题了:
- public class MainActivity extends Activity {
- private boolean blFlag = false;
- private ImageView ivBook;
- private Button btnSet;
- private Button btnGet;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- this.setTheme(R.style.MyThemeDefault);
- setContentView(R.layout.main);
- btnSet = (Button) findViewById(R.id.btnSet);
- btnGet = (Button) findViewById(R.id.btnGet);
- ivBook = (ImageView) findViewById(R.id.ivBook);
- btnSet.setOnClickListener(new onClickListenerImp());
- btnGet.setOnClickListener(new onClickListenerImp());
- ivBook.setOnClickListener(new onClickListenerImp());
- }
- class onClickListenerImp implements OnClickListener {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- if (v == btnSet || v == ivBook) {
- if (blFlag) {
- setTheme(R.style.MyThemeDefault);
- blFlag = false;
- } else if (!blFlag) {
- setTheme(R.style.MyThemeNight);
- blFlag = true;
- }
- setContentView(R.layout.main);
- btnSet = (Button) findViewById(R.id.btnSet);
- btnGet = (Button) findViewById(R.id.btnGet);
- ivBook = (ImageView) findViewById(R.id.ivBook);
- btnSet.setOnClickListener(new onClickListenerImp());
- btnGet.setOnClickListener(new onClickListenerImp());
- ivBook.setOnClickListener(new onClickListenerImp());
- } else if (v == btnGet) {
- Toast.makeText(MainActivity.this, "blFlag: " + blFlag,
- Toast.LENGTH_SHORT).show();
- }
- }
- }
- }
要注意的是,在onClickListenerImp()类中的
- setContentView(R.layout.main);
到此,就实现了一个简单的主题切换实现夜间模式的小Demo。
有不明白的地方,欢迎交流。