onConfigurationChanged không được gọi


141

Sáng nay tôi đã đưa ra một vấn đề cố gắng xử lý onConfigurationChangedsự kiện này. Vấn đề là phương thức mà tôi ghi đè, không được gọi khi tôi thay đổi hướng của điện thoại. Không được gọi gì cả.

Tôi đã đưa android:configChanges="orientation"vào hoạt động được xác định trong tệp kê khai như được đề cập trong tài liệu Android, nhưng điều này không tạo ra sự khác biệt.

Bạn đã đưa ra vấn đề này?


1
Tôi đang gặp vấn đề tương tự với android: configChanges = "keyboardHidden" - onConfigurationChanged không được gọi khi bàn phím mềm trượt vào hoặc ra.
Pieter Witvoet

keyboardHidden không được kích hoạt bởi bàn phím phần mềm, chỉ bằng bàn phím phần cứng, giống như bàn phím trượt trên Droid.
nmr

10
Bạn nên thêm "screenSize" trong android:configChanges Đây là những gì google javadoc đã nói: Note: If your application targets API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), then you should also declare the "screenSize" configuration, because it also changes when a device switches between portrait and landscape orientations.
Ektos974

@ Ektos974 thật tuyệt! thêm screenSize sẽ gọi onConfigurationChanged!
Manuela

Xin chào, tôi đang sử dụng Theme.Holo.Light.NoActionBar. Đối với điều này, hoạt động của tôi đang khởi động lại. Có cách nào để tránh các hoạt động để bắt đầu lại?
Manukumar

Câu trả lời:


250

Đây là gremlin của tôi cho cùng một vấn đề:

Thận trọng: Bắt đầu với Android 3.2 (API cấp 13), "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à hướng ngang. 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 cấp API 13 trở lên (như được khai báo bởi các thuộc tính minSdkVersion và targetSdkVersion), bạn phải bao gồm giá trị "screenSize" bên cạnh giá trị "direction". Đó là, bạn phải decalare android: configChanges = "direction | screenSize". Tuy nhiên, nếu ứng dụng của bạn nhắm mục tiêu API cấp 12 trở xuống, thì hoạt động của bạn luôn tự 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ị Android 3.2 trở lên).

(Từ http://developer.android.com/guide/topics/resource/r nb-changes.html )

TL; DR: thêm "| screenSize" vào configChanges khi nhắm mục tiêu cấp API 13+


9
wow, chỉ là một thuộc tính duy nhất được thêm vào và chết tiệt, đó là +1từ phía tôi "screenSize".
Anuj

@philipp Điều gì sẽ thiết lập định hướng cho cảm biến đạt được? Không chắc làm thế nào sẽ hữu ích. Cảm ơn đã chỉnh sửa mặc dù.
nmr

4 năm sau mọi người vẫn bị cắn bởi điều này :)
Daniel Wilson

Cảm ơn. Đã dành 30 phút đập đầu tôi vào tường.
lagos

Đây là giải pháp hoàn hảo
Anbarasu Chinna 19/12/17

40

Một số thiết bị 4.0 không gọi onConfigurationChanged. Chỉ cần thêm một người nghe để sàng lọc kích thước quá.

android:configChanges="orientation|screenSize"

Điều này đã giải quyết vấn đề của tôi. Ghi đè onConfigurationChanged, kiểm tra chống lại Configuration.ORIENTATION_LANDSCAPEvà bao gồm CHỈ android:configChanges="orientation"trong bảng kê khai là không đủ cho máy tính bảng Nexus 7 của tôi. Cảm ơn
Jantzilla

37

Vấn đề là nếu bạn sử dụng phương pháp này

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

để buộc định hướng của bạn Activity sang chế độ , bạn không phải là ứng cử viên để nhận orientationthay đổi.

Vì vậy, giải pháp là không setRequestOrientationđể một chế độ cụ thể. Nhưng thay vào đó hãy sử dụngSCREEN_ORIENTATION_SENSOR.


5
Vâng, nó hoạt động, nhưng nếu tôi không muốn ứng dụng của mình bị xoay thì sao? tôi muốn nó ở trong chế độ phong cảnh.
stoefln

bạn phải chỉ định <hoạt động android: name = ". MyActivity" android: screenOrientation = "cảnh"> </ Activity> trong tệp tin đơn giản nhất của bạn
Qadir Hussain

3
Làm cách nào để cả hai tôi sử dụng điều này (khi người dùng nhấp vào "toàn màn hình" trên trình phát video) và tiếp tục nhận onConfigChanged, khi người dùng xoay điện thoại của mình. Hành vi tương tự như trong ứng dụng youtube. Điều này có thể?
Vucko

29

kiểm tra xem thiết bị của bạn có cài đặt "Xoay màn hình" BẬT

Cài đặt "Xoay màn hình"


7
Tôi đã có vấn đề buồn cười này ...: D
Dharmendra

Có thể xoay hoạt động ngay cả khi tùy chọn "Xoay màn hình" TẮT?. Nếu CÓ, vui lòng cho tôi biết cách thực hiện điều đó ......? Theo hiểu biết của tôi, nó sẽ không hoạt động nhưng một số ứng dụng xoay hoạt động sang ngang.
Srinivasan

1
S ** t !!! Đã dành 4-5 giờ để cố gắng để mã của tôi hoạt động! Một cách để ghi đè lên điều này, khi tôi học được từ một câu trả lời khác là đưa <android: direction = "sensor"> vào tệp kê khai
suku

19
  1. Kiểm tra xem bạn không sử dụng android:screenOrientationở cấp độ Activityhoặc Applicationcấp độ.
  2. Hãy thử sử dụng android:configChanges="orientation|keyboardHidden"thay thế.

1
Làm thế nào tôi có thể sử dụng android: screenOrientation và tôi muốn chạy phương thức onConfigurationChanged, tôi có thể làm gì, thx
Bingchean

17

Tôi đã dành hàng chục phút để tìm hiểu tại sao nó không hoạt động. Tôi đã thêm screenSizenhưng nó vẫn không hoạt động.

Hóa ra là tôi đã thêm android:configChangesvào <application>yếu tố, chứ không phải đến<activity> yếu tố như tôi nên có!

Chà, tất nhiên, đây là sai lầm của tôi, nhưng tất cả chúng ta đều biết rằng tất cả chúng ta đều dành rất nhiều thời gian cho loại sai lầm ngớ ngẩn này. Vì vậy, tôi đang thêm câu trả lời này trong trường hợp nên có một lập trình viên ngớ ngẩn khác như tôi.


Tôi cũng đang làm như vậy, Cảm ơn bạn đã cứu tôi
Pranoy Sarkar

Hồ cảm ơn anh bạn!
Laurent

14

Maczzy là 100% tiền với tùy chọn thứ 2 của mình.

Thử android:configChanges="orientation|keyboardHidden|screenSize"

Tôi đã có chính xác cùng một vấn đề, và trên trình giả lập 1.6 thêm các keyboardHiddennguyên nhân onConfigurationChangedđược gọi trong quá trình quay. Hủy bỏ nó và nó ngừng được gọi.


5

Tôi gặp vấn đề tương tự - onConfigurationChangedkhông được gọi khi thiết bị thay đổi hướng mặc dùandroid:configChanges="orientation|keyboardHidden"trong tệp kê khai. Tôi đã sử dụng đoạn mã được chia sẻ Devaở đây

định hướng không hoạt động trong 2.3.3?

để kiểm tra nếu onConfigurationChangedđược gọi. Nó không phải là.

Sau vài giờ thử nghiệm, tôi nhận ra rằng tôi có các dòng sau trong tệp kê khai

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

và thay đổi android:targetSdkVersion="15"thành android:targetSdkVersion="8", onConfigurationChangedbắt đầu được gọi. Vì vậy, một phần của bản kê khai cuối cùng trông như thế này

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

9
Vấn đề bạn đang gặp phải là thiếu thuộc tính: screenize. Hãy cập nhật câu trả lời của bạn. Đây sẽ là một "sửa chữa" sai lệch cho các nhà phát triển andriod mới bắt đầu
Tobrun 30/1/13

@ user1281750 Cảm ơn nhưng với tư cách là một nhà phát triển Android ban đầu, tôi không chắc chính xác những gì bạn đang nói.
aLearner

@aLearner Tôi nghĩ người dùng1281750 có nghĩa là gì: Đây thực sự không phải là một sửa chữa! Nếu bạn cần một phiên bản sdk cao hơn thì sao?
Đặc vụKnopf

Tôi đã chia sẻ những gì làm việc cho tôi. Tôi nhận ra rằng đây có thể không phải là 'sửa chữa'. Nhưng cái gì thay thế? Giải pháp 'đúng' là gì? Và 'mất tích attribute: screensize' nghĩa là gì? Nó có thể hữu ích nếu có thêm chi tiết được cung cấp.
aLearner

Cảm ơn bạn thân, giải pháp này đã giải quyết được sự căng thẳng lớn của tôi lol .. Tôi đã lướt web trong một giờ để có được điều này ... nó cũng hoạt động trong tất cả các phiên bản cập nhật
Sampath Kumar

3

Tôi chỉ thấy rằng nếu bạn có:

android:screenOrientation="landscape"

trong tệp kê khai, onConfigurationChanged () sẽ không được gọi quá ...

điều này có thể tương tự như:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

định hướng cài đặt đó chặn onConfigurationChanged ().


3
<uses-sdk android:minSdkVersion="8" android:maxSdkVersion="17" />

Không sử dụng bất kỳ phiên bản sdk mục tiêu để làm cho bạn phức tạp. và đối với tất cả các cấp độ api, hãy sử dụng điều này làm trình lắng nghe thay đổi cấu hình

android:configChanges="orientation|keyboardHidden|screenLayout"

3

Không chắc đây là nơi tốt nhất cho nó, nhưng khi gặp phải vấn đề này - tôi đã quan sát thấy một điều thú vị.

Nếu onConfigurationChanged () KHÔNG hoạt động, thì onCreate () được gọi lại mỗi lần thay đổi hướng.

Nếu trình nghe onConfigurationChanged () đang hoạt động, thì phương thức đó được gọi thay vì onCreate () khi định hướng thay đổi.


Đây là những gì tôi đang thấy - nhưng tôi không muốn trở thành. Và theo các tài liệu thì không nên xảy ra theo cách này. Thật khó hiểu.
slycrel

2

Tất cả các giải pháp không hoạt động, tôi cố gắng loại bỏ hoạt động chủ đề của mình trong tệp kê khai Android. Thật lạ

<activity
        android:name="MyActivity"
        android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
        android:theme="@style/MyTheme" --> remove this line
        />



<style name="MyTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="windowNoTitle">true</item>
    <item name="android:windowIsTranslucent">true</item>
</style>

Có cách nào để tránh hoạt động khởi động lại mà không xóa windowNoTitle không?
Manukumar

2

Không có đề xuất nào phù hợp với tôi (tôi đã phản ứng với dự án gốc với vấn đề này), nhưng sau nhiều giờ gỡ lỗi, tôi thấy rằng nếu bạn có dòng này trong AppTheme của Styles.xml

<item name="android:windowIsTranslucent">true</item>

sau đó ứng dụng sẽ không xoay.


1

@ thanhbinh84 Đã cho tôi một ý tưởng những gì có thể gây ra điều này.
Việc xóa <item name="android:windowIsTranslucent">true</item> khỏi chủ đề của tôi trong tệp XML đã sửa nó!


0

Tôi đã có cùng một vấn đề và tôi đã có cả "android: screenOrientation" và "android: configChanges" được chỉ định trong tệp kê khai. Khi tôi xóa cái đầu tiên, onConfigurationChanged () được gọi khi xoay vòng. Lạ nhưng nó woks)


1
Nhưng làm thế nào để bạn xoay sau đó?
Mark Molina

-2

Bạn đã có android.content.res.Configurationtrong báo cáo nhập khẩu của bạn? Eclipse có thể tự động chèn nhập nếu bạn nhấnCtrl+Shift+O .

Nếu thiếu, trình biên dịch sẽ không thể nhận ra rằng bạn đang ghi đè một cách hợp pháp phương thức siêu lớp và do đó sẽ gây ra lỗi.


Có, nhập khẩu đã được thực hiện, bất kỳ ý tưởng? bởi vì tôi không nhận được bất kỳ lỗi hay bất cứ điều gì, chỉ là nó không được gọi.
lblasa

Tôi không biết điều này có liên quan đến thực tế là tất cả các ứng dụng đang được thực hiện ở chế độ dọc hay không. Hoạt động mà tôi cần để xử lý onConfigurationChangedEvent là một hoạt động có trong Tabhost mà chế độ là chân dung. Nhưng dù sao, tôi không tìm thấy bất kỳ bình luận nào về việc đây là một vấn đề để nắm bắt sự kiện đó. Tôi thực sự hết ý tưởng.
lblasa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.