5

Tôi cần áp dụng các bố cục khác nhau để định hướng dọc và ngang cho hoạt động của mình. Bên cạnh đó, tôi cần phải cảnh báo nếu định hướng là chân dung.Xử lý hoạt động xoay trong Android

Tôi đã chỉ định android:configChanges="orientation|keyboardHidden" trong AndroidManifest. Tôi cũng ghi đè phương pháp onConfigurationChanged như thế này:

@Override 
public void onConfigurationChanged(Configuration newConfig) 
{ 
    Log.d("tag", "config changed"); 
    super.onConfigurationChanged(newConfig); 

    int orientation = newConfig.orientation; 
    if (orientation == Configuration.ORIENTATION_PORTRAIT) 
     Log.d("tag", "Portrait"); 
    else if (orientation == Configuration.ORIENTATION_LANDSCAPE) 
     Log.d("tag", "Landscape"); 
    else 
     Log.w("tag", "other: " + orientation); 

    .... 
} 

Trong khi quay từ phong cảnh đến log chân dung trông giống như:

config changed 
Portrait 

Nhưng khi thay đổi từ dọc sang ngang có vẻ như

config changed 
Portrait 
config changed 
Landscape 

Tại sao onConfigurationChanged được gọi hai lần? Làm thế nào tôi có thể tránh nó?

Trả lời

3

Xem câu trả lời của tôi để một câu hỏi ở đây: https://stackoverflow.com/a/3252547/338479

Nói tóm lại, xử lý thay đổi cấu hình đúng là khó có thể làm. Tốt nhất là triển khai onRetainNonConfigurationInstance() được gọi ngay trước khi ứng dụng của bạn sắp ngừng và khởi động lại do thay đổi cấu hình. Sử dụng phương pháp này để lưu bất cứ điều gì bạn muốn ('này' là một lựa chọn tốt) và sau đó để cho hệ thống xé xuống ứng dụng của bạn.

Khi ứng dụng của bạn được khởi động lại với cấu hình mới, hãy sử dụng getLastNonConfigurationInstance() để truy xuất trạng thái bạn vừa lưu và sử dụng trạng thái đó để tiếp tục ứng dụng của bạn mà không có tất cả những thứ đó với gói và tùy chọn được chia sẻ.

0

Có lý do cụ thể nào mà bạn chọn xử lý xoay vòng theo cách này không? Mặc dù hoạt động này nhanh hơn vì hoạt động không được khởi động lại trên một thay đổi định hướng, nó không thường được khuyến nghị, nếu tôi nhớ chính xác. Một cách khác để xử lý thay đổi định hướng là thay vì trọng , trọng onCreate(), onStart() hoặc onResume()

@Override 
public void onStart() { 
    super.onStart(); 
    int orientation = getWindowManager().getDefaultDisplay().getOrientation(); 
    if(orientation == Configuration.ORIENTATION_PORTRAIT) { 
     Log.i(TAG, "Orientation is portrait"); 
     // show whatever alerts here 
    } 
} 

và sau đó xác định hai bố trí - một cho chân dung, một cho cảnh quan. Phiên bản dọc của bố cục sẽ vẫn ở res/layout/whatever.xml và phiên bản ngang sẽ ở trong res/layout-land/whatever.xml. AndroidGuys đã viết một loạt bài viết hay về chủ đề này, xem http://androidguys.com/?s=rotational+forces&x=9&y=9

+0

Tại sao onConfigurationChanged() là cách xấu? Bạn có thể vui lòng cho tôi một liên kết với lời giải thích? Nếu tôi sẽ sử dụng onCreate() hoặc một cái gì đó tương tự như hoạt động sẽ được tạo lại và dữ liệu của nó sẽ bị mất. – darja

0

Tôi chắc chắn bạn sẽ muốn sử dụng onCreate thay vì onStart. Sự khác biệt duy nhất có vẻ là onStart sẽ được gọi khi ứng dụng đến nền trước. Đó không phải là trường hợp bạn muốn người dùng chờ bạn tái khởi tạo giao diện người dùng. Nếu không, chỉ cần thay đổi cuộc gọi setContentView của bạn dựa trên điều kiện đó.

+0

Tôi đồng ý với bạn, phương thức onCreate được gọi khi định hướng của thiết bị thay đổi –

+0

Tại sao nó tốt hơn sau đó onConfigurationChanged? – darja

+0

Tôi tin rằng bạn sẽ kết thúc xây dựng giao diện người dùng của mình hai lần trong trường hợp đó. Cả onConfigurationChange và onCreate sẽ được gọi khi màn hình xoay. Bạn đã phải thiết lập giao diện người dùng trong onCreate cho tất cả các tình huống tạo khác. – JOTN

0

Android khởi động phiên bản hoạt động mới của bạn khi thay đổi hướng để sử dụng onCreate là phương pháp lý tưởng. Bạn sẽ phải lưu/khôi phục dữ liệu hoạt động của bạn rõ ràng để nhận nơi bạn rời đi - nhưng bạn vẫn nên làm điều này vì bất kỳ số lượng sự kiện nào có thể không tập trung/giết ứng dụng của bạn.

+0

Tại sao các downvotes? Anh ấy đúng. –

1

Bạn chỉ cần lưu hướng trước đó và kiểm tra xem nó có thực sự thay đổi không.

Nếu bạn đặt trong AndroidManifest.xmlandroid:configChanges đến keyboardHidden|orientation cho hoạt động của mình, onCreate v.v ... sẽ không được gọi. Điều đó làm cho việc triển khai thực hiện dễ dàng hơn đáng kể. Nhưng bố cục của khóa học cũng sẽ thay đổi từ dọc sang ngang.

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