Итак, вот ситуация:
- У меня есть
DogActivity
иFavoritesActivity
.DogActivity
- это простоListView
. Когда вы нажимаете наDog
в списке, вы переходите кFavoritesActivity
. - Я хочу иметь несколько готовых тем. Их не нужно создавать динамически. Они уже могут существовать в форме XML.
- В зависимости от того, какую собаку пользователь выбирает из списка, я хочу, чтобы
FavoritesActivity
отображался в одной из моих ранее существовавших тем.
Я слышал разговоры о ContextWrapper
, но не знаю, как это применить. Есть мысли о том, как я могу это сделать?
Подробности:
Вот обычная одиночная тема:
для v21 / styles.xml
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:colorControlHighlight">@color/colorAccentLight</item>
<item name="android:colorControlNormal">@color/colorAccent</item>
<item name="android:itemTextAppearance">@style/AppTheme.itemTextStyle</item>
<item name="popupMenuStyle">@style/PopupMenu.MyAppTheme</item>
</style>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:colorControlHighlight">@color/colorAccentLight</item>
</style>
<style name="AppTheme.itemTextStyle" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
<item name="android:textColor">@color/colorPrimary</item>
</style>
</resources>
для styles.xml
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
Хочу, я хочу делать:
По сути, я просто хочу изменить colorPrimary
, colorPrimaryDark
и colorAccent
на лету и иметь все стили, темы и макеты XML, которые используют их для изменения. Так что, если я смогу изменить эти цвета перед запуском FavoritesActivity
, это решит мои проблемы.
3 ответа
Вы можете просто отправить тип собаки как дополнительное намерение, а затем использовать метод setTheme()
для установки соответствующей темы.
В этом примере предположим, что у вас всего две темы:
<style name="AppThemeOne" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppThemeTwo" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimaryCustom</item>
<item name="colorPrimaryDark">@color/colorPrimaryDarkCustom</item>
<item name="colorAccent">@color/colorAccentCustom</item>
</style>
Затем в DogActivity установите Intent Extra для типа Dog, который пользователь выбрал из ListView:
Intent intent = new Intent(DogActivity.this, FavoritesActivity.class);
intent.putExtra("dog_type", "terrier");
startActivity(intent);
Затем в FavoritesActivity загрузите правильную тему:
@Override
protected void onCreate(Bundle savedInstanceState) {
String dogType = getIntent().getStringExtra("dog_type");
if (dogType.equals("terrier")) {
setTheme(R.style.AppThemeOne);
} else {
setTheme(R.style.AppThemeTwo);
}
super.onCreate(savedInstanceState);
setContentView(R.layout.favorites_layout);
//.....
}
В моем последнем проекте я сделал это довольно просто, вам просто нужно установить значения в теме через Java. Как следующий код:
public class FavoritesActivity extends AppCompatActivity { // it can be Activity too
@Override
public void onCreate(Bundle savedInstanceState) {
if( ... check condition to change theme ) {
// this will replace every value from FavoritesActivity theme by the
// the values on `other_style` theme.
getTheme().applyStyle(R.style.other_style, true);
}
// call super AFTER applying the theme
super.onCreate(savedInstanceState);
.. carry on your normal stuff
}
Это очень полезно, потому что вы можете очень легко заменить всего несколько значений и оставить остальные как оригинальные или изменить все по сравнению с оригиналом. Все зависит от того, какой аргумент вы передаете методу applyTheme
.
Также здорово, что вам не нужно издеваться над ContextThemeWrapper. Ценности есть по теме и все.
https://developer.android.com/reference /android/content/res/Resources.Theme.html#applyStyle(int, логическое)
Вы можете использовать для этого метод this.recreate()
.
На основании ответа https://stackoverflow.com/a/29722976/7547681.
Похожие вопросы
Связанные вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.