Як встановити всю програму лише у портретному режимі?


201

Як встановити його, щоб програма працювала лише в портретному режимі? Я хочу, щоб ландшафтний режим був відключений під час роботи програми. Як це зробити програмно?

Відповіді:


293

Для будь-якої версії Android

З XML

Ви можете вказати android:screenOrientation="portrait"для кожної дії у вашому файлі manifest.xml. Не можна вказати цей параметр у applicationтезі.

З Java

Інший варіант - це робити це програмно, наприклад в Activityбазовому класі:

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

Для Android 4+ (API 14+)

Останній варіант - це зробити з слухачами життєвого циклу діяльності, які доступні лише з Android 4.0 (API 14+). Все відбувається в спеціальному Applicationкласі:

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

ActivityLifecycleAdapterце лише клас помічників, який вам потрібно буде створити, який буде порожньою реалізацією ActivityLifecycleCallbacks(тому вам не доведеться переосмислювати кожен метод кожного інтерфейсу, коли вам просто потрібен один з них).


1
це не працює. він перетворюється на альбомний режим, коли я повернув пристрій. та інше в коді, я використовую ці набориRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_SENSOR); інструкції до панелі прогресу. чи є проблема з цими інструкціями?
naresh

це працює. ще одна річ не ставимо вище двох інструкцій у кодувальній частині. це означає, що він дозволяє сенсору змінювати орієнтацію екрана.
naresh

3
-1: Автор, що запитував, спеціально запитав, як це зробити // програмно // та для всієї програми (що призводить до того, що я вважаю, що вони не хочуть робити це для кожної діяльності окремо).
jwir3

@ jwir3, я не згоден. "програмування" - це не просто написання кодового коду, це також усі мета-файли, ресурси, які ви використовуєте, обхід ідіосинкразії IDE і т. д. Це хороша відповідь, виправляє проблему, і ОП позначає її як правильну. мабуть, достатня відповідь на початкове запитання.
Джеймс Вебстер

9
використовуючи метод LifeCycleCallbacks, у вас буде затримка запуску активності, коли ви тримаєте пристрій у (що це було б нормально) ландшафтному режимі. Я думаю, це тому, що пристрої повертаються в ландшафтний режим ненадовго між видами діяльності та для цього потрібен час. Встановлення орієнтації в маніфесті не має цього ефекту.
Анонім

142

Так, ви можете це робити як програмно, так і для всіх своїх дій, роблячи AbstractActivity, що розширює всі ваші дії.

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

Ця абстрактна діяльність також може бути використана для глобального меню.


3
Примітка. Я вважаю, що це ActivityInfo.SCREEN_ORIENTATION_NOSENSORмає бути кращою відповіддю, оскільки він повинен залишати пристрій у замовчуванні, оскільки деякі пристрої не мають орієнтації на портрет. Однак "nosensor" НЕ працює для мене, тому відповідь @ arcone стоїть за мною.
Девід Манперл

104

Це можна зробити для всієї вашої програми, не вимагаючи , щоб усі ваші дії поширювали загальний базовий клас.

Потрібно спочатку переконатися, що ви включили Applicationпідклас у свій проект. У ньому onCreate(), що називається, коли ваш додаток вперше запускається, ви реєструєте ActivityLifecycleCallbacksоб'єкт (рівень API 14+) для отримання сповіщень про події життєвого циклу активності.

Це дає вам змогу виконувати власний код кожного разу, коли будь-яка діяльність у вашому додатку запускається (або зупиняється, або відновлюється, або будь-що інше). У цей момент ви можете зателефонувати setRequestedOrientation()за новоствореною діяльністю.

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
це єдина відповідь, яка стосується питання. Один рядок, щоб керувати ними всіма.
Самуїл

2
* Один клас, щоб керувати ними всіма.
Jay Mayu

3
і ніколи не забудьте додати корінь програми в маніфест. android: name = ". MyApp"
Faisal Naseer

2
Цей підхід викликає onCreate () дії двічі.
Sandeep R

3
Проблема полягає в тому, що якщо ви тримаєте пристрій горизонтально і починаєте нову діяльність, він відображається в альбомній орієнтації, а потім повертається в портрет. Схоже, єдиний хороший спосіб заблокувати повний додаток у портретній орієнтації - це позначити кожну активність у Manifest.
День

42

Ви можете встановити це у своєму файлі маніфесту ..

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

і ви можете також досягти цього, записавши код у файл свого класу, як:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

1
@ naresh pls прийміть ans, якщо у вас є якесь рішення відповідно до ваших потреб, воно також
почне оцінювати

24

Додайте android: screenOrientation = "портрет" до активності в AndroidManifest.xml. Наприклад:

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

25
Він сказав, що ЗАЯВКА не активність.
Рейнгерд

10

Використання:

android:screenOrientation="portrait" 

Просто запишіть цей рядок у файл маніфесту вашої програми у кожній діяльності, яку ви хочете відображати лише в портретному режимі.


8

Запишіть це у свій файл маніфесту для кожної діяльності:

android:screenOrientation="portrait" 

2

Від посібника для розробників Android:

"орієнтація" Орієнтація екрана змінилася - користувач повернув пристрій. Примітка. Якщо ваша програма націлена на API рівня 13 або вище (як заявлено атрибутами minSdkVersion та targetSdkVersion), вам слід також оголосити конфігурацію "screenSize", оскільки вона також змінюється, коли пристрій перемикається між орієнтацією на портрет та ландшафт.

"screenSize" Поточний доступний розмір екрана змінився. Це являє собою зміну наявного в даний час розміру відносно поточного співвідношення сторін, тому воно буде змінюватися, коли користувач перемикається між пейзажем і портретом. Однак якщо ваша програма націлена на рівень API 12 або нижчий, ваша активність завжди обробляє цю зміну конфігурації (ця зміна конфігурації не перезапускає вашу активність навіть під час роботи на пристрої Android 3.2 або новішої версії). Додано в рівень 13 API.

Отже, у файл AndroidManifest.xml ми можемо помістити:

<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

Додавання <preference name="orientation" value="portrait" />при <widget>в моєму config.xml працював для мене.

(Інші рішення або не працювали на моєму пристрої, були перезаписані під час будівництва або давали помилки депресації під час збирання.)


Де вказаний config.xml? Яку платформу розвитку ви маєте на увазі?
Таш Пемхіва

1

у файлі Manifest, яку діяльність ви хочете використовувати в "портреті", ви повинні записати цей код у тег "Активність"

  android:screenOrientation="portrait" 

подобається це

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

але якщо вам потрібен екран в пейзажі, використовуйте такий код, як цей

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

Якщо хтось цікавився, як ви могли це зробити для всієї своєї програми, не змушуючи всіх видів діяльності розповсюджувати загальний базовий клас у Котліні , дивіться приклад нижче:

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?) {
        }
    })
}
}

і тоді ви повинні додати свій загальний базовий клас в AndroidManifest так:

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

0

Зробити це можна двома способами.

  1. Додайте android:screenOrientation="portrait"у свій файл маніфесту відповідну діяльність
  2. Додайте setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); до своєї діяльності метод `onCreate ()

0

Подібно до відповіді Грем Борланд ... але, здається, вам не потрібно створювати клас додатків, якщо ви не хочете ... просто створіть базову діяльність у своєму проекті

public class BaseActivity extends AppCompatActivity {

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

}

І розгорніть цей клас замість AppCompatActivity там, де ви хочете використовувати режим Po Portrait

public class your_activity extends BaseActivity {}

0

Для користувачів Xamarin:

Якщо ви поширюєте всю свою діяльність на BaseActivityдодавання Just:

this.RequestedOrientation = ScreenOrientation.Portrait;

Це вирішить проблему. Якщо ви хочете, щоб якась конкретна діяльність була в ландшафті, замініть це OnActivityCreated. Як:

this.Activity.RequestedOrientation = ScreenOrientation.Landscape;

-11

У своєму Маніфесті введіть це:

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

6
Це не додає нічого нового, що відповіді на 3 роки ще не сказали. Ви можете розглянути можливість її видалення. Якщо ви вирішили відредагувати свою відповідь, щоб включити більше інформації, яка відрізняє вашу відповідь від інших, будь ласка, @відповідь мені.
Artjom B.

1
android: screenOrientation = "портрет" не можна додати до тегу програми, він повинен зайти всередину тегу активності
Hossein Amini
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.