Java 转换主题

Java 转换主题,java,android,android-theme,Java,Android,Android Theme,我想在我的应用程序中添加多个主题,以允许用户在运行时更改应用程序主题。我在网上找到了我已经成功添加到我的应用程序中的代码,但我只能更改一个活动的主题,这并不是我真正的意图。当用户在“主题设置”活动中更改主题时,我需要在所有活动中应用该更改 ThemeActivity.java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); the

我想在我的应用程序中添加多个主题,以允许用户在运行时更改应用程序主题。我在网上找到了我已经成功添加到我的应用程序中的代码,但我只能更改一个活动的主题,这并不是我真正的意图。当用户在“主题设置”活动中更改主题时,我需要在所有活动中应用该更改

ThemeActivity.java

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    themeUtils.onActivityCreateSetTheme(this);
    setContentView(R.layout.activity_theme);


    blackbtn = findViewById(R.id.blackbutton);
    bluebtn = findViewById(R.id.bluebutton);

    blackbtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            themeUtils.changeToTheme(ThemeActivity.this, themeUtils.BLACK);
        }
    });

    bluebtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            themeUtils.changeToTheme(ThemeActivity.this, themeUtils.BLUE);
        }
    });

}
public class themeUtils
{

private static int cTheme;
public final static int BLACK = 0;
public final static int BLUE = 1;

public static void changeToTheme(Activity activity, int theme)
{
    cTheme = theme;
    activity.finish();
    activity.startActivity(new Intent(activity, activity.getClass()));
}

public static void onActivityCreateSetTheme(Activity activity)
{
    switch (cTheme)
    {

        default:
        case BLACK:
            activity.setTheme(R.style.BlackTheme);
            break;
        case BLUE:
            activity.setTheme(R.style.BlueTheme);
            break;
    }
}
ThemeUtils.java

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    themeUtils.onActivityCreateSetTheme(this);
    setContentView(R.layout.activity_theme);


    blackbtn = findViewById(R.id.blackbutton);
    bluebtn = findViewById(R.id.bluebutton);

    blackbtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            themeUtils.changeToTheme(ThemeActivity.this, themeUtils.BLACK);
        }
    });

    bluebtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            themeUtils.changeToTheme(ThemeActivity.this, themeUtils.BLUE);
        }
    });

}
public class themeUtils
{

private static int cTheme;
public final static int BLACK = 0;
public final static int BLUE = 1;

public static void changeToTheme(Activity activity, int theme)
{
    cTheme = theme;
    activity.finish();
    activity.startActivity(new Intent(activity, activity.getClass()));
}

public static void onActivityCreateSetTheme(Activity activity)
{
    switch (cTheme)
    {

        default:
        case BLACK:
            activity.setTheme(R.style.BlackTheme);
            break;
        case BLUE:
            activity.setTheme(R.style.BlueTheme);
            break;
    }
}

创建一个基本活动并从中扩展所有其他活动,然后在基本活动的onCreate方法中设置主题,如:

public abstract class BaseActivity extends AppCompatActivity{
    private int theme;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(theme);
    }
}

private void setTheme(int theme){
    this.theme = theme;
}
然后,当您要更改主题时,只需在主题中设置另一个主题资源id并重新启动活动:

setTheme(R.style.AppThemeChristmas);
Intent intent = getIntent();
finish();
startActivity(intent);

使用属性值设置颜色

对于exmaple,以下是textview的颜色

<attr name="textviewcolor" format="color"></attr>
建议:使用SharedReference给出主题名称

然后创建一个抽象类,通过扩展该类为所有活动设置主题

                      <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="text"
                        android:textColor="?attr/textviewcolor"/>
public class ThemeUtil {

public static final int THEME_DEFAULT=1;
public static final int THEME_DARK=2;
public static final int ALERTTHEME=3;
public static final int ALERTTHEMEDARK=4;



public static int getThemeId(int theme){
    int themeId=0;
    switch (theme){

        case THEME_DARK:
            themeId = R.style.AppTheme_Dark;
            break;

        case THEME_DEFAULT :
            themeId = R.style.AppTheme;
            break;

        default:
            break;
    }
    return themeId;
}}
public class ChangethemeActivity extends AppCompatActivity{

@Override
protected void onCreate(@Nullable Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    //get your theme name using sharedpreference and check what you have saved in theme name value

    if(dark){
    setTheme(ThemeUtil.getThemeId(1));
    }
    else{
      setTheme(ThemeUtil.getThemeId(2));
    }  }}}
最后:在活动中使用更改活动中的活动而不是要更改主题的活动中的活动


这是我实现应用程序主题更改功能的方法。如果这解决了您的问题,请告诉我。

好吧,这与我的答案相同,但添加了一个实用程序。这是一个很好的实用程序,代码少。我不太理解你的代码。没有按钮来改变主题?你如何设置你的视图的颜色,比如布局和文本视图@Eric@Blackmamba我真正想在我的应用程序中做的是允许用户在使用应用程序时通过点击某种按钮来切换主题,就像我在问题中提供的代码一样,我认为你的代码解决不了这个问题。你让它变得更复杂了。Eric在问onClickListener中的代码是什么。你告诉他使用SharedReference,他似乎不明白,如果你在首选项中举例更改主题,效果会更好@黑曼巴