如何动态设置主题?
How to set themes dynamically?
我想为我的应用程序添加主题。为此,我添加了颜色选择器对话框。
当用户select应用程序颜色选择器主题的颜色应该改变时,我想改变导航栏和浮动按钮的颜色。
如何动态设置主题?
谢谢..
编辑:
设置Activity。
public class Settings extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final ColorPickerDialog colorPickerDialog = new ColorPickerDialog();
colorPickerDialog.initialize(R.string.dialog_title, new int[]{Color.CYAN, Color.LTGRAY, Color.BLACK, Color.BLUE, Color.GREEN, Color.MAGENTA, Color.RED, Color.GRAY, Color.YELLOW}, Color.YELLOW, 3, 2);
colorPickerDialog.setOnColorSelectedListener(new ColorPickerSwatch.OnColorSelectedListener() {
@Override
public void onColorSelected(int color) {
Toast.makeText(Settings.this, "selectedColor : " + color, Toast.LENGTH_SHORT).show();
}
});
LinearLayout theme = (LinearLayout)findViewById(R.id.theme);
theme.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
colorPickerDialog.show(getSupportFragmentManager(), "colorpicker");
}
});
}
}
您不能动态设置主题。但是,您可以在调用 setContentView
之前 设置主题 ,因此我建议您将主题存储在 SharedPreferences
中,当用户选择新主题时,重新启动 activity 并应用您的新主题。
您可以在 activity 中使用 setTheme()
并重新创建 activity
或
您可以在 activity 中使用 setTheme()
并手动设置颜色(工具栏背景、fab 颜色、状态栏颜色),如果您确切知道要更改哪些颜色。
请注意 setTheme()
动态设置主题,但它不会重绘您的 activity。所以在 setTheme()
之后重绘的所有内容都已经使用了您的新主题! (可以在 Lollipop's/Marchmallow 的最近使用的应用程序列表中看到 -> 即使不重新创建 activity,应用程序顶部的颜色也会在 setTheme()
后改变。
好像没有办法动态创建主题。所以我建议只提供一个选择预定义的主题(在 XML 中)并应用这些。完全动态颜色更改的解决方法是自己更改所有元素的颜色。我写了一个方法来为工具栏和操作栏执行此操作。所以这是基于 enum Colors {RED, GREEN, BLUE}
:
的方法
private void setColors(COLORS color) {
int toolbarColor = 0;
int statusbarColor = 0;
switch (color) {
case GREEN:
setTheme(R.style.AppTheme_NoActionBar_Green);
toolbarColor = R.color.green;
statusbarColor = R.color.greenDark;
break;
case RED:
setTheme(R.style.AppTheme_NoActionBar_Red);
toolbarColor = R.color.red;
statusbarColor = R.color.redDark;
break;
case BLUE:
setTheme(R.style.AppTheme_NoActionBar_Blue);
toolbarColor = R.color.blue;
statusbarColor = R.color.blueDark;
break;
}
mToolbar.setBackgroundColor(ContextCompat.getColor(MainActivity.this, toolbarColor));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setStatusBarColor(ContextCompat.getColor(MainActivity.this, statusbarColor));
}
}
其中 AppTheme.NoActionBar.Green、AppTheme.NoActionBar.Red 和 AppTheme.NoActionBar.Blue 扩展 AppTheme.NoActionBar 并且仅覆盖原色、原色深色和强调色。
我想为我的应用程序添加主题。为此,我添加了颜色选择器对话框。
当用户select应用程序颜色选择器主题的颜色应该改变时,我想改变导航栏和浮动按钮的颜色。
如何动态设置主题?
谢谢..
编辑:
设置Activity。
public class Settings extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final ColorPickerDialog colorPickerDialog = new ColorPickerDialog();
colorPickerDialog.initialize(R.string.dialog_title, new int[]{Color.CYAN, Color.LTGRAY, Color.BLACK, Color.BLUE, Color.GREEN, Color.MAGENTA, Color.RED, Color.GRAY, Color.YELLOW}, Color.YELLOW, 3, 2);
colorPickerDialog.setOnColorSelectedListener(new ColorPickerSwatch.OnColorSelectedListener() {
@Override
public void onColorSelected(int color) {
Toast.makeText(Settings.this, "selectedColor : " + color, Toast.LENGTH_SHORT).show();
}
});
LinearLayout theme = (LinearLayout)findViewById(R.id.theme);
theme.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
colorPickerDialog.show(getSupportFragmentManager(), "colorpicker");
}
});
}
}
您不能动态设置主题。但是,您可以在调用 setContentView
之前 设置主题 ,因此我建议您将主题存储在 SharedPreferences
中,当用户选择新主题时,重新启动 activity 并应用您的新主题。
您可以在 activity 中使用 setTheme()
并重新创建 activity
或
您可以在 activity 中使用 setTheme()
并手动设置颜色(工具栏背景、fab 颜色、状态栏颜色),如果您确切知道要更改哪些颜色。
请注意 setTheme()
动态设置主题,但它不会重绘您的 activity。所以在 setTheme()
之后重绘的所有内容都已经使用了您的新主题! (可以在 Lollipop's/Marchmallow 的最近使用的应用程序列表中看到 -> 即使不重新创建 activity,应用程序顶部的颜色也会在 setTheme()
后改变。
好像没有办法动态创建主题。所以我建议只提供一个选择预定义的主题(在 XML 中)并应用这些。完全动态颜色更改的解决方法是自己更改所有元素的颜色。我写了一个方法来为工具栏和操作栏执行此操作。所以这是基于 enum Colors {RED, GREEN, BLUE}
:
private void setColors(COLORS color) {
int toolbarColor = 0;
int statusbarColor = 0;
switch (color) {
case GREEN:
setTheme(R.style.AppTheme_NoActionBar_Green);
toolbarColor = R.color.green;
statusbarColor = R.color.greenDark;
break;
case RED:
setTheme(R.style.AppTheme_NoActionBar_Red);
toolbarColor = R.color.red;
statusbarColor = R.color.redDark;
break;
case BLUE:
setTheme(R.style.AppTheme_NoActionBar_Blue);
toolbarColor = R.color.blue;
statusbarColor = R.color.blueDark;
break;
}
mToolbar.setBackgroundColor(ContextCompat.getColor(MainActivity.this, toolbarColor));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setStatusBarColor(ContextCompat.getColor(MainActivity.this, statusbarColor));
}
}
其中 AppTheme.NoActionBar.Green、AppTheme.NoActionBar.Red 和 AppTheme.NoActionBar.Blue 扩展 AppTheme.NoActionBar 并且仅覆盖原色、原色深色和强调色。