10

Используя последнюю библиотеку AppCompat-v21, я использовал ActionBarActivity для создания и заполнения PreferenceFragment. Тем не менее, ActionBar, похоже, не изменяет высоту и размер текста при изменении ориентации или размера экрана. Испытывая это на других мероприятиях, это поведение, по-видимому, происходит в PreferenceActivity (в отличие от этого вопроса, заданного здесь: ActionBar capacity/overflow not changing on orientation change).ActionBar in PreferenceFragment не пересчитывает высоту и размер шрифта

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

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

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

Portrait start

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

rotate to landscape

запускаемых PreferenceActivity в Пейзажный режим:

landscape

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

rotate to portrait

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

Вот 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 Я

Я попытался использовать новый 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(); 
    } 

} 
+0

Такая же проблема здесь. Но в моем случае размер шрифта слишком мал в ландшафте, независимо от того, как он запущен ... – Zordid

+0

Вы пытались определить 'textSize' в styles.xml? Иногда у андроида появляется ошибка, когда вы не определяете определенное значение. Вы можете прочитать это: http://stackoverflow.com/q/16189877/3922207 и http://stackoverflow.com/a/12899367/3922207 –

ответ

3

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

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

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

В случае диалогов использование Fragment Lifecycle для их закрытия/повторного открытия будет работать.

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

0

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

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

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

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

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

3

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

Работает с системой 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 вашей деятельности.