Jak ustawić całą aplikację tylko w trybie pionowym?


201

Jak to ustawić, aby aplikacja działała tylko w trybie pionowym? Chcę, aby tryb krajobrazu był wyłączony podczas działania aplikacji. Jak to zrobić programowo?

Odpowiedzi:


293

Dla dowolnej wersji Androida

Z XML

Możesz określić android:screenOrientation="portrait"dla każdego działania w pliku manifest.xml. Nie możesz określić tej opcji w applicationtagu.

Z Java

Inną opcją jest zrobienie tego programowo, na przykład w Activityklasie bazowej:

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

Dla Androida 4+ (API 14+)

Ostatnią opcją jest zrobienie tego z detektorami cyklu życia aktywności, które są dostępne tylko od Androida 4.0 (API 14+). Wszystko dzieje się w Applicationklasie niestandardowej :

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

ActivityLifecycleAdapterto tylko klasa pomocnicza, którą musisz stworzyć, która będzie pustą implementacją ActivityLifecycleCallbacks(więc nie musisz zastępować wszystkich metod tego interfejsu, gdy potrzebujesz tylko jednej z nich).


1
to nie działa. zmienia się w tryb poziomy po włączeniu urządzenia. i więcej rzeczy w kodzie używam tych setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_SENSOR); instrukcje dotyczące paska postępu. czy jest jakiś problem z tymi instrukcjami?
naresh

to działa. jeszcze jedna rzecz, nie umieszczaj powyżej dwóch instrukcji w części kodującej. oznacza to, że umożliwia czujnikowi zmianę orientacji ekranu.
naresh

3
-1: Pytający konkretnie zapytał, jak to zrobić // programowo // i dla całej aplikacji (co prowadzi mnie do wniosku, że nie chce tego robić dla każdej czynności indywidualnie).
jwir3

@ jwir3, nie zgadzam się. „programowanie” to nie tylko pisanie kodu, to także wszystkie meta pliki, zasoby, których używasz, obejście osobliwości IDE itp. To dobra odpowiedź, rozwiązuje problem i OP oznaczył go jako poprawny, więc najwyraźniej wystarczająca odpowiedź na pierwotne pytanie.
James Webster,

9
przy użyciu metody LifeCycleCallbacks opóźnienie w uruchomieniu zostanie uruchomione, gdy urządzenie będzie trzymane w (co normalnie byłoby) trybie poziomym. Wydaje mi się, że dzieje się tak, ponieważ urządzenia wracają na krótko do trybu poziomego między czynnościami i potrzebują czasu, aby sobie z tym poradzić. Ustawienie orientacji w manifeście nie ma tego efektu.
Anonimowy

142

Tak, możesz to zrobić zarówno programowo, jak i dla wszystkich swoich działań, tworząc AbstractActivity, który rozszerza wszystkie twoje działania.

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

Ta abstrakcyjna aktywność może być również wykorzystana w menu globalnym.


3
Uwaga: Uważam, że ActivityInfo.SCREEN_ORIENTATION_NOSENSORpowinna to być lepsza odpowiedź, ponieważ ma na celu pozostawienie urządzenia w stanie domyślnym, ponieważ niektóre urządzenia nie mają orientacji pionowej. Jednak „nosensor” NIE działa dla mnie, więc odpowiedź @ arcone jest dla mnie odpowiednia.
David Manpearl

104

Możesz to zrobić dla całej aplikacji bez konieczności przekształcania wszystkich działań w wspólną klasę bazową.

Sztuczka polega na tym, aby upewnić się, że do Applicationprojektu dołączono podklasę. W jego onCreate()nazwie, wywoływanej przy pierwszym uruchomieniu aplikacji, rejestrujesz ActivityLifecycleCallbacksobiekt (poziom API 14+), aby otrzymywać powiadomienia o zdarzeniach cyklu życia aktywności.

Daje to możliwość wykonania własnego kodu za każdym razem, gdy jakiekolwiek działanie w aplikacji zostanie uruchomione (zatrzymane, wznowione lub cokolwiek innego). W tym momencie możesz wywołać setRequestedOrientation()nowo utworzone działanie.

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
to jedyna odpowiedź na pytanie. Jedna linia, by rządzić nimi wszystkimi.
Samuel

2
* Jedna klasa rządzi nimi wszystkimi.
Jay Mayu,

3
i nigdy nie zapomnij dodać manifestu głównego katalogu aplikacji. android: name = ". MyApp"
Faisal Naseer

2
To podejście wywołuje funkcję onCreate () działania dwukrotnie.
Sandeep R

3
Problem polega na tym, że gdy trzymasz urządzenie poziomo i zaczynasz nową aktywność, pojawia się ono w orientacji poziomej, a następnie obraca się do pozycji pionowej. Wygląda na to, że jedynym dobrym sposobem na zablokowanie pełnej aplikacji w orientacji pionowej jest zaznaczenie każdej aktywności w Manifeście.
Den

42

Możesz to ustawić w pliku manifestu ..

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

możesz również osiągnąć to samo, pisząc kod w pliku klasy, np .:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

1
@ naresh pls zaakceptuj ans, jeśli znajdziesz jakieś rozwiązanie zgodnie z twoją potrzebą, będzie ono także ścigać się z twoją oceną
SRam

24

Dodaj Androida: screenOrientation = "portrait" do aktywności w AndroidManifest.xml. Na przykład:

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

25
Powiedział, że APLIKACJA nie jest aktywnością.
Reinherd

10

Posługiwać się:

android:screenOrientation="portrait" 

Po prostu napisz ten wiersz w pliku manifestu aplikacji w każdej aktywności, którą chcesz pokazać tylko w trybie portretowym.


8

Napisz to do pliku manifestu dla każdej aktywności:

android:screenOrientation="portrait" 

2

Od przewodnika dla programistów Androida:

„orientacja” Orientacja ekranu zmieniła się - użytkownik obrócił urządzenie. Uwaga: Jeśli aplikacja jest ukierunkowana na interfejs API na poziomie 13 lub wyższym (zgodnie z zadeklarowanymi atrybutami minSdkVersion i targetSdkVersion), należy również zadeklarować konfigurację „screenSize”, ponieważ zmienia się również, gdy urządzenie przełącza się między orientacją pionową i poziomą.

„screenSize” Zmienił się aktualnie dostępny rozmiar ekranu. Oznacza to zmianę aktualnie dostępnego rozmiaru w stosunku do bieżącego współczynnika proporcji, a więc zmieni się, gdy użytkownik przełączy się między widokiem poziomym a pionowym. Jeśli jednak aplikacja jest kierowana na interfejs API na poziomie 12 lub niższym, wówczas aktywność zawsze sama obsługuje tę zmianę konfiguracji (ta zmiana konfiguracji nie powoduje ponownego uruchomienia aktywności, nawet w przypadku systemu Android w wersji 3.2 lub nowszej). Dodano w API 13 poziom.

Tak więc w pliku AndroidManifest.xml możemy umieścić:

<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

Dodanie <preference name="orientation" value="portrait" />under <widget>w moim pliku config.xml działało dla mnie.

(Inne rozwiązania albo nie działały na moim urządzeniu, zostały nadpisane podczas kompilacji, albo dawały błędy przestarzałe podczas kompilacji).


Gdzie jest wspomniany plik config.xml? Do jakiej platformy programistycznej się odnosisz?
Tash Pemhiwa

1

w pliku manifestu, którego działania chcesz użyć w „portrecie” , musisz wpisać ten kod w tagu działania

  android:screenOrientation="portrait" 

lubię to

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

ale jeśli chcesz ekran w układzie poziomym, użyj tego kodu w ten sposób

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

Jeśli ktoś zastanawiał się, jak to zrobić dla całej aplikacji bez konieczności tworzenia wszystkich działań rozszerzających wspólną klasę bazową w Kotlin , zobacz poniższy przykład:

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

a następnie musisz dodać swoją wspólną klasę podstawową w AndroidManifest w następujący sposób:

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

0

Możesz to zrobić na dwa sposoby.

  1. Dodaj android:screenOrientation="portrait"plik manifestu do odpowiedniej aktywności
  2. Dodaj setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); do swojej aktywności w metodzie `onCreate ()

0

Podobnie do odpowiedzi Grahama Borlanda ... ale wydaje się, że nie musisz tworzyć klasy aplikacji, jeśli nie chcesz ... po prostu utwórz działanie podstawowe w swoim projekcie

public class BaseActivity extends AppCompatActivity {

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

}

I rozszerz tę klasę zamiast AppCompatActivity tam, gdzie chcesz używać trybu Potrait

public class your_activity extends BaseActivity {}

0

Dla użytkowników Xamarin:

Jeśli rozszerzysz wszystkie swoje działania na BaseActivityTylko dodaj:

this.RequestedOrientation = ScreenOrientation.Portrait;

To rozwiąże problem. Jeśli chcesz, aby jakieś konkretne działania odbywały się w układzie poziomym, zastąp to w OnActivityCreated. Tak jak:

this.Activity.RequestedOrientation = ScreenOrientation.Landscape;

-11

W swoim Manifeście wpisz:

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

6
To nie dodaje nic nowego, czego trzyletnie odpowiedzi jeszcze nie powiedziały. Możesz rozważyć jego usunięcie. Jeśli zdecydujesz się edytować swoją odpowiedź, aby zawierała więcej informacji, które odróżniają ją od innych, proszę o odpowiedź @.
Artjom B.,

1
android: screenOrientation = „portret” nie może zostać dodany do znacznika aplikacji, musi wejść do znacznika aktywności
Hossein Amini
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.