Intereting Posts
Изменение цвета текста (строки) при отправке сообщения электронной почты Пользовательская кнопка входа в Facebook – Android Как справиться с развертыванием мобильных приложений на платформе с белой маркировкой? Получить номер и IMEI мобильного телефона Как отправить запрос HTTP POST и получить ответ? Создайте дополнительную таблицу в существующем SQLITE (без потери данных) Удаление программных продуктов Android SMS Android: Google MapView показывает индикатор прогресса во время загрузки карты Кто-нибудь имеет контрольные показатели (код и результаты), сравнивающие производительность приложений Android, написанных на Xamarin C # и Java? Android: список доступных доверенных корневых сертификатов Использование Kit Kat DatePicker в устройстве Lolipop Потоковое аудио AAC с Android Отключить анимацию анимации активности при запуске новой активности? Как реализовать NestedScrolling на Android? Android: статическая переменная null на низкой памяти

ActionBar в PreferenceFragment не пересчитывает высоту и размер шрифта

Используя последнюю библиотеку AppCompat-v21 , я использовал ActionBarActivity для создания и заполнения PreferenceFragment . Однако ActionBar не изменяет высоту и размер текста при изменении ориентации или размера экрана. Проверяя это на другие действия, это поведение, похоже, происходит только в PreferenceActivity (против этого вопроса, заданного здесь: емкость / переполнение ActionBar не меняется при изменении ориентации ).

Прежде всего, чтобы обрабатывать изменения ориентации, я добавил android:configChanges="keyboard|keyboardHidden|orientation|screenSize" в манифест. Я подозреваю, что это основная причина этой проблемы, но, как я уже упоминал ранее, это работает и в других Activity .

Вот несколько скриншотов, которые объясняют проблему:

Запущен PreferenceActivity в портретном режиме:

Портретное начало

Поворот к пейзажу из портрета:

Повернуть в пейзаж

Запущен PreferenceActivity в ландшафтном режиме:

пейзаж

Поворот в портрет из пейзажа:

Повернуть на портрет

Дополнительная информация

Вот класс PreferenceActivity :

 import android.os.Bundle; import android.support.v7.app.ActionBarActivity; public class PrefsActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragment()).commit(); } } 

Это ошибка? Если нет, есть ли обходной путь или исправление?


EDIT I

Я попытался использовать новый виджет ToolBar , но не повезло.

 import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.Toolbar; public class PrefsActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_preference); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_pref); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getFragmentManager().beginTransaction().replace(R.id.pref_frame, new PrefsFragment()).commit(); } } 

Solutions Collecting From Web of "ActionBar в PreferenceFragment не пересчитывает высоту и размер шрифта"

android:configChanges не рекомендуется, так как ориентация, клавиатура не являются единственными причинами активного отдыха.

Итак, лучший подход – удалить это из манифеста и установить setRetainInstance(true); По классу Fragment . Это обходит этот цикл уничтожения и воссоздания фрагмента, обновляя Activity.

Поскольку Toolbar включена в «Активность», а не «Фрагмент», это обновит панель инструментов, сохранив фрагмент.

В случае Dialogs, использование жизненного цикла фрагментов для закрытия / повторного открытия будет работать.

Источник: http://developer.android.com/guide/topics/resources/runtime-changes.html

Я могу предложить это решение.

Работает с системой ActionBar, с панелью инструментов Lollipop и панелью инструментов AppCompat.

 public static void fixActionBar(Activity activity, View toolbar) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (toolbar == null) { int id = activity.getResources().getIdentifier("action_bar", "id", "android"); if (id != 0) toolbar = (Toolbar) activity.findViewById(id); } if (toolbar != null) { Context context = toolbar.getContext(); TypedArray typedArray = context.obtainStyledAttributes(new int[] {android.R.attr.actionBarStyle, android.R.attr.actionBarSize}); int actionStyle = typedArray.getResourceId(0, 0); int actionHeight = typedArray.getDimensionPixelSize(1, 0); typedArray.recycle(); try { View container = (View) toolbar.getParent(); Field field = container.getClass().getDeclaredField("mHeight"); field.setAccessible(true); field.setInt(container, actionHeight); View overlay = (View) container.getParent(); field = overlay.getClass().getDeclaredField("mActionBarHeight"); field.setAccessible(true); field.setInt(overlay, actionHeight); } catch (Exception e) { } toolbar.getLayoutParams().height = actionHeight; toolbar.setMinimumHeight(actionHeight); typedArray = context.obtainStyledAttributes(actionStyle, new int [] {android.R.attr.titleTextStyle}); ((Toolbar) toolbar).setTitleTextAppearance(context, typedArray.getResourceId(0, 0)); typedArray.recycle(); } } } 

Вызовите этот метод из onConfigurationChanged вашей деятельности.

Другие действия, которые вы тестировали, также имеют android:configChanges объявлены в манифесте?

Как вы сказали, проблема в том, что

 android:configChanges="keyboard|keyboardHidden|orientation|screenSize" 

Не обрабатывает вращение. Это фактически останавливает активность и представления от воссоздания, заставляя представления не читать соответствующие значения после изменения конфигурации.

Учитывая тот факт, что вы используете фрагменты, я бы android:configChanges атрибут android:configChanges и сохранил экземпляр PrefsFragment .