Как установить всю тему приложения программно? - PullRequest
0 голосов
/ 11 октября 2019

Я могу установить тему приложения в манифесте, например, так:

<application>
     android:theme="@style/AppTheme.NoActionBar"
<!-- Activities here -->
</application>

Я также знаю, как установить тему действия как в манифесте, так и программно.

Я хотел бы знать, как программно установить тему всего приложения (я планирую разрешить пользователю выбирать между несколькими темами).

Одним из решений будет применение выбранной темы ко всем действиям в onCreate методов, но у меня довольно много занятий. Есть ли более простое решение?

1 Ответ

3 голосов
/ 11 октября 2019

Как вы можете видеть в этом сообщении, невозможно установить целую тему приложения, как вы ожидаете. Но вы можете установить тему в настройке Activity, используя объект SharedPreference, и применить свою тему в каждой активности, которую вы хотите:

//A method that return your styles id
int style_var=getStyle();

SharedPreferences.Editor editor 
=getSharedPreferences("mypref", 
MODE_PRIVATE).edit();
editor.putInt("idName", style_var); 
editor.apply();

И в Any Activity реализуйте этот фрагмент кода перед super.onCreate (saveInstanceState):

SharedPreferences prefs = 
getSharedPreferences("mypref", 
MODE_PRIVATE);
int styleId = prefs.getInt("idName", 
R.style.defaultStyle);
//set Activity theme 
setTheme(styleId);

Обновление: И чтобы избежать дублирования кода, создайте пользовательский класс действий, подобный этому:

 public class myBaseActivity extends Activity{

@Override
public void onCreate(Bundle savedInstanceState)
{
    SharedPreferences prefs = 
        getSharedPreferences("mypref",MODE_PRIVATE);
    int styleId = prefs.getInt("idName",R.style.AppTheme);
    //set Activity theme 
    setTheme(styleId);

    super.onCreate(savedInstanceState);
}
}

, и вместо этого просто расширьте свои действия из пользовательского действияиз Activity:

public class AnyActivity extends 
myBaseActivity{
@Override
public void onCreate(Bundle 
savedInstanceState)
{
super.onCreate(savedInstanceState);
    setContentView(R.layout.any);
}
}

и, наконец, в настройках Activity внедрите этот фрагмент кода для перезагрузки приложения (например, поместите его в метод Onclick кнопки «Сохранить и перезагрузить»):

Intent intent = new Intent(SettingActivityClass.this, YourAppMainActivity.class);
//replace YourAppMainActivity with SettingActivityClass if you want to stay in setting activity on reload
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
                    Intent.FLAG_ACTIVITY_CLEAR_TASK |
                    Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...