Android – 在onClick上更改应用主题
我知道有一种方法来改变button点击的应用程序的默认主题。 Blackmart开发者已经做到了。 我已经search了1000页像谷歌,但我发现这只是(不工作)
getApplication().setTheme(Theme.Holo)
因为我已经在res / values / styles.xml中创build了一个新的样式,还有其他的方式来dynamic地改变它吗? 即使重新启动应用程序?
以下博客可以解决你的问题:
http://mrbool.com/how-to-change-the-layout-theme-of-an-android-application/25837
复制博客代码以供快速参考:
假设您已经在XML文件R.style.FirstTheme
, R.style.SecondTheme
和R.style.ThirdTheme
定义了以下三个主题
import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; public class ChangeThemeActivity extends Activity implements OnClickListener { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Utils.onActivityCreateSetTheme(this); setContentView(R.layout.main); findViewById(R.id.button1).setOnClickListener(this); findViewById(R.id.button2).setOnClickListener(this); findViewById(R.id.button3).setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.button1: Utils.changeToTheme(this, Utils.THEME_DEFAULT); break; case R.id.button2: Utils.changeToTheme(this, Utils.THEME_WHITE); break; case R.id.button3: Utils.changeToTheme(this, Utils.THEME_BLUE); break; } } }
让我们在“Utils”文件中写下面的代码:
import android.app.Activity; import android.content.Intent; public class Utils { private static int sTheme; public final static int THEME_DEFAULT = 0; public final static int THEME_WHITE = 1; public final static int THEME_BLUE = 2; /** * Set the theme of the Activity, and restart it by creating a new Activity of the same type. */ public static void changeToTheme(Activity activity, int theme) { sTheme = theme; activity.finish(); activity.startActivity(new Intent(activity, activity.getClass())); } /** Set the theme of the activity, according to the configuration. */ public static void onActivityCreateSetTheme(Activity activity) { switch (sTheme) { default: case THEME_DEFAULT: activity.setTheme(R.style.FirstTheme); break; case THEME_WHITE: activity.setTheme(R.style.SecondTheme); break; case THEME_BLUE: activity.setTheme(R.style.Thirdheme); break; } } }
希望它有帮助…
编辑1:
以下是AlertDialog
不采用自定义主题的原因:
在Builder.create()中的实现是:
public AlertDialog create() { final AlertDialog dialog = new AlertDialog(P.mContext); P.apply(dialog.mAlert); [...] }
它调用AlertDialog的“not-theme-aware”构造函数,如下所示:
protected AlertDialog(Context context) { this(context, com.android.internal.R.style.Theme_Dialog_Alert); }
AlertDialog中有第二个构造函数用于更改主题:
protected AlertDialog(Context context, int theme) { super(context, theme); [...] }
build设者只是不打电话。
看看下面的post,了解更多相关的修补程序
如何更改AlertDialog的主题
以下是最被投票的答案:
new AlertDialog.Builder( new ContextThemeWrapper(context, android.R.style.Theme_Dialog))