2011-06-15 23 views
8

Tôi nhận thấy rằng có một vài bài đăng khác về chủ đề này, tuy nhiên các giải pháp cho những bài đăng đó không hiệu quả đối với tôi.Android onConfigurationChanged() không được gọi trong Hoạt động

Về cơ bản, tôi muốn ngừng Hoạt động của mình khởi động lại khi thay đổi hướng thiết bị. Để làm điều này, tôi đã sửa đổi hoạt động trong file manifest:

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

và tôi đã ghi đè trong Hoạt động của tôi:

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

    System.out.println("IN onConfigurationChanged()"); 
} 

Tuy nhiên, hoạt động này vẫn khởi động lại sau khi một sự thay đổi định hướng, và phương thức không được gọi.

Có ai biết tại sao điều này có thể xảy ra không?

Trả lời

1

Điều duy nhất hoạt động là sử dụng getLastNonConfigurationInstance(). http://developer.android.com/reference/android/app/Activity.html#getLastNonConfigurationInstance()

+0

Điều này đã giúp tôi. Tôi đã ghi đè phương thức này trong hoạt động TabWidget, bởi vì tất cả các hoạt động của tôi đều được tạo trong các tab. Mặc dù, các nhà phát triển Android cho biết phương pháp này không được chấp nhận ... Cảm ơn littleK. – lomza

0

nếu bạn định nghĩa configchanges = orientation trong tệp kê khai của mình thì hoạt động sẽ không khởi động lại mà thay vào đó onConfigurationChanged sẽ gọi như bạn hiện đã triển khai. Trước tiên, hãy thử đăng nhập bằng nhật ký lớp log (đây là cách thích hợp để đăng nhập mọi thứ trong android không sử dụng Hệ thống cho điều này được coi là thực hành không tốt) và trước siêu nhưng đó chỉ là 1% cơ hội đang xảy ra với bạn.

Trường hợp thứ hai là bạn có hoạt động hiện tại được lồng trong một tabHost ví dụ hoặc Nhóm hoạt động. nếu hoạt động của bạn có hoạt động gốc thì thay đổi cấu hình cần phải được thêm vào trong hoạt động đó và cuộc gọi lại sẽ xảy ra ở đó.

Nếu trường hợp đó xảy ra và bạn muốn chuyển tiếp kết quả hoặc cũng làm điều gì đó ở trẻ thì bạn cần có một tham chiếu đến đứa trẻ trong phụ huynh và gọi một phương thức trên đó để thay đổi.

+0

Hoạt động của tôi không kéo dài ListActivity, là ý bạn là gì? – littleK

+0

Không. tôi có nghĩa là có một bố trí tab với các hoạt động lồng nhau hoặc một cái gì đó như thế. một hoạt động danh sách không được lồng nhau nó chỉ là một loại hoạt động. – DArkO

1

Bạn không nên sử dụng setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); phương thức gọi bất kỳ nơi nào trong ứng dụng của bạn, điều này sẽ tránh gọi phương thức onConfigChanged().

-2

Modefiy phương pháp onConfigurationChanged của bạn như sau

public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    // Checks the orientation of the screen 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); 
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { 
     Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); 
    } 
} 
8

Bạn nên sử dụng 13 API và thiết lập cấu hình này trong một phần của hoạt động của bạn trong những biểu hiện: android: configChanges = "định hướng | keyboardHidden | screensize"

Nó hoạt động tốt. Ở tất cả các phiên bản Android.

+3

Có lẽ điều này hiển nhiên đối với tất cả mọi người ngoại trừ tôi, nhưng điều này nằm trong phần Hoạt động của tệp kê khai. –

+0

Đây là câu trả lời đúng và tốt nhất, trên android api 13+ sự kiện ScreenSize này được gọi và khởi động lại hoạt động nếu nó không được xử lý !! Cảm ơn bạn rất nhiều. – Darkendorf

+0

Nó hoạt động với android hoặc screenOrientation được xác định, hoặc với nó được đặt thành "fullSensor". "sensorPortrait" không hoạt động. – Robert

0

nếu bạn có một đoạn sau đó bạn cần điều này cũng:

void setRetainInstance(boolean retain) 

Kiểm soát việc một mảnh dụ được giữ lại trên Hoạt động tái tạo (chẳng hạn như từ một sự thay đổi cấu hình).

tôi chạy vào điều này và đặt nó thành 'true' cố định nó.

0

tôi đã sử dụng này, và nó giúp:

package="com.s2dio.evallet" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
android:minSdkVersion="8" 
android:targetSdkVersion="8" /> 
+3

KHÔNG, đây không phải là câu trả lời hay, bạn cần thêm tùy chọn screenSize vào onConfigChanges trong tệp kê khai để xử lý các phiên bản sdk +13 – Tobrun

1

Thay đổi biểu hiện của bạn để sau

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

và tham khảo liên kết này để giải thích chi tiết orientation issue

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