2015-09-07 25 views
6

Trong ứng dụng của tôi manifest Tôi đã thêm android: configChanges để ngăn chặn hoạt động tải lại/khởi động lại trên xoayAndroid - ActionBar không thay đổi kích thước với onConfigurationChanged (AppCompat)

<activity 
    android:name=".MainActivity" 
    android:label="@string/app_name" 
    android:configChanges="orientation|keyboardHidden|screenSize" > 

nó hoạt động, nhưng supportActionBar (Tôi sử dụng AppCompat) duy trì chiều cao của mình với kích thước phông chữ nhỏ.

ActionBar nên lớn hơn trong bức chân dung và nhỏ trong phong cảnh, nhưng nó giữ các giá trị ban đầu:

  • nếu tôi bắt đầu trong cảnh quan, các actionbar ở lại mỏng trong bức chân dung
  • nếu tôi bắt đầu trong bức chân dung, các actionbar lại lớn trong cảnh quan

Loại bỏ android: configChanges = "định hướng | keyboardHidden | screensize" sự là giải pháp duy nhất mà tôi đã tìm thấy, nhưng khi khởi động lại ứng dụng trên xoay, và tôi cần phải preser đã nội dung ứng dụng

Bắt đầu từ bức chân dung enter image description here

Bắt đầu từ cảnh quan enter image description here

Bắt đầu từ cảnh quan và màn hình để bức chân dung (action bar nhỏ và chiều cao font chữ nhỏ) enter image description here quay

Trả lời

2

Bằng cách đặt android:configChanges="orientation|keyboardHidden|screenSize"

Bạn tuyên bố rằng bạn sẽ tự mình xử lý các thay đổi cấu hình này. Trong các trường hợp thông thường, bạn không nên đặt điều đó và cho phép Android tạo lại Hoạt động của bạn.

Edit:

Nếu bạn muốn giữ lại dòng android:configChanges, bạn phải ghi đè onConfigChanged() và thay đổi tất cả mọi thứ cần thiết cho bản thân, ví dụ kích thước của ActionBar/ToolBar.

+0

Có, nhưng tôi cần phải bảo toàn nội dung của mình .. Tôi nên làm gì? –

+1

Nội dung bạn bảo quản là gì? Bạn nên sử dụng onSaveInstanceState() –

+0

http://developer.android.com/training/basics/activity-lifecycle/recreating.html#SaveState kiểm tra liên kết này –

0

Nếu bạn muốn giữ android:configChanges, bạn có thể sử dụng để buộc 56dp toolbar chiều cao, sắp xếp các biểu tượng và khắc phục vấn đề văn bản nhỏ:

Toolbar XML:

<android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="56dp" 
     android:minHeight="56dp" 
     android:background="?attr/colorPrimary" 
     app:popupTheme="@style/AppTheme.PopupOverlay" 
     app:titleTextAppearance="@style/titleTextAppearance" /> 

Styles XML:

<style name="titleTextAppearance" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Title"> 
    <item name="android:textSize">20sp</item> 
</style> 
+0

hãy cẩn thận, mặc định cho sw600dp phải là '64dp' – 0101100101

0

Vì những người khác đã chỉ ra bạn nên lưu và khôi phục trạng thái mẫu thay vì xử lý cấu hình cha nges mình nếu có thể. Nếu bạn có lý do chính đáng để không làm điều đó, bạn có thể cố gắng cập nhật chiều cao và văn bản của thanh công cụ sau khi thay đổi cấu hình.

Mã sau đây sẽ hoạt động đối với phiên bản thư viện hỗ trợ là Toolbar. Các thuộc tính actionBarSize, titleTextAppearancesubtitleTextAppearance được cung cấp bởi thư viện hỗ trợ.

Mã giả định rằng bạn có thuộc tính tùy chỉnh appToolbarStyle được khai báo trong attrs.xml. Nếu bạn không cần điều đó, bạn có thể thay đổi mã để sử dụng trực tiếp R.style.Widget_AppCompat_Toolbar.

import android.support.v7.widget.Toolbar; 

... 

private Toolbar toolbar; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main_activity); 

    toolbar = findViewById(R.id.toolbar); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    updateToolbar(); 
} 

private void updateToolbar() { 
    if (toolbar == null) 
     return; 

    final Context context = toolbar.getContext(); 

    int[] attr = new int[] { R.attr.actionBarSize, R.attr.appToolbarStyle }; 
    int idxActionBarSize = 0; 
    int idxAppToolbarStyle = 1; 
    TypedArray a = context.obtainStyledAttributes(attr); 
    int actionBarSize = a.getDimensionPixelSize(idxActionBarSize, 0); 
    int appToolbarStyle = a.getResourceId(idxAppToolbarStyle, R.style.Widget_AppCompat_Toolbar); 
    a.recycle(); 

    if (actionBarSize != 0) { 
     ViewGroup.LayoutParams layoutParams = toolbar.getLayoutParams(); 
     if (layoutParams != null) { 
      layoutParams.height = actionBarSize; 
     } 

     toolbar.setMinimumHeight(actionBarSize); 
    } 

    attr = new int[] { R.attr.titleTextAppearance, R.attr.subtitleTextAppearance }; 
    int idxTitleTextAppearance = 0; 
    int idxSubtitleTextAppearance = 1; 
    a = context.obtainStyledAttributes(appToolbarStyle, attr); 
    int titleTextAppearance = a.getResourceId(idxTitleTextAppearance, 0); 
    int subtitleTextAppearance = a.getResourceId(idxSubtitleTextAppearance, 0); 
    a.recycle(); 

    if (titleTextAppearance != 0) { 
     toolbar.setTitleTextAppearance(context, titleTextAppearance); 
    } 

    if (subtitleTextAppearance != 0) { 
     toolbar.setSubtitleTextAppearance(context, subtitleTextAppearance); 
    } 

    toolbar.requestLayout(); 
} 
Các vấn đề liên quan