Buộc một hoạt động Android luôn sử dụng chế độ ngang


144

Tôi đang sử dụng trình xem Android VNC trên HTC G1 của mình . Nhưng vì một số lý do, ứng dụng đó luôn ở chế độ ngang mặc dù G1 của tôi ở chế độ dọc. Vì trình xem Android VNC là mã nguồn mở, tôi muốn biết làm thế nào có thể mã cứng một hoạt động trở thành 'phong cảnh'. Tôi muốn thay đổi nó để tôn trọng định hướng điện thoại.

Câu trả lời:


188

Nhìn vào AndroidManifest.xml ( liên kết ), trên dòng 9:

<activity android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden" android:name="VncCanvasActivity">

Dòng này chỉ định screenOrientationlà phong cảnh, nhưng tác giả đi xa hơn trong việc ghi đè bất kỳ thay đổi hướng màn hình nào với configChanges="orientation|keyboardHidden". Điều này trỏ đến một chức năng bị ghi đè trong VncCanvasActivity.java.

Nếu bạn nhìn vào VncCanvasActivity, trên dòng 109 là chức năng được ghi đè:

@Override
public void onConfigurationChanged(Configuration newConfig) {
  // ignore orientation/keyboard change
  super.onConfigurationChanged(newConfig);
}

Tác giả đặc biệt đặt một bình luận để bỏ qua bất kỳ thay đổi bàn phím hoặc định hướng.


Nếu bạn muốn thay đổi điều này, bạn có thể quay lại tệp AndroidManifest.xml được hiển thị ở trên và thay đổi dòng thành:

<activity android:screenOrientation="sensor" android:name="VncCanvasActivity">

Điều này sẽ thay đổi chương trình để chuyển từ dọc sang ngang khi người dùng xoay thiết bị.

Điều này có thể hoạt động, nhưng có thể làm rối giao diện GUI, tùy thuộc vào cách bố trí được tạo. Bạn sẽ phải tính đến điều đó. Ngoài ra, tùy thuộc vào cách các hoạt động được mã hóa, bạn có thể nhận thấy rằng khi thay đổi hướng màn hình, các giá trị được điền vào bất kỳ hộp đầu vào nào sẽ biến mất. Điều này cũng có thể phải được xử lý.


3
Tại sao chính xác là configChangesthuộc tính cần thiết? Nó dường như hoạt động trên điện thoại không có bàn phím của tôi mà không có nó ... Trong những tình huống nào, định hướng sẽ thay đổi thành chân dung nếu bạn có screenOrientation="landscape"nhưng bỏ qua configChanges?
Timmmm


Làm cách nào để buộc một hoạt động tích hợp như thư viện chọn ảnh trong hệ thống chỉ hoặc ở chế độ dọc?
Jacky

118

Bạn cũng có thể đặt cùng một dữ liệu trong mã java của mình.

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Các giá trị khác trên ActivityInfo sẽ cho phép bạn đặt nó trở lại cảm biến được điều khiển hoặc chân dung bị khóa. Cá nhân, tôi muốn đặt nó thành một cái gì đó trong Bản kê khai như được đề xuất trong câu trả lời khác cho câu hỏi này và sau đó thay đổi nó bằng cách sử dụng cuộc gọi trên trong SDK Android nếu có nhu cầu.


@Yegor Không phải lúc nào. Từ tài liệu android:If the activity is currently in the foreground or otherwise impacting the screen orientation, the screen will immediately be changed (possibly causing the activity to be restarted)
Chaitanya

40

Theo tôi OnCreate(Bundle), tôi thường làm như sau:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2
phương pháp rõ ràng trong các câu trả lời khác dường như không hiệu quả nhưng @anwarma của bạn đã làm
Anup

31

Bạn có thể chỉ định hướng của một hoạt động trong tệp kê khai. Xem ở đây .

<activity android:allowTaskReparenting=["true" | "false"]
...
          android:screenOrientation=["unspecified" | "user" | "behind" |
                                     "landscape" | "portrait" |
                                     "sensor" | "nosensor"]
...
                                       "adjustResize", "adjustPan"] >  

24

Trong bảng kê khai:

<activity  android:name=".YourActivity"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize">

Trong hoạt động của bạn:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.your_activity_layout);

11

Sau đây là mã mà tôi đã sử dụng để hiển thị tất cả hoạt động ở chế độ ngang:

<activity android:screenOrientation="landscape"
          android:configChanges="orientation|keyboardHidden"
          android:name="abcActivty"/>

2
"định hướng" Nếu ứng dụng của bạn nhắm mục tiêu API cấp 13 trở lên thì bạn cũng nên khai báo "kích thước màn hình"
Mina Fawzy

7

Một giải pháp nhanh chóng và đơn giản dành cho tệp AndroidManifest.xml, thêm các mục sau cho từng hoạt động mà bạn muốn buộc vào chế độ ngang:

android:screenOrientation="landscape"

5

Điều này làm việc cho Xamarin.Android. Trong OnCreate ()

RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape;

4

Đó là nó!! Chờ đợi lâu để sửa lỗi này.

Tôi đã gặp sự cố Android cũ về khởi động lại một hoạt động yêu cầu chế độ ngang (lập trình): setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

Bây giờ Android bắt đầu chế độ Phong cảnh.


3

Arslan, tại sao bạn muốn buộc định hướng theo ngữ pháp, mặc dù đã có một cách rõ ràng <activity android:name=".youractivityName" android:screenOrientation="portrait" />


Tôi không phải là người hỏi, nhưng có lẽ anh ta muốn ép buộc theo chương trình vì anh ta muốn ép buộc vào một thời điểm nhất định?
Hamzah Malik

1

Làm điều đó trong mã là IMO sai và thậm chí còn hơn thế nếu bạn đặt nó vào onCreate. Làm điều đó trong bảng kê khai và "hệ thống" biết định hướng từ khi khởi động ứng dụng. Và loại "hướng dẫn" meta hoặc cấp cao nhất NÊN có trong bảng kê khai. Nếu bạn muốn chứng minh điều đó với chính mình, hãy tạm dừng hoạt động onCreate của Activity. Nếu bạn thực hiện mã đó, nó sẽ được gọi hai lần: nó khởi động ở chế độ Chân dung sau đó được chuyển sang Cảnh. Điều này không xảy ra nếu bạn làm điều đó trong bảng kê khai.


1
Tôi không đồng ý. Làm bất cứ điều gì trong mã trái ngược với thông qua một bảng kê khai luôn là phương pháp ưa thích của tôi. Dựa trên nguyên tắc trách nhiệm duy nhất, bảng kê khai chỉ nên được quan tâm với các thuộc tính cấp độ ứng dụng, quyền và ràng buộc API. Tôi thực sự không đồng ý với thẻ <Activity> hiện diện trong một bảng kê khai ứng dụng và vì vậy tôi không bao giờ đặt nó ở đó (và nó hoạt động tốt). Làm thế nào một hoạt động được trình bày rõ ràng là một mối quan tâm trình bày. Hoạt động của bạn phải chịu trách nhiệm hoàn toàn về cách trình bày và vì vậy tôi thường đặt tất cả logic trình bày trong mã xem / mã hoạt động.
Đến vào

0

Đối với Android 4.0 (Ice Cream Sandwich) trở lên, tôi cần thêm những thứ này, bên cạnh landscapegiá trị.

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

Chỉ sử dụng keyboardHidden|orientationsẽ vẫn dẫn đến rò rỉ bộ nhớ và giải trí các hoạt động của tôi khi nhấn nút nguồn.


Cảnh báo thực hành xấu! Điều này không liên quan gì đến việc buộc hoạt động ở chế độ ngang. Bạn luôn cần phải thực hiện việc lưu trữ và giải trí về trạng thái hoạt động của mình. Đó là kiến ​​thức phát triển Android cơ bản. Đừng giải quyết điều đó với bản sửa lỗi này. Các hoạt động có thể được đóng bởi hệ thống nếu nó cần thêm bộ nhớ.
Roel

@Roel, đó là cách duy nhất để ngăn hoạt động quay trở lại chân dung khi bạn xoay thiết bị. Nó ngăn chặn các cấu hình này ảnh hưởng đến hoạt động.
Peterdk

Xin lỗi vì tin nhắn khó chịu một chút, nhưng tôi đã kiểm tra nó và tôi không có tất cả các giá trị này cho chế độ ngang. Khi bạn thêm tất cả các giá trị này, điều đó có nghĩa là bạn tự xử lý các thay đổi trong onConfigurationChanged () thay vì hoạt động đó chỉ được khởi động lại (và bạn phải thực hiện điều đó!) Nhưng nếu bạn buộc thực hiện quay vòng thì sẽ không xảy ra xoay vòng.
Roel

Xin chào, một số trong số chúng có thể không cần thiết, nhưng bỏ qua tất cả chúng sẽ dẫn đến các vấn đề xoay vòng kỳ lạ. Bây giờ tôi không thể kiểm tra, nhưng khi tôi đang phát triển một ứng dụng cần phải ở trong cảnh quan mọi lúc, chỉ sử dụng orientation|screensizelà không đủ trong mọi trường hợp. Nó sẽ tự động quay trở lại chân dung.
Peterdk

Các cấu hình này cũng được sử dụng trong Google Mobile Ads và các SDK quảng cáo khác. Đó là nơi tôi đã nhận được chúng từ thời điểm đó.
Peterdk

0

Sử dụng ActivityInfo (android.content.pm.ActivityInfo) trong phương thức onCreate của bạn trước khi gọi phương thức setLayout như thế này

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

0

chỉ sử dụng
công cụ android: screenOrientation = "Portrait": ign = "KhóaOrientationActivity"


0

Thêm các dòng sau trong hoạt động

Bạn cần nhập vào mọi Hoạt động

cho cảnh quan

android:screenOrientation="landscape"
tools:ignore="LockedOrientationActivity"

cho chân dung

android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"

Đây là ví dụ về MainActivity

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="org.thcb.app">
    <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:screenOrientation="landscape"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".MainActivity2"
            android:screenOrientation="portrait"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

-25

Nhấn CTRL+F11để xoay màn hình.


3
Bây giờ họ muốn làm thế nào để thiết lập hướng mặc định của ứng dụng, chứ không phải làm thế nào để có thể xoay màn hình.
kyle k

CTRL + f12 cho trình giả lập.
Lười
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.