Chế độ định hướng chân dung lực lượng


298

Tôi đang cố gắng ép chế độ "dọc" cho ứng dụng của mình vì ứng dụng của tôi hoàn toàn không được thiết kế cho chế độ "phong cảnh".

Sau khi đọc một số diễn đàn, tôi đã thêm những dòng này vào tệp kê khai của mình:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:screenOrientation="portrait">

Nhưng nó không hoạt động trên thiết bị của tôi (HTC Desire). Nó chuyển từ "chân dung" lo "phong cảnh", bỏ qua các dòng từ tệp kê khai.

Sau khi đọc nhiều diễn đàn hơn, tôi đã cố gắng thêm nó vào tệp kê khai của mình:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:configChanges="orientation"       
  android:screenOrientation="portrait">

và chức năng này trong lớp hoạt động của tôi:

public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

Nhưng một lần nữa, không có may mắn.

Câu trả lời:


531

Không áp dụng hướng cho thành phần ứng dụng , thay vào đó bạn nên áp dụng thuộc tính cho thành phần hoạt động và bạn cũng phải đặt configChangesnhư ghi chú bên dưới.

Thí dụ:

<activity
   android:screenOrientation="portrait"
   android:configChanges="orientation|keyboardHidden">
</activity>

Điều này được áp dụng trong tệp kê khai AndroidManifest.xml.


26
Cấu hình cho những gì?
Dror

71
@Orchestrator, configChanges có nghĩa là thay đổi cấu hình được xử lý bởi chính hoạt động đó. Không có nó, hoạt động sẽ được khởi động lại nếu có sự thay đổi định hướng. Bạn có thể hỏi, nếu bạn đã chỉ định rằng hướng là "chân dung" thì nó sẽ thay đổi như thế nào? Nó có thể thay đổi nếu bạn khởi chạy một hoạt động khác làm thay đổi định hướng, sau đó hoạt động mới đó thoát ra, đưa bạn trở lại hoạt động của mình. Ví dụ, mục đích chụp ảnh mặc định trên Samsung Galaxy S3 thực hiện điều đó theo một số định hướng nhất định.
Gordon McCreight

2
@GordonMcCreight, Bạn có thể giải thích điều này bằng một ví dụ thực tế "Bạn có thể hỏi, nếu bạn đã chỉ định rằng hướng là" chân dung "thì nó sẽ thay đổi như thế nào? Nó có thể thay đổi nếu bạn khởi chạy một hoạt động khác làm thay đổi hướng, sau đó hoạt động mới thoát ra, đưa bạn trở lại hoạt động của mình. "
Tushar Pandey

3
Chắc chắn rồi, @TusharPandey. Nếu tôi nhớ lại một cách chính xác, thì nơi khiến chúng tôi đau buồn là khi hoạt động của chúng tôi đưa ra ý định chụp ảnh mặc định trên Samsung Galaxy S3. Về cơ bản, chúng tôi chỉ muốn chụp ảnh và nhận được kết quả. Tuy nhiên, khi ý định của máy quay trở lại, nó đã gây ra sự thay đổi định hướng xóa sạch trạng thái trong hoạt động của chúng tôi, vì chúng tôi không tin rằng chúng tôi cần phải bảo vệ chống lại điều đó (vì toàn bộ ứng dụng của chúng tôi chỉ theo hướng "dọc"). Làm thế nào và tại sao Galaxy S3 làm điều này vượt quá tầm hiểu biết (giới hạn của tôi).
Gordon McCreight

8
Tại sao "bàn phím" được bao gồm?
gonzobrains

24

Lưu ý rằng

android:screenOrientation="portrait"     
android:configChanges="orientation|keyboardHidden"

được thêm vào trong tệp kê khai - nơi hoạt động được xác định.


13

Tôi nghĩ rằng android:screenOrientation="portrait"có thể được sử dụng cho các hoạt động cá nhân. Vì vậy, sử dụng thuộc tính đó trong <activity>thẻ như:

<activity android:name=".<Activity Name>"
    android:label="@string/app_name" 
    android:screenOrientation="portrait">
   ...         
</activity>

13

Nếu bạn đang có nhiều hoạt động như của tôi, trong ứng dụng của bạn Hoặc nếu bạn không muốn nhập mã cho từng thẻ hoạt động trong tệp kê khai, bạn có thể thực hiện việc này.

trong lớp Cơ sở ứng dụng của bạn, bạn sẽ nhận được một cuộc gọi lại vòng đời

Vì vậy, về cơ bản, những gì xảy ra cho mỗi hoạt động khi tạo tạo trong Lớp ứng dụng được kích hoạt ở đây là mã ..

public class MyApplication extends Application{

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

  registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
                activity.setRequestedOrientation(
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


// for each activity this function is called and so it is set to portrait mode


            }

            @Override
            public void onActivityStarted(Activity activity) {

            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
}

Tôi hi vọng cái này giúp được.


1
Câu trả lời hiệu quả! đây phải là câu trả lời chính xác, đặc biệt đối với những người đang phát triển các ứng dụng phức tạp phụ thuộc nhiều vào số lượng lớn Hoạt động.
FEBRYAN ASA PERDANA

10

Đặt chế độ Chân dung hoặc Chế độ ngang , Thêm dòng tương ứng.

Nhập dòng dưới đây:

import android.content.pm.ActivityInfo;

Thêm dòng bên dưới ngay phía trên setContentView(R.layout.activity_main);

Đối với chân dung :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

Đối với Landscap :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

Điều này chắc chắn sẽ làm việc.


1
Điều này không thành công với Android 9 trên một số thiết bị - chuyển đổi xoay màn hình có thể nhìn thấy trong một khoảnh khắc ngắn ngay cả khi bạn chỉ sử dụng PORTRAIT
Igor Wojda

Bạn có thể vui lòng chỉ định thông tin thiết bị mà bạn phải đối mặt với điều này không, nếu có thể
Parth Patel

4

Theo tài liệu của Android, bạn cũng nên thường xuyên đưa screenSizevào thay đổi cấu hình có thể.

android:configChanges="orientation|screenSize"

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 các thuộc tính minSdkVersion và targetSdkVersion), thì bạn cũng nên khai báo cấu hình "screenSize", bởi vì nó cũng thay đổi khi thiết bị chuyển đổi giữa hướng dọc và hướng ngang.

Ngoài ra, nếu bạn tất cả bao gồm giá trị keyboardHiddentrong các ví dụ của bạn, không nên sau đó bạn cũng xem xét locale, mcc, fontScale, keyboardvà những người khác? ..


3

Tôi đã có dòng này trong AndroidManifest.xml của tôi

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:theme="@android:style/Theme.Black.NoTitleBar">

Mà tôi đã thay đổi thành (chỉ cần thêm android:screenOrientation="portrait")

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar">

Điều này cố định cho tôi.


2

Một cái gì đó để bổ sung: Tôi đã cập nhật một ứng dụng gần đây, trước đây đã hoạt động ở cả chế độ ngang và dọc và tôi muốn phiên bản cập nhật sẽ hoạt động ở chế độ dọc, vì vậy tôi đã thêm

android:screenOrientation="portrait"

đến hoạt động tương ứng và nó chỉ bị sập khi tôi kiểm tra bản cập nhật. Sau đó tôi thêm vào

android:configChanges="orientation|keyboardHidden"

quá, và nó hoạt động.


1
Nếu đây không phải là một câu trả lời cho câu hỏi, có thể thêm nó dưới dạng bình luận sẽ giúp ích.
JPReddy

Kiểm tra xem bạn đã thêm nó vào hoạt động không dành cho khối ứng dụng
Waran-

1

Tôi nghĩ bạn muốn thêm android:configChanges="orientation|keyboardHidden"vào hoạt động của bạn? Nếu không, hoạt động được khởi động lại khi thay đổi cấu hình. Sau onConfigurationChangedđó sẽ không được gọi, chỉ cóonCreate


1

Nếu bạn muốn hỗ trợ các định hướng khác nhau trong debugreleasexây dựng, hãy viết như vậy (xem https://developer.android.com/studio/build/gradle-tips#share-properies-with-the-manifest ).

Trong thư mục build.gradlecủa bạn appviết:

android {
    ...
    buildTypes {
        debug {
            applicationIdSuffix '.debug'
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "fullSensor"]
        }
        release {
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "portrait"]
        }
    }
}

Sau đó, AndroidManifestbạn có thể sử dụng biến "định hướng" này trong bất kỳ Activity:

<activity
    android:name=".LoginActivity"
    android:screenOrientation="${orientation}" />

Bạn có thể thêm android:configChanges:

manifestPlaceholders = [configChanges: "", orientation: "fullSensor"]trong gỡ lỗi và manifestPlaceholders = [configChanges: "keyboardHidden|orientation|screenSize", orientation: "portrait"]phát hành,

<activity
    android:name=".LoginActivity"
    android:configChanges="${configChanges}"
    android:screenOrientation="${orientation}" />

-8

Câu trả lời ngắn gọn: Đừng làm điều đó.

Thiết kế lại ứng dụng của bạn để ứng dụng có thể chạy ở cả chế độ dọc và ngang. Không có giao diện người dùng nào không thể được thiết kế để hoạt động ở cả dọc và ngang; chỉ những nhà phát triển lười biếng hoặc không tưởng tượng.

Lý do tại sao khá đơn giản. Bạn muốn ứng dụng của mình có thể được sử dụng bởi càng nhiều đối tượng càng tốt trên càng nhiều thiết bị khác nhau càng tốt. Bằng cách buộc một hướng màn hình cụ thể, bạn ngăn ứng dụng của bạn chạy (có thể sử dụng) trên các thiết bị không hỗ trợ hướng đó và bạn làm nản lòng và xa lánh những khách hàng tiềm năng thích một hướng khác.

Ví dụ: Bạn thiết kế ứng dụng của mình để buộc chế độ dọc. Một khách hàng tải xuống ứng dụng trên thiết bị 2 trong 1 mà họ sử dụng chủ yếu ở chế độ ngang.
Hậu quả 1: Ứng dụng của bạn không sử dụng được hoặc khách hàng của bạn buộc phải tháo gỡ thiết bị của họ, xoay thiết bị và sử dụng nó theo hướng không quen thuộc hoặc thoải mái với họ.
Hậu quả 2: Khách hàng bị thất vọng bởi thiết kế không trực quan của ứng dụng của bạn và tìm thấy một giải pháp thay thế hoặc bỏ hoàn toàn ứng dụng.

Tôi đang chiến đấu với điều này với một ứng dụng ngay bây giờ và là một người tiêu dùng và nhà phát triển, tôi ghét nó. Ứng dụng này cũng hữu ích, tuyệt vời như các tính năng mà nó cung cấp, tôi hoàn toàn ghét ứng dụng này vì nó buộc tôi phải sử dụng một định hướng đối nghịch với mọi cách khác mà tôi sử dụng thiết bị của mình.

Bạn không muốn khách hàng ghét ứng dụng của bạn.


Tôi biết điều này không trực tiếp trả lời câu hỏi, vì vậy tôi muốn giải thích chi tiết hơn cho những người tò mò.

Có một xu hướng cho các nhà phát triển là thực sự giỏi trong việc viết mã và thực sự khủng khiếp trong thiết kế. Câu hỏi này, mặc dù nghe giống như một câu hỏi về mã và người hỏi chắc chắn cảm thấy đó là một câu hỏi về mã, thực sự là một câu hỏi thiết kế.

Câu hỏi thực sự là "Tôi có nên khóa hướng màn hình trong ứng dụng của mình không?" Người hỏi đã chọn thiết kế giao diện người dùng để hoạt động và trông chỉ đẹp ở chế độ dọc. Tôi nghi ngờ đó là để tiết kiệm thời gian phát triển hoặc vì quy trình làm việc của ứng dụng đặc biệt thuận lợi cho bố cục dọc (phổ biến cho các trò chơi di động). Nhưng những lý do đó bỏ qua tất cả các yếu tố thực sự quan trọng thúc đẩy thiết kế phù hợp.

  1. Sự tham gia của khách hàng - bạn muốn khách hàng của bạn cảm thấy được kéo vào ứng dụng của bạn, không bị đẩy ra khỏi ứng dụng. Ứng dụng sẽ chuyển đổi suôn sẻ từ bất cứ điều gì khách hàng của bạn đang làm trước khi mở ứng dụng của bạn. (Đây là lý do hầu hết các nền tảng có nguyên tắc thiết kế nhất quán, vì vậy hầu hết các ứng dụng trông ít nhiều giống nhau mặc dù chúng không phải như vậy.)

  2. Phản hồi của khách hàng - bạn muốn khách hàng phản ứng tích cực với ứng dụng của bạn. Họ nên tận hưởng việc sử dụng nó. Ngay cả khi đó là một ứng dụng trả lương cho công việc, họ vẫn nên vui mừng khi mở nó và đồng hồ. Ứng dụng sẽ tiết kiệm thời gian của khách hàng của bạn và giảm sự thất vọng về các lựa chọn thay thế. (Các ứng dụng gây khó chịu cho người dùng gây phẫn nộ đối với ứng dụng của bạn, điều này gây phẫn nộ với thương hiệu của bạn.)

  3. Chuyển đổi khách hàng - bạn muốn khách hàng của mình có thể nhanh chóng và dễ dàng chuyển từ duyệt sang tương tác. Đây là mục tiêu cuối cùng của bất kỳ ứng dụng nào, để chuyển đổi hiển thị thành doanh thu. (Ứng dụng không tạo doanh thu là lãng phí thời gian của bạn để xây dựng, từ góc độ kinh doanh.)

Giao diện người dùng được thiết kế kém làm giảm sự tham gia và phản hồi của khách hàng dẫn đến doanh thu thấp hơn. Trong một thế giới tập trung vào thiết bị di động (và đặc biệt về chủ đề chế độ hiển thị dọc / ngang), điều này giải thích tại sao thiết kế web đáp ứng lại là một vấn đề lớn như vậy. Walmart Canada đã giới thiệu thiết kế đáp ứng trên trang web của họ vào tháng 11 năm 2013 và thấy tỷ lệ chuyển đổi khách hàng tăng 20% . O'Neill Quần áo đã triển khai thiết kế web đáp ứng và doanh thu từ khách hàng sử dụng thiết bị iOS tăng 101,25%591,42% từ khách hàng sử dụng thiết bị Android .

Ngoài ra còn có xu hướng các nhà phát triển tập trung vào việc thực hiện một giải pháp cụ thể (chẳng hạn như khóa hướng hiển thị) và hầu hết các nhà phát triển trên trang web này sẽ rất vui mừng khi giúp triển khai giải pháp đó, mà không cần hỏi liệu đó có phải là tốt nhất không giải pháp cho vấn đề.

Khóa hướng màn hình của bạn là thiết kế UI tương đương với việc thực hiện vòng lặp do-while. Bạn có thực sự chắc chắn rằng bạn muốn làm theo cách đó, hoặc có một sự thay thế tốt hơn?

Đừng ép ứng dụng của bạn vào một chế độ hiển thị. Đầu tư thêm thời gian và công sức để làm cho nó đáp ứng.


2
Tôi hiểu và đồng ý với bạn về việc đó là một giao diện người dùng được thiết kế kém. Nhưng điều đó không thay đổi thực tế là bạn CÓ THỂ CẦN làm như vậy, và dù sao thì khung công tác cũng cần có những khả năng đó, nói chung. Bạn không bao giờ biết ứng dụng trong tương lai sẽ như thế nào và cần phải làm gì, vì vậy câu hỏi vẫn còn hiệu lực.
Z. Khullah

1
Bạn không sai. Tôi nghĩ rằng câu trả lời của tôi được thúc đẩy một phần bởi sự thất vọng mà tôi có với một vài ứng dụng làm điều này một cách không cần thiết và nó hoàn toàn phá hỏng trải nghiệm. Tôi sẽ nói rằng số lượng các trường hợp hợp pháp để khóa chế độ hiển thị là cực kỳ nhỏ (và vẫn có thể thực hiện và tốt hơn, chỉ là không nằm trong ngân sách). Điều này mang đến cho các vấn đề khác; với việc mã hóa trở nên dễ dàng như có rất nhiều nhà phát triển nghiệp dư viết ứng dụng vì họ biết mã nhưng không học cách làm UI hoặc thiết kế, hoặc thậm chí các thực tiễn tốt nhất cơ bản (ứng dụng Java cài đặt trong \ AppData - EWWWW).
Thomas

1
Tôi đang xây dựng một ứng dụng VR. Định hướng PHẢI là phong cảnh cho kính để làm phép thuật của họ. Đó là một ví dụ về giao diện người dùng không thể được thiết kế để hoạt động ở cả dọc và ngang. Trò chơi cũng có thể phải buộc một định hướng nhất định. Tôi cá là có hàng tấn vụ án hợp pháp.
Raslanove

1
Trong khi StackExchange tồn tại để trả lời các câu hỏi cụ thể, câu trả lời nên được viết để áp dụng chung nhất có thể để những câu trả lời đó hữu ích cho người khác. Phát triển không chỉ đơn thuần là viết mã và lý do có rất nhiều ứng dụng rác trên thế giới là vì rất nhiều nhà phát triển quên - hoặc không bao giờ học - nguyên tắc quan trọng này. Cá nhân tôi sẽ nói thêm rằng nếu bạn đang thực hiện VR trên điện thoại thì bạn đang làm sai VR - nhưng chi phí đã đẩy nhu cầu về VR lên các nền tảng không bao giờ hỗ trợ.
Thomas

1
Tôi không đồng ý với câu trả lời này, nhưng nó trả lời một câu hỏi không được hỏi.
bmovement
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.