如何动态设置主题?

时间:2016-02-15 10:18:48

标签: java android dynamic android-theme color-picker

我想在我的应用程序中添加主题。为此,我添加了颜色选择器对话框。

当用户从应用程序的颜色选择器主题中选择颜色时应该更改,我想更改导航栏和浮动按钮的颜色。

如何动态设置主题?

谢谢..

编辑:

设置活动。

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");
            }
        });
    }

}

2 个答案:

答案 0 :(得分:1)

您可以在活动中使用setTheme()并重新创建活动
OR
如果您确切知道要更改的颜色,可以在活动中使用setTheme()并手动设置颜色(工具栏背景,工厂颜色,状态栏颜色)。

请注意setTheme()动态设置主题,但不会重绘您的活动。所以在setTheme()之后重新绘制的所有东西都已经使用了你的新主题! (可以在Lollipop&Marchslow的最新应用列表中看到 - >即使没有重新创建活动,应用顶部的颜色也会在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并仅覆盖主要颜色,主要深色和强调色。

答案 1 :(得分:0)

您无法动态设置主题。但是,您可以设置主题 之前调用setContentView,因此我建议您将主题存储在SharedPreferences中,当用户选择新主题时,重新启动活动并应用新主题。