10

使用最新的AppCompat-v21庫,我使用ActionBarActivity來創建並填充PreferenceFragment。然而,當方向或屏幕尺寸改變時,ActionBar似乎沒有改變高度和文本大小。對其他活動也進行測試,此行爲似乎只發生在PreferenceActivity(與此處詢問的這個問題相反:ActionBar capacity/overflow not changing on orientation change)。PreferenceFragment中的ActionBar不重新計算高度和字體大小

首先,爲了處理方位變化,我在清單中添加了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(); 
    } 

} 

此行爲是一個錯誤?如果沒有,是否有解決方法或解決方法?


編輯我

我使用新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 2014-11-07 17:31:55

+0

您是否嘗試在styles.xml中定義'textSize'?有時候,當你沒有定義一個確定的值時,android會產生一個bug。你可以閱讀:http://stackoverflow.com/q/16189877/3922207和http://stackoverflow.com/a/12899367/3922207 – 2014-12-11 12:29:56

回答

3

android:configChanges不建議使用,因爲方向鍵盤不是活動休閒的唯一原因。

因此,更好的方法是將其從清單中刪除,並在Fragment類上設置setRetainInstance(true);。這將繞過碎片的這個摧毀和重新創建的循環,同時刷新活動。

由於Toolbar包含在Activity中而不是Fragment中,因此將刷新工具欄,同時保留片段。

在對話框的情況下,使用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,帶有棒棒糖工具欄和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中調用此方法。