代码之家  ›  专栏  ›  技术社区  ›  Sid

主题未设置在主活动上

  •  0
  • Sid  · 技术社区  · 9 年前

    我正在尝试动态更改应用程序的主题。我有两个活动,一个是主要活动,另一个是设置活动。

    在设置活动中,当选择颜色时,我会从颜色选择器对话框中更改主题,主题也会更改。但主题只是在设置活动中得到改变,而不是在主要活动中。

    我尝试将颜色值从设置活动发送到主活动,但应用程序无法启动。它只显示空白屏幕。

    当我进行调试时,我发现它首先被卡住了 if(n==0){} ,并且循环继续,它不会结束。

    没有弄错什么。

    也可能是当我从设置活动中回来时,主活动不会被刷新。如何刷新主要活动?

    设置活动:

    public class Settings extends AppCompatActivity {
    
        int no;
    
        public static final String MyPREFERENCES = "MyPrefs" ;
        public static final int color = 0;
        public static final int color_2 = 0;
        public static final int color_3 = 0;
        SharedPreferences sharedpreferences;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
    
            Theme.onActivityCreateSetTheme(this);
    
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_settings);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
    
    
            sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
    
    
    
            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) {
    
                    if (color == Color.CYAN) {
                        Theme.changeToTheme(Settings.this, Theme.THEME_DEFAULT);
                        no = 0;
                    }
                    else if (color == Color.LTGRAY)
    
                    {
                        Theme.changeToTheme(Settings.this, Theme.THEME_WHITE);
                        no = 1;
                    }
                    else if (color == Color.BLACK) {
    
                        Theme.changeToTheme(Settings.this,Theme.THEME_BLUE);
                        no = 3;
    
                    }
                    Toast.makeText(Settings.this, "selectedColor : " + color, Toast.LENGTH_SHORT).show();
                }
    
            });
    
            SharedPreferences.Editor editor = sharedpreferences.edit();
    
            editor.putInt("color",no);
          //  editor.putInt("color_2",no);
          //  editor.putInt("color_3",no);
            editor.commit();
    
            LinearLayout theme = (LinearLayout)findViewById(R.id.theme);
    
            theme.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    colorPickerDialog.show(getSupportFragmentManager(), "colorpicker");
                }
            });
        }
    
    }
    

    主题:

        public class Theme {
    
        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();
            Intent i = new Intent(activity,activity.getClass());
            activity.startActivity(i);
        }
    
        /** 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.AppTheme);
                    break;
    
                case THEME_WHITE:
    
                    activity.setTheme(R.style.AppTheme_Solarized);
                    break;
    
                case THEME_BLUE:
    
                    activity.setTheme(R.style.BlueTheme);
    
                    break;
    
            }
        }
    }
    

    主要活动:

    public class MainActivity extends AppCompatActivity {
    
    private NavigationView navigationView;
    private DrawerLayout drawerLayout;
    Toolbar mToolbar;
    private MainFragment mFragment;
    private int no,no1,no2;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
       SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
    
    
        no = pref.getInt("color",0);
    
    
        if(no == 0)
        {
            setTheme(R.style.AppTheme);
        }
    
        else if(no == 1)
        {
            setTheme(R.style.AppTheme_Solarized);
        }
    
        else if(no == 2)
        {
            setTheme(R.style.BlueTheme);
        }
    
       // Theme.onActivityCreateSetTheme(this);
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    

    非常感谢。

    2 回复  |  直到 9 年前
        1
  •  2
  •   Vasily Kabunov Yashvir yadav    9 年前

    在您的 Settings 将所选颜色写入的类 "MyPrefs" 首选项,但在您的 MainActivity 您正在阅读 "MyPref" (无S)首选项。

    您已经拥有公共常量 MyPREFERENCES ,尝试在 主要活动 而且

        2
  •  0
  •   Murat K.    3 年前

    当我改变第二个活动的主题时,我无法改变第一个活动的。 我在两个活动中都写了这段代码

    ChangeThemes.onActivityCreateSetTheme(this);
    

    就在之前

     super.onCreate(savedInstanceState);
    

    它奏效了!