Tôi có một ứng dụng chỉ hoạt động ở chế độ dọc và tôi đã thực hiện các thay đổi trong tệp kê khai của mình cho mọi hoạt động theo hướng dọc. Nhưng khi tôi xoay thiết bị, hoạt động sẽ tái tạo lại. Làm thế nào để không phá hủy hoạt động?
Tôi có một ứng dụng chỉ hoạt động ở chế độ dọc và tôi đã thực hiện các thay đổi trong tệp kê khai của mình cho mọi hoạt động theo hướng dọc. Nhưng khi tôi xoay thiết bị, hoạt động sẽ tái tạo lại. Làm thế nào để không phá hủy hoạt động?
Câu trả lời:
Đối với API 12 trở xuống : thêm
android:configChanges="orientation"
Thêm "screenSize" nếu bạn đang nhắm mục tiêu API 13 trở lên vì bất cứ khi nào hướng của bạn thay đổi, kích thước màn hình của bạn thay đổi, nếu không các thiết bị mới sẽ tiếp tục phá hủy hoạt động của bạn. Xem câu trả lời của Egg bên dưới để biết thêm thông tin về cách sử dụng "screenSize"
android:configChanges="orientation|screenSize"
vào Hoạt động của bạn trong AndroidManifest.xml. Bằng cách này, Hoạt động của bạn sẽ không được tự động khởi động lại. Xem tài liệu để biết thêm thông tin
Từ tài liệu chính thức, flurin cho biết,
Lưu ý: Nếu ứng dụng của bạn nhắm mục tiêu API cấp 13 trở lên (như được khai báo bởi thuộc tính minSdkVersion và targetSdkVersion), thì bạn cũng nên khai báo cấu hình "screenSize", vì nó cũng thay đổi khi thiết bị chuyển đổi giữa hướng dọc và ngang.
Vì vậy, nếu ứng dụng của bạn nhắm mục tiêu API cấp 13 trở lên, bạn nên đặt cấu hình này để thay thế:
android:configChanges="orientation|screenSize"
Giải pháp đúng là
android:configChanges="orientation|screenSize"
Tài liệu Android:
Kích thước màn hình khả dụng hiện tại đã thay đổi. Điều này thể hiện sự thay đổi về kích thước hiện có, so với tỷ lệ khung hình hiện tại, do đó sẽ thay đổi khi người dùng chuyển đổi giữa ngang và dọc. 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ôi đã làm rối tung điều này một chút và sau đó tin rằng bên trong tệp kê khai, tôi đang đặt configChanges ở cấp Ứng dụng chứ không phải ở Cấp hoạt động. Đây là mã trông như thế nào khi nó hoạt động chính xác đối với tôi.
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
Giờ đây, Android đã hỗ trợ chia đôi màn hình ("đa cửa sổ" theo cách nói của Android), có thể bạn sẽ muốn thêm định hướng screenSize | smallScreenSize | screenLayout |. Vì vậy, để xử lý xoay và chia đôi màn hình, bạn sẽ muốn một cái gì đó như thế này trong android: configChanges
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
Xem mã này trong Hình ảnh nổi. Nó có cách xử lý xoay màn hình thú vị nhất từ trước đến nay. http://code.google.com/p/floatingimage/source/browse/#svn/trunk/floatingimage/src/dk/nindroid/rss/orientation
viết trong tệp kê khai:
android:configChanges="orientation|screenSize|keyboardHidden"
và ghi đè điều này trong hoạt động đã giải quyết vấn đề của bạn:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}