Làm cách nào để chỉ đặt toàn bộ ứng dụng ở chế độ dọc?


201

Làm cách nào để cài đặt ứng dụng để ứng dụng chỉ chạy ở chế độ dọc? Tôi muốn chế độ phong cảnh bị tắt trong khi ứng dụng đang chạy. Làm thế nào để tôi làm điều đó theo chương trình?

Câu trả lời:


293

Đối với mọi phiên bản Android

Từ XML

Bạn có thể chỉ định android:screenOrientation="portrait"cho từng hoạt động trong tệp manifest.xml của mình. Bạn không thể chỉ định tùy chọn này trên applicationthẻ.

Từ Java

Tùy chọn khác là thực hiện theo chương trình, ví dụ như trong một Activitylớp cơ sở:

@Override
public void onCreate(Bundle savedInstanceState) {
  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

Dành cho Android 4+ (API 14+)

Tùy chọn cuối cùng là thực hiện với trình nghe vòng đời hoạt động chỉ khả dụng kể từ Android 4.0 (API 14+). Mọi thứ xảy ra trong một Applicationlớp tùy chỉnh :

@Override
public void onCreate() {
    super.onCreate();  
    registerActivityLifecycleCallbacks(new ActivityLifecycleAdapter() {
        @Override
        public void onActivityCreated(Activity a, Bundle savedInstanceState) {
            a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    });
}

ActivityLifecycleAdapterchỉ là một lớp trợ giúp mà bạn sẽ cần tạo, đây sẽ là một triển khai trống ActivityLifecycleCallbacks(vì vậy bạn không phải ghi đè lên từng phương thức của giao diện đó khi bạn chỉ cần một trong số chúng).


1
nó không làm việc. nó chuyển sang chế độ nằm ngang khi tôi bật thiết bị. và nhiều thứ khác trong mã tôi đang sử dụng các setRequestedOrientation này (ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_SENSOR); hướng dẫn cho thanh tiến trình. Có bất kỳ vấn đề với các hướng dẫn này?
naresh

nó đang hoạt động một điều nữa không đặt trên hai hướng dẫn trong phần mã hóa của bạn. nó có nghĩa là nó cho phép cảm biến thay đổi hướng màn hình.
naresh

3
-1: Người hỏi yêu cầu cụ thể cách thực hiện // lập trình // và cho toàn bộ ứng dụng (điều này khiến tôi tin rằng họ không muốn làm điều đó cho từng hoạt động riêng lẻ).
jwir3

@ jwir3, tôi không đồng ý. "lập trình" không chỉ là viết mã, nó cũng là tất cả các tệp meta, tài nguyên bạn sử dụng, làm việc xung quanh các đặc điểm riêng của IDE, v.v ... Đây là một câu trả lời hay, khắc phục sự cố OP đã đánh dấu nó là chính xác. rõ ràng là một câu trả lời đầy đủ cho câu hỏi ban đầu.
James Webster

9
bằng cách sử dụng phương thức LifeCycleCallbacks, bạn sẽ có một độ trễ trong hoạt động khởi chạy khi bạn giữ thiết bị của mình ở chế độ ngang (điều gì sẽ bình thường). Tôi đoán đó là vì các thiết bị quay trở lại chế độ ngang trong thời gian ngắn giữa các hoạt động và cần thời gian để xử lý việc này. Đặt hướng trong tệp kê khai không có hiệu ứng này.
Ẩn danh

142

Có, bạn có thể thực hiện việc này cả lập trình và cho tất cả các hoạt động của mình để tạo ra một Tóm tắt mà tất cả các hoạt động của bạn đều mở rộng.

public abstract class AbstractActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}

Hoạt động trừu tượng này cũng có thể được sử dụng cho một menu toàn cầu.


3
Lưu ý: Tôi tin rằng đó ActivityInfo.SCREEN_ORIENTATION_NOSENSORphải là câu trả lời tốt hơn vì dự định để thiết bị ở trạng thái mặc định vì một số thiết bị không có hướng Chân dung. Tuy nhiên, 'nosensor' KHÔNG hoạt động với tôi, vì vậy câu trả lời của @ arcone là viết tắt của tôi.
David Manpearl

104

Bạn có thể làm điều này cho toàn bộ ứng dụng của mình mà không phải thực hiện tất cả các hoạt động của mình mở rộng một lớp cơ sở chung.

Bí quyết đầu tiên là đảm bảo bạn bao gồm một Applicationlớp con trong dự án của bạn. Trong đó onCreate(), được gọi khi ứng dụng của bạn khởi động lần đầu tiên, bạn đăng ký một ActivityLifecycleCallbacksđối tượng (cấp độ API 14+) để nhận thông báo về các sự kiện vòng đời hoạt động.

Điều này mang đến cho bạn cơ hội để thực thi mã của riêng bạn bất cứ khi nào bất kỳ hoạt động nào trong ứng dụng của bạn được bắt đầu (hoặc dừng lại hoặc tiếp tục hoặc bất cứ điều gì). Tại thời điểm này, bạn có thể gọi setRequestedOrientation()cho các hoạt động mới được tạo ra.

class MyApp extends Application {

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

        // register to be informed of activities starting up
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {

            @Override
            public void onActivityCreated(Activity activity, 
                                          Bundle savedInstanceState) {

                // new activity created; force its orientation to portrait
                activity.setRequestedOrientation(
                    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

            }

            ....

        });

    }
}

9
đây là câu trả lời duy nhất giải quyết câu hỏi Một dòng để cai trị tất cả.
Samuel

2
* Một lớp để cai trị tất cả.
Jay Mayu

3
và không bao giờ quên để thêm vào trong ứng dụng root. android: name = ". MyApp"
Faisal Naseer

2
Cách tiếp cận này gọi onCreate () của hoạt động hai lần.
Sandeep R

3
Vấn đề là khi bạn giữ thiết bị theo chiều ngang và bắt đầu hoạt động mới, nó sẽ xuất hiện theo hướng ngang và sau đó xoay sang dọc. Có vẻ như cách tốt nhất để khóa ứng dụng đầy đủ theo hướng dọc là đánh dấu mọi mức độ nhạy cảm trong Manifest.
Den

42

Bạn có thể thiết lập điều này trong tệp kê khai của bạn ..

android:name=".your launching activity name"
android:screenOrientation="portrait"

và bạn cũng có thể đạt được điều tương tự bằng cách viết mã trong tệp lớp của bạn như:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

1
@ naresh vui lòng chấp nhận ans nếu bạn có bất kỳ giải pháp nào theo nhu cầu của bạn, nó cũng sẽ chạy đua xếp hạng của bạn
SRam

24

Thêm android: screenOrientation = "Portrait" vào hoạt động trong AndroidManifest.xml. Ví dụ:

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

25
Ông nói ỨNG DỤNG không hoạt động.
Reinherd

10

Sử dụng:

android:screenOrientation="portrait" 

Chỉ cần viết dòng này trong tệp kê khai của ứng dụng của bạn trong mỗi hoạt động mà bạn muốn hiển thị ở chế độ dọc.


8

Viết phần này vào tệp kê khai của bạn, cho mọi hoạt động:

android:screenOrientation="portrait" 

2

Theo hướng dẫn của nhà phát triển Android:

"hướng" Hướng màn hình đã thay đổi - người dùng đã xoay thiết bị. 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 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.

"screenSize" Kích thước màn hình hiện tại đã thay đổi. Điều này thể hiện sự thay đổi kích thước hiện có, liên quan đến tỷ lệ khung hình hiện tại, do đó sẽ thay đổi khi người dùng chuyển đổi giữa phong cảnh 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). Đã thêm trong API cấp 13.

Vì vậy, trong tệp AndroidManifest.xml, chúng ta có thể đặt:

<activity
            android:name=".activities.role_activity.GeneralViewPagerActivity"
            android:label="@string/title_activity_general_view_pager"
            android:screenOrientation="portrait"
            android:configChanges="orientation|keyboardHidden|screenSize"
            >
        </activity> 

1

Thêm <preference name="orientation" value="portrait" />dưới <widget>trong config.xml tôi làm việc cho tôi.

(Các giải pháp khác không hoạt động trên thiết bị của tôi, đã bị ghi đè trong quá trình xây dựng hoặc bị lỗi khấu hao trong quá trình xây dựng.)


Cấu hình đã nói ở đâu? Bạn đang đề cập đến nền tảng phát triển nào?
Tash Pemhiwa

1

trong tệp kê khai mà bạn muốn sử dụng trong "chân dung", bạn phải viết các mã này vào thẻ Hoạt động

  android:screenOrientation="portrait" 

như thế này

         android:icon="@drawable/icon"
        android:name="com.zemkoapps.hd.wallpaper.AndroidGridLayoutActivity" 
        android:screenOrientation="portrait" >

Nhưng nếu bạn muốn màn hình trong phong cảnh, hãy sử dụng mã như thế này

android:screenOrientation="landscape"

1
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    //setting screen orientation locked so it will be acting as potrait
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
}

0

Nếu bất cứ ai thắc mắc, làm thế nào bạn có thể làm điều này cho toàn bộ ứng dụng của mình mà không phải thực hiện tất cả các hoạt động của mình mở rộng một lớp cơ sở chung trong Kotlin , xem ví dụ bên dưới:

class InteractiveStoryApplication: Application() {
override fun onCreate() {
    super.onCreate()
    registerActivityLifecycleCallbacks(object: ActivityLifecycleCallbacks {
        override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
            activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        }

        override fun onActivityPaused(activity: Activity?) {
        }

        override fun onActivityResumed(activity: Activity?) {
        }

        override fun onActivityDestroyed(activity: Activity?) {
        }

        override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
        }

        override fun onActivityStarted(activity: Activity?) {
        }

        override fun onActivityStopped(activity: Activity?) {
        }
    })
}
}

và sau đó bạn phải thêm lớp cơ sở chung của mình trong AndroidManifest như vậy:

<application android:allowBackup="true"
android:name=".InteractiveStoryApplication"

0

Bạn có thể làm điều đó theo hai cách.

  1. Thêm android:screenOrientation="portrait"vào tệp kê khai của bạn vào hoạt động tương ứng
  2. Thêm setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); vào hoạt động của bạn trong phương thức `onCreate ()

0

Tương tự như câu trả lời của Graham Borland ... nhưng có vẻ như bạn không phải tạo lớp Ứng dụng nếu bạn không muốn ... chỉ cần tạo một Hoạt động cơ bản trong dự án của bạn

public class BaseActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_base);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}

Và mở rộng lớp này thay vì AppCompatActivity nơi bạn muốn sử dụng Chế độ Eo biển

public class your_activity extends BaseActivity {}

0

Dành cho người dùng Xamarin:

Nếu bạn mở rộng tất cả các hoạt động của mình thành BaseActivityChỉ cần thêm:

this.RequestedOrientation = ScreenOrientation.Portrait;

Điều này sẽ giải quyết vấn đề. Nếu bạn muốn bất kỳ hoạt động cụ thể nào được ghi đè lên cảnh này OnActivityCreated. Như:

this.Activity.RequestedOrientation = ScreenOrientation.Landscape;

-11

Trong bản kê khai của bạn loại này:

<activity
    android:screenOrientation="portrait"
    <!--- Rest of your application information ---!>
</activity>

6
Điều này không thêm bất cứ điều gì mới mà câu trả lời 3 năm chưa được nói. Bạn có thể cân nhắc xóa nó. Nếu bạn quyết định chỉnh sửa câu trả lời của mình để bao gồm thêm thông tin phân biệt câu trả lời của bạn với người khác, vui lòng @reply cho tôi.
Artjom B.

1
android: screenOrientation = "Portrait" không thể được thêm vào thẻ ứng dụng, nó phải đi vào bên trong thẻ hoạt động
Hossein Amini
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.