Trong trường hợp điều này được sử dụng cho một số nhà phát triển mới hơn vì nó không được chỉ định ở trên. Chỉ cần rất rõ ràng:
Bạn cần hai thứ nếu sử dụng onConfigurationChanged :
Một onConfigurationChangedphương pháp trong Lớp hoạt động của bạn
Chỉ định trong tệp kê khai của bạn những thay đổi cấu hình nào sẽ đượconConfigurationChanged phương pháp của bạn xử lý
Đoạn mã tệp kê khai trong các câu trả lời ở trên, mặc dù không nghi ngờ gì là chính xác đối với ứng dụng cụ thể chứa tệp kê khai, nhưng KHÔNG phải là chính xác những gì bạn cần thêm vào tệp kê khai của mình để kích hoạt phương thức onConfigurationChanged trong Lớp hoạt động của bạn. tức là mục nhập tệp kê khai dưới đây có thể không đúng với ứng dụng của bạn.
<activity name= ".MainActivity" android:configChanges="orientation|screenSize"/>
Trong mục nhập tệp kê khai ở trên, có nhiều hành động Android khác nhau android:configChanges=""có thể kích hoạt onCreate trong vòng đời Hoạt động của bạn.
Điều này rất quan trọng - Những cái KHÔNG được chỉ định trong tệp kê khai là những cái kích hoạt onCreate của bạn và Những cái được chỉ định trong tệp kê khai là những cái kích hoạt onConfigurationChangedphương thức của bạn trong Lớp hoạt động của bạn.
Vì vậy, bạn cần xác định những thay đổi cấu hình nào bạn cần để tự xử lý. Đối với Android Encyclopedally Challenged như tôi, tôi đã sử dụng cửa sổ bật ra gợi ý nhanh trong Android Studio và thêm vào hầu hết mọi tùy chọn cấu hình có thể. Liệt kê tất cả những thứ này về cơ bản nói rằng tôi sẽ xử lý mọi thứ và onCreate sẽ không bao giờ được gọi do cấu hình.
<activity name= ".MainActivity" android:configChanges="screenLayout|touchscreen|mnc|mcc|density|uiMode|fontScale|orientation|keyboard|layoutDirection|locale|navigation|smallestScreenSize|keyboardHidden|colorMode|screenSize"/>
Bây giờ rõ ràng là tôi không muốn xử lý mọi thứ, vì vậy tôi đã bắt đầu loại bỏ từng tùy chọn ở trên. Xây dựng lại và thử nghiệm ứng dụng của tôi sau mỗi lần xóa.
Một điểm quan trọng khác : Nếu chỉ có một tùy chọn cấu hình được xử lý tự động kích hoạt onCreate của bạn (Bạn không có nó được liệt kê trong tệp kê khai của mình ở trên), thì nó sẽ có vẻ như onConfigurationChangedkhông hoạt động. Bạn phải đưa tất cả những cái có liên quan vào tệp kê khai của mình.
Tôi đã kết thúc với 3 cái đang kích hoạt onCreate ban đầu, sau đó tôi đã thử nghiệm trên S10 + và tôi vẫn nhận được onCreate, vì vậy tôi phải thực hiện lại bài tập loại bỏ của mình và tôi cũng cần |screenSize. Vì vậy, hãy thử nghiệm trên một số nền tảng.
<activity name= ".MainActivity" android:configChanges="screenLayout|uiMode|orientation|screenSize"/>
Vì vậy, đề xuất của tôi, mặc dù tôi chắc rằng ai đó có thể chọc thủng lỗ hổng này:
Thêm onConfigurationChangedphương thức của bạn vào Lớp hoạt động bằng TOAST hoặc LOG để bạn có thể biết khi nào nó hoạt động.
Thêm tất cả các tùy chọn cấu hình có thể có vào tệp kê khai của bạn.
Xác nhận onConfigurationChangedphương pháp của bạn đang hoạt động bằng cách thử nghiệm ứng dụng của bạn.
Xóa từng tùy chọn cấu hình khỏi tệp kê khai của bạn tại một thời điểm, thử nghiệm ứng dụng của bạn sau mỗi tùy chọn.
Thử nghiệm trên càng nhiều thiết bị càng tốt.
Không sao chép / dán đoạn mã của tôi ở trên vào tệp kê khai của bạn. Các bản cập nhật Android thay đổi danh sách, vì vậy hãy sử dụng các gợi ý Android Studio pop-out để đảm bảo bạn nhận được tất cả.
Tôi hy vọng điều này giúp ai đó tiết kiệm thời gian.
onConfigurationChangedPhương pháp của tôi chỉ để biết thông tin bên dưới. onConfigurationChangedđược gọi trong vòng đời sau khi định hướng mới có sẵn, nhưng trước khi giao diện người dùng được tạo lại. Do đó, lần đầu tiên của tôi ifđể kiểm tra hướng hoạt động chính xác, và sau đó lần thứ hai được lồng ifvào nhau để xem khả năng hiển thị của UI ImageView của tôi cũng hoạt động chính xác.
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
pokerCardLarge = findViewById(R.id.pokerCardLgImageView);
if(pokerCardLarge.getVisibility() == pokerCardLarge.VISIBLE){
Bitmap image = ((BitmapDrawable)pokerCardLarge.getDrawable()).getBitmap();
pokerCardLarge.setVisibility(pokerCardLarge.VISIBLE);
pokerCardLarge.setImageBitmap(image);
}
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
pokerCardLarge = findViewById(R.id.pokerCardLgImageView);
if(pokerCardLarge.getVisibility() == pokerCardLarge.VISIBLE){
Bitmap image = ((BitmapDrawable)pokerCardLarge.getDrawable()).getBitmap();
pokerCardLarge.setVisibility(pokerCardLarge.VISIBLE);
pokerCardLarge.setImageBitmap(image);
}
}
}