Android切り替えアプリケーションテーマスタイル

6046 ワード

Androidには、夜間モードというシステムのグローバル機能があることをずっと望んでいます.
設定にToggleButtonを提供し、夜間モードをオンまたはオフにします.同時に新しいAPIにインタフェースを提供し,夜間モードをサポートするすべてのアプリケーションを統一的にスケジューリングする.総スイッチをオンにすると、デフォルトでは他のサードパーティアプリケーションの夜間モードがオンになります.次に、ソフトウェアを無視するルールも設定します.さらに自動化すると、夜間モードがデフォルトでオンになっている時間帯を設定できます.
このFeatureの実現には必ずサードパーティ開発者のサポートが必要です.夜間モードはあってもなくてもいい場合もありますが、寝る前にスマホをいじるのが好きな人にとっては、人間的な機能ですね.
もちろん、Android APIにはまだこれがありませんが、自分のアプリケーションでユーザーにインタフェースを与えたり、夜間モードを選択したり、時間帯を設定して機能をトリガーしたりすることができます.
小さなDemoを書いて、簡単に夜間モードの切り替えを実現しました.まとめてみます.
プロジェクトディレクトリres/values/の下にattrsを新規作成します.xml、内容は以下の通りです.



    
    
    
    


次にstyleで2つのトピックを定義します.各トピックには、少なくとも以上の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();
			}
		}

	}

}

注意すべきは、onClickListener Imp()クラスの
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