Android 切换应用主题风格

一直很希望Android有个系统全局功能:夜间模式。

就是在设置里提供一个ToggleButton,打开或者关闭夜间模式。同时在新的API里提供接口,对所有支持夜间模式的应用进行统一调度。打开总开关,默认开启其他第三方应用的夜间模式。然后也设置一个规则,可忽略某个软件。再自动化一些,可以设置个时间段,即默认开启夜间模式的时间段。

这个Feature的实现必然要第三方开发者支持。虽然有时候夜间模式看起来可有可无,但是对于喜欢睡前玩一下手机的人来说,也是个挺人性化的功能呢。

当然目前Android API还没有这个,不过我们还是可以在自己应用中给用户接口,让用户选择夜间模式,或者设置个时间段触发该功能。

写了个小Demo,简单了实现了切换夜间模式,总结一下:

在工程目录res/values/下新建attrs.xml,内容如下:




    
    
    
    


然后就是在style中定义两种主题,每一种主题都要至少包含以上attrs中的几种属性:




    
    

    
    


主题定义好了,然后就是在布局文件中引用了,里面有?号的地方就是引用以上定义的label:




    

    

    

下面就是在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);
这句后面,要重新绑定各组件及其监听器,不然只能监听一次。这是因为在setContentView后,组件不是之前那个组件了。

到此,就实现了一个简单的主题切换实现夜间模式的小Demo。

有不明白的地方,欢迎交流。


加入SharedPreference标志,可以记忆上次选用的风格,从而下次启动时不必重置。

sharedPreferences = getSharedPreferences("UseStyle", Context.MODE_WORLD_READABLE);
        isNight = sharedPreferences.getBoolean("isNight", false);
        if (isNight) {
            this.setTheme(R.style.MyThemeNight);
        } else {
            this.setTheme(R.style.MyThemeDefault);
        }

 public void onClick(View v) {
            if (v == btnSet) {
                Editor editor = sharedPreferences.edit();
                if (isNight) {
                    setTheme(R.style.MyThemeDefault);
                    isNight = false;
                } else {
                    setTheme(R.style.MyThemeNight);
                    isNight = true;
                }
                editor.putBoolean("isNight", isNight);
                editor.commit();

                setContentView(R.layout.main);
                btnSet = (Button) findViewById(R.id.btnSet);
                btnGet = (Button) findViewById(R.id.btnGet);
                btnSet.setOnClickListener(new onClickListenerImp());
                btnGet.setOnClickListener(new onClickListenerImp());
            } else if (v == btnGet) {
                Toast.makeText(Main.this, "isNight: " + isNight, Toast.LENGTH_SHORT).show();
            }
        }



转载请注明出处:周木水的CSDN博客 http://blog.csdn.net/zhoumushui


你可能感兴趣的:(Android)