2011-06-23 83 views
36

Tôi gặp sự cố khi yêu cầu Android không gọi onCreate() khi định hướng thay đổi. Tôi đã thêm android:configChanges="orientation" vào tệp kê khai của mình nhưng vẫn khi định hướng thay đổi onCreate() được gọi. Đây là mã của tôi.Android onConfigurationThay đổi không được gọi là

AndroidManifest.xml

<activity android:name="SearchMenuActivity" android:theme="@android:style/Theme.NoTitleBar" android:configChanges="orientation"></activity> 

SearchMenuActivity.java

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // Set the current layout to the search_menu 
    setContentView(R.layout.search_menu_activity); 

    Log.d(TAG, "onCreate() Called"); 
} 
@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    //don't reload the current page when the orientation is changed 
    Log.d(TAG, "onConfigurationChanged() Called"); 
    super.onConfigurationChanged(newConfig); 
} 

Và LogCat tôi Output

06-23 12:33:20.327: DEBUG/APP(2905): onCreate() Called 
//Orientation Changes 
06-23 12:33:23.842: DEBUG/APP(2905): onCreate() Called 

Có ai biết những gì tôi đang làm sai? Cảm ơn.

Trả lời

51

Một vài điều để thử:

android:configChanges="orientation|keyboardHidden|screenSize" hơn android:configChanges="orientation"

Đảm bảo rằng bạn không gọi setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); bất cứ nơi nào. Điều này sẽ gây ra onConfigurationChange() để không kích hoạt.

Kiểm tra xem bạn có đang sử dụng android:screenOrientation trong tệp kê khai của mình không.

Nếu không có cách nào trong số đó hoạt động, hãy đọc qua tài liệu Android về xử lý thay đổi thời gian chạy và đảm bảo bạn đang làm mọi thứ chính xác. Có thể có điều gì đó khác trong mã của bạn đang gây ra sự cố. http://developer.android.com/guide/topics/resources/runtime-changes.html

EDIT: Như đã được chỉ ra, tôi giả định rằng bạn đang thay đổi cấu hình bằng gia tốc kế phát hiện cách thiết bị đang đối mặt. Nếu bạn muốn cấu hình thay đổi khi bàn phím được hiển thị/ẩn thì các cấu hình trong tệp kê khai phải bao gồm cả keyboardHidden.

+6

đối với tôi, mẹo này là sử dụng android: configChanges = "orientation | keyboardHidden | screenSize" –

5

Bạn nên thay đổi mục configChanges trong AndroidManifest.xml để:

android:configChanges="keyboardHidden|orientation" 

Nếu không, trượt bàn phím không kích hoạt onConfigurationChange() mặc dù những thay đổi hướng. Tôi chỉ thử nghiệm này trên HTC Desire Z. tôi

+0

Trong trường hợp của tôi, nó chỉ hoạt động khi tôi thêm "| screenSize". –

+0

câu trả lời này không còn giá trị, do những thay đổi trong sdk – Entreco

78

này được Gremlin của tôi cho ~ cùng một vấn đề:

Chú ý: Bắt đầu với Android 3.2 (API mức 13), các "kích thước màn hình" cũng thay đổi khi thiết bị chuyển giữa hướng dọc và ngang hướng. Do đó, nếu bạn muốn ngăn khởi động lại thời gian chạy do thay đổi hướng khi phát triển cho API cấp 13 trở lên (như được khai báo bởi thuộc tính minSdkVersion và targetSdkVersion), bạn phải bao gồm giá trị "screenSize" ngoài "định hướng" Giá trị . Tức là, bạn phải decalare android: configChanges = "orientation | screenSize". Tuy nhiên, nếu cấp API ứng dụng 12 hoặc thấp hơn, thì hoạt động của bạn luôn là xử lý thay đổi cấu hình này (thay đổi cấu hình này không khởi động lại hoạt động của bạn, ngay cả khi chạy trên thiết bị cao hơn Android 3.2 hoặc ).

(Từ http://developer.android.com/guide/topics/resources/runtime-changes.html)

TL; DR: thêm "| screensize" để android: configChanges = "định hướng" cho API 14 +

+7

+1 bạn là người đàn ông! – lorenzoff

+2

Awesome ... sau khi thay đổi targetSdkVersion của tôi từ 8 đến 14 Tôi đã tự hỏi tại sao onConfigurationChanged() không được gọi. – dell116

+0

Thanx .. đã giúp tôi rất nhiều .. – Rekha

10

Hãy thử sử dụng cái này .....

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

Thêm mục này vào tệp kê khai của bạn cho từng hoạt động.

android:configChanges="keyboardHidden|orientation|screenSize" 

Sau đó, ghi đè onConfigurationChanged trên hoạt động của bạn như vậy

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

Nó không được kích hoạt trong tôi Fragment (Fragments không đăng ký tại AndroidManifest.xml) vì vậy tôi đã phải di chuyển nó vào Activity quản lý số điện thoại Fragment của tôi, trong trường hợp của tôi là TabsPagerActivity.

1

Manifest:

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

Hoạt động & Fragment:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    Log.d(TAG, "onConfigurationChanged " + 
       (newConfig.orientation 
       == Configuration.ORIENTATION_LANDSCAPE 
       ? "landscape" : "portrait")); 
} 

Output:

10-29 21:53:26.951 D/FragmentOne: onConfigurationChanged landscape 

10-29 21:53:26.951 D/MainActivity:onConfigurationChanged landscape 
1

vài điều có thể được kiểm tra chéo:

Trong trường hợp của tôi, tôi đã theo dõi thay đổi ngôn ngữ của thiết bị bằng cách sử dụng onConfigurationChanged.

Một số điều cần biết về onConfigurationChanged có sự khác biệt về hành vi giữa onConfigurationChanged của hoạt động và ứng dụng.

Khi bạn thay đổi cấu hình của thiết bị, mức ứng dụng onConfigurationChanged sẽ được gọi tự động và ngay lập tức nhưng onConfigurationThay đổi hoạt động sẽ gọi khi bạn điều hướng đến hoạt động đó.

và điều khác là chỉ locale trong manifest sẽ không làm việc đôi khi Vì vậy, bạn có tuyên bố sự kiện thay đổi cấu hình khác cùng với các địa phương (trong trường hợp của tôi) rằng nên như thế android: configChanges = "layoutDirection | locale"

Các vấn đề liên quan