2016-02-15 6 views
0

Я пытаюсь динамически изменять тему приложения. У меня есть два вида деятельности: один - основной, а другой - активность.Тема не задана Основная активность

В настройках активности Меняю тему из диалога выбора цвета, когда цвет выбран, тема изменена. Но тема только получает изменения для активности настроек, а не основной деятельности.

Я попытался отправить значения цвета из настроек активности в основное действие, но доза приложения не запускается. Он показывает только пустой экран.

Когда я отлаживал, я узнал, что он застрял на первом 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); 

Спасибо.

+0

Когда вы создаете экземпляры 'MainActivity' и' Settings'? – aribeiro

+0

метод changeToTheme, в этом случае активность возвращается, когда пользователь выбирает цвет из диалогового окна выбора цвета. Экземпляр основной деятельности не создается, когда я отжимаю тему активности, а не chanegd. – Sid

ответ

2

В вашем Settings классе вы пишете выбранный цвет в "MyPrefs" предпочтений, но в вашем MainActivity ваш завершат чтение "MyPref" (без S) предпочтений.

У вас уже была постоянная общественность MyPREFERENCES, попробуйте использовать ее и в MainActivity.

+0

спасибо .. Я изменил это, но все же проблема такая же. @ Василий Кабунов – Sid

+0

После этого вы отлаживали «MainActivity»? Это значение 'no' еще 0? –