Không tải lại ứng dụng khi định hướng thay đổi


152

Tôi chỉ đơn giản là không cần gì để thay đổi khi màn hình được xoay. Ứng dụng của tôi hiển thị hình ảnh ngẫu nhiên khi lần đầu tiên tải và xoay thiết bị không nên chọn hình ảnh ngẫu nhiên khác. Làm thế nào tôi có thể (đơn giản) làm cho hành vi này dừng lại?


1
Cũng có thể khóa (và có thể mở khóa) hướng màn hình từ mã. Chỉ cần gọi Screen.lockOrientation(this)từ github.com/delight-im/Android-BaseLib/blob/master/Source/src/im/ trộm cho việc này. Nó cho phép mở khóa mà bảng kê khai không có.
caw

@Escobar Ceaser Giải pháp thích hợp cho câu hỏi này là gì. Ngay cả tôi cũng có yêu cầu tương tự.
Prabs

Tôi muốn làm điều này theo chương trình trong mã.

Câu trả lời:


249

Nhìn chung có ba cách để làm điều này:

  1. Như một số câu trả lời được đề xuất, bạn có thể phân biệt các trường hợp hoạt động của bạn được tạo lần đầu tiên và được khôi phục từ đó savedInstanceState. Điều này được thực hiện bằng cách ghi đè onSaveInstanceStatevà kiểm tra tham số của onCreate.

  2. Bạn có thể khóa hoạt động theo một hướng bằng cách thêm android:screenOrientation="portrait"(hoặc "landscape") <activity>vào tệp kê khai của bạn.

  3. Bạn có thể nói với hệ thống rằng bạn muốn tự xử lý các thay đổi màn hình bằng cách chỉ định android:configChanges="orientation|screenSize"trong <activity>thẻ. Bằng cách này, hoạt động sẽ không được tạo lại, nhưng thay vào đó sẽ nhận được một cuộc gọi lại (mà bạn có thể bỏ qua vì nó không hữu ích cho bạn).

Cá nhân tôi sẽ đi với (3). Tất nhiên, nếu khóa ứng dụng theo một trong những định hướng là tốt với bạn, bạn cũng có thể đi với (2).


13
Vì vậy, đối với # 3, bạn có nói rằng tất cả những gì tôi phải làm là thêm dòng đó vào bảng kê khai của tôi không? Bởi vì nó không hoạt động.
Jimmy D

2
# 3 Vui lòng kiểm tra stackoverflow.com/questions/456211/ từ
Yeo

16
@EscobarCeaser, Dành cho Android 3.2 trở lên, bạn cầnandroid:configChanges="orientation|screenSize"
Pacerier

9
android:configChanges="orientation|screenSize"làm việc cho tôi Cảm ơn @Pacerier
Don Larynx

1
vui lòng, cập nhật trường hợp câu trả lời số 3 của bạn với android:configChanges="orientation|screenSize"giá trị cho API> = 13, vì nhiều người xem câu trả lời của bạn là chính!
radistao 11/07/2015

215

Câu trả lời của Xion đã gần, nhưng # 3 ( android:configChanes="orientation") sẽ không hoạt động trừ khi ứng dụng có mức API là 12 hoặc thấp hơn.

Trong API cấp 13 trở lên, kích thước màn hình thay đổi khi hướng thay đổi, do đó, điều này vẫn khiến hoạt động bị hủy và bắt đầu khi thay đổi hướng.

Chỉ cần thêm thuộc tính "screenSize" như tôi đã làm dưới đây:

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

Bây giờ, khi bạn thay đổi hướng (và thay đổi kích thước màn hình), hoạt động sẽ giữ trạng thái và onConfigurationChanged()được gọi. Điều này sẽ giữ bất cứ thứ gì trên màn hình (ví dụ: trang web trong Webview) khi hướng thay đổi.

Đã học được điều này từ trang web này: http://developer.android.com/guide/topics/manifest/activity-element.html

Ngoài ra, đây rõ ràng là một thực tiễn xấu, vì vậy hãy đọc liên kết bên dưới về Xử lý thay đổi thời gian chạy:

http://developer.android.com/guide/topics/resource/r nb-changes.html


2
Cảm ơn ... công việc của nó sau khi thêm "screenSize" với "định hướng"
Pratik Butani

Hoạt động trong Samsung Galaxy Nexus android 4.2.1! android:configChanges="orientation|screenSize"
Vincent Ducastel

Kinh ngạc. Đã làm việc thông qua mã trong nhiều giờ để giải quyết vấn đề tôi gặp phải với hoạt động tải lại và một video bắt đầu từ đầu. Và đây là giải pháp! ++++ 1
Mathias Asberg

6
Thực hành xấu? Pfft, mọi người trong cuộc sống thực có thời hạn và nếu nó hoạt động, nó hoạt động;)
Kacy

Nếu đây là một thực hành tồi thì tại sao nó lại nhận được nhiều sự ủng hộ như vậy ??
Sharp Edge

26

Bạn chỉ cần đi đến AndroidManifest.xmlvà bên trong hoặc trong nhãn hoạt động của mình, bạn phải nhập dòng mã này như một người nào đó đã nói:

android:configChanges="orientation|screenSize"

Vì vậy, bạn sẽ có một cái gì đó như thế này:

<activity android:name="ActivityMenu"
android:configChanges="orientation|screenSize">
</activity>

Hy vọng nó hoạt động!


Nó không tải bố cục đất của tôi. :( đã không làm việc cho tôi
piyush poriya

16
<activity android:name="com.example.abc" 
 android:configChanges="orientation|screenSize"></activity>

Chỉ cần thêm android:configChanges="orientation|screenSize"vào tab hoạt động của tệp kê khai.

Vì vậy, Activity sẽ không khởi động lại khi thay đổi định hướng.


Nó hoạt động. Nhưng khi tôi đang sử dụng bố cục riêng cho từng layout layout và layout-land.xml. bố trí cảnh quan áp dụng của nó cho cả hai định hướng. Nếu tôi chỉ sử dụng "định hướng", nó sẽ mang lại những gì tôi mong đợi nhưng tải lại. Bạn có thể giúp về điều này?
Karthikeyan Ve

1
@KarthikeyanVe Đó là vấn đề khi bạn đang cố gắng gian lận. Bạn sẽ phải khởi động lại hoạt động của mình để thay đổi bố cục. Đi trước và chỉ sử dụng giải pháp thực sự, đó là sử dụng onSaveInstanceState()onCreate().
Marc Plano-Lesay

@ MarcPlano-Lesay và làm thế nào để tôi làm điều đó?
Ahsan

@ Có thể giải pháp thực tế được liên kết trong câu hỏi: developer.android.com/guide/topics/resource/
mẹo

@ MarcPlano-Lesay Tôi đã bố trí riêng cho chế độ dọc và ngang, nếu tôi mở ứng dụng của mình ở chế độ ngang hoặc dọc thì nó hoạt động tốt nhưng bất cứ khi nào tôi cố gắng thay đổi hướng trong thời gian chạy, nó sẽ đóng ứng dụng của tôi, tuy nhiên khi tôi đăng nhập vào ứng dụng của mình và sau đó điều hướng đến MainActivity và cố gắng thay đổi hướng nó tải lại hoạt động đó và hoạt động tốt. Bây giờ câu hỏi là tại sao? Có một lỗi logic trong mã của tôi? Idk, nhưng tôi đã thử gỡ lỗi ứng dụng nhiều lần và tôi không thể tìm thấy bất cứ điều gì. Ngoài ra, tôi không muốn khởi động lại hoạt động của mình, tại sao chúng ta không thể điều chỉnh bố cục tương ứng mỗi khi thay đổi cấu hình?
Ahsan

10

Theo kinh nghiệm của tôi, thực sự tốt hơn là chỉ xử lý các thay đổi định hướng đúng cách thay vì cố gắng xử lý một hành vi không mặc định.

Bạn nên lưu hình ảnh hiện đang được hiển thị onSaveInstanceState()và khôi phục lại đúng cách khi ứng dụng của bạn chạy onCreate()lại.


# 3 là một giải pháp hoàn toàn hợp lệ. Đây là công cụ chính xác được thực hiện để giải quyết vấn đề chính xác này. Tại sao bạn nói rằng đó là dây giày?
Pacerier

1
@Pacerier Chỉ cần đọc tài liệu. "Lưu ý: android:configChangesNên tránh sử dụng và chỉ sử dụng như là phương sách cuối cùng. Vui lòng đọc Xử lý Thay đổi Thời gian chạy để biết thêm thông tin về cách xử lý khởi động lại đúng cách do thay đổi cấu hình."
Marc Plano-Lesay

Bạn có thể gửi một ví dụ tiết kiệm và khôi phục.

6

Giải pháp này là một trong những hoạt động tốt nhất. Trong tệp kê khai của bạn thêm

<activity
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:name="your activity name"
    android:label="@string/app_name" 
    android:screenOrientation="landscape">
  </activity

Và trong lớp hoạt động của bạn thêm mã sau đây

@Override
public void onConfigurationChanged(Configuration newConfig) 
{
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        //your code
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
  //your code

    }
}

4

thêm android:configChanges="keyboardHidden|orientation|screenSize"cho tất cả các thẻ hoạt động ứng dụng trong tệp kê khai.


3

Chỉ cần thêm nó vào của bạn AndroidManifest.xml

<activity android:screenOrientation="landscape">

Ý tôi là, có một thẻ hoạt động, thêm cái này làm tham số khác. Trong trường hợp nếu bạn cần định hướng dọc, thay đổi phong cảnh thành dọc. Hi vọng điêu nay co ich.


tôi không tìm cách lấy đi khả năng xoay màn hình. tôi chỉ không muốn ứng dụng của tôi tải lại ... như tôi đã đề cập.
Jimmy D

ps ... dù sao thì nó cũng không hoạt động. nó chỉ buộc ứng dụng hiển thị theo một hướng nhất định. xoay màn hình vẫn tải lại hoạt động
Jimmy D

3

Trong tập tin manifiest thêm vào từng hoạt động này. Điều này sẽ giúp

android:configChanges = "orientation|keyboard|keyboardHidden|screenLayout|screenSize"

screenLayout hoạt động với tôi, ngăn chặn làm mới khi thay đổi kích thước ứng dụng cho màn hình chia nhỏ trên Android
Terren

2

Tất cả các câu trả lời trên không làm việc cho tôi. Vì vậy, tôi đã sửa bằng cách đề cập đến labelvới screenOrientationnhư dưới đây. Bây giờ mọi thứ đều ổn

<activity android:name=".activity.VideoWebViewActivity"
        android:label="@string/app_name"
        android:configChanges="orientation|screenSize"/>


1

Lưu các chi tiết hình ảnh trong của bạn onPause()hoặc onStop()và sử dụng nó trong onCreate(Bundle savedInstanceState)để khôi phục lại hình ảnh.

BIÊN TẬP:

Thông tin thêm về quy trình thực tế được nêu chi tiết tại đây http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle vì nó khác với Honeycomb so với các phiên bản Android trước đây.


thực ra bạn nên làm điều đó trong phương thức onSaveInstanceState ()
Willi Mentzel



-1

Tôi không biết nếu một giải pháp tốt nhất, nhưng tôi mô tả nó ở đây:

Trước hết, bạn cần chứng chỉ với lớp Ứng dụng của ứng dụng của bạn nằm trong bảng kê khai của bạn về điều này:

<application
    android:name=".App"
    ...

Thứ hai, trong ứng dụng lớp học của tôi, tôi đã làm như thế này:

public class App extends Application {
    public static boolean isOrientationChanged = false;

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onConfigurationChanged(@NotNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ||
                newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            isOrientationChanged = true;
        }
    }

}

Thứ ba, bạn cần đặt cờ thành Thay đổi định hướng, trong trường hợp của tôi, tôi luôn đặt nó khi hoạt động trước đó trong điều hướng ứng dụng được gọi, do đó chỉ gọi một lần khi hoạt động sau được tạo.

isOrientationChanged = false;

Vì vậy, mỗi khi tôi thay đổi hướng của màn hình trong bối cảnh đó, tôi đặt nó mỗi khi nó thay đổi cài đặt này, nó sẽ kiểm tra xem có thay đổi hướng hay không, nếu vậy, nó xác nhận nó dựa trên giá trị của cờ đó.

Về cơ bản, tôi đã phải sử dụng nó bất cứ khi nào tôi thực hiện một yêu cầu trang bị thêm không đồng bộ, mà anh ta gọi mỗi khi thay đổi hướng, liên tục làm hỏng ứng dụng:

if (!isOrientationChanged) {
    presenter.retrieveAddress(this, idClient, TYPE_ADDRESS);
}

Tôi không biết nếu đó là giải pháp thanh lịch và đẹp nhất, nhưng ít nhất ở đây nó có chức năng :)


-2

Thêm mã này sau onCreate, phương thức trong hoạt động của bạn có chứaWebView

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);    
}

@Override
protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);    
}

1
Làm thế nào điều này sẽ làm việc? Không phải bạn chỉ nói một cái gì đó rõ ràng với thời gian chạy, mặc định điều gì sẽ được thực hiện?
Danielson
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.