Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何动态设置主题?_Java_Android_Dynamic_Android Theme_Color Picker - Fatal编程技术网

Java 如何动态设置主题?

Java 如何动态设置主题?,java,android,dynamic,android-theme,color-picker,Java,Android,Dynamic,Android Theme,Color Picker,我想将主题添加到我的应用程序中。为此,我添加了颜色选择器对话框 当用户从颜色选择器中选择颜色时,应用程序的主题应该改变,我想改变导航栏和浮动按钮的颜色 如何动态设置主题 谢谢 编辑: 设置活动 public class Settings extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(saved

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

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

如何动态设置主题

谢谢

编辑:

设置活动

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
之前设置主题,因此我建议您将主题存储在
SharedReferences
中,当用户选择新主题时,重新启动活动并应用新主题。

您可以在活动中使用
setTheme()
,然后重新创建活动

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

请注意,
setTheme()
动态设置主题,但不会重新绘制活动。因此,在
setTheme()
之后重新绘制的所有内容都已经使用了您的新主题!(可以在棒棒糖/MarchAllow的最近应用程序列表中看到->即使不重新创建活动,应用程序顶部的颜色在
setTheme()
之后也会改变)

似乎没有办法动态创建主题。因此,我建议只提供一个选择预定义的主题(XML)并应用这些主题。完全动态颜色更改的解决方法是自己更改所有元素的颜色。我为工具栏和actionbar写了一个方法。下面是基于
枚举颜色{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,仅覆盖原色、原色深色和强调色。

您能给我举个例子吗?活动有方法setTheme。在styles.xml中创建多个主题资源,并为方法提供不同的主题。请检查编辑的问题。这是我的设置活动。你能帮我通读一下那个密码吗?多谢各位@瓦伦丁·库恩:对不起,我昨天没有时间。我又查了一遍,似乎真的没有办法动态地创建一个主题。我建议只选择不同的预定义主题(用XML定义)并应用它们。一种解决方法是手动设置颜色,但这不会真正改变主/强调色。。。我写了一个基于枚举(这里是红色、绿色、蓝色)应用不同主题的方法,请参见下一篇评论。我无法将其放入评论中,而是编辑了我的答案