Czy istnieje sposób blokowania orientacji podczas uruchamiania? Na przykład chciałbym, aby użytkownik zablokował ekran w celu ukształtowania krajobrazu, jeśli użytkownik aktualnie znajduje się w krajobrazie i przełącza opcję menu.Jak zablokować orientację w czasie wykonywania
Odpowiedz
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Wywołanie czynności spowoduje zablokowanie jej w krajobraz. Poszukaj innych flag w klasie ActivityInfo. Możesz go przywrócić do portretu lub sprawić, by był napędzany przez czujnik/suwak.
Więcej informacji tutaj: http://www.devx.com/wireless/Article/40792
Wydawało mi się, miał mieć podobny przypadek. Chciałem wspierać każdą orientację, ale musiałem pozostać w obecnej orientacji po pewnym punkcie przepływu pracy. Moje rozwiązanie było:
przy wjeździe chronionego workflow:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
Na wyjściu z chronionym workflow:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
Nie dotyczy to OQ, przynajmniej na Androidzie> = 16. Metoda setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_NOSENSOR) może ustawić urządzenie na krajobraz, nawet jeśli było to portret, natomiast pytanie dotyczy orientacji blokowania, która została podana. – greg7gkb
dla mnie, ustawienie go na nosensor przenosi mnie z powrotem do trybu portretowego, gdybym był na krajobrazie Zamiast tego użyłem SCREEN_ORIENTATION_LOCKED i to zadziałało dla mnie – Jimmar
@JiMMaR SCREEN_ORIENTATION_LOCKED to najlepszy sposób na Androida> = 18. Ale jeśli celujesz w coś niższego , To nie działa. Sugeruję użycie odpowiedzi jp36 poniżej. –
uważać na różnicę między tym, co getConfiguration zwrotów i co setRequestedOrientation chce - oba są int, ale pochodzą z różnych stałych definicji.
Oto jak zablokować aktualną orientację, pozwalając jednocześnie 180 stopni koziołki
int currentOrientation = getResources().getConfiguration().orientation;
if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
}
Możesz preferować użycie SCREEN_ORIENTATION_USER_LANDSCAPE, ponieważ nie pozwala to na obrót o 180 stopni, jeśli użytkownik wyłączył obrót ekranu w ustawieniach. Podobnie po przełączeniu z powrotem na swobodną rotację SCREEN_ORIENTATION_USER jest lepszy niż SCREEN_ORIENTATION_SENSOR, ponieważ pozwala on na swobodny obrót, nawet jeśli ustawienia nie mówią. –
Genialny! Trzeba dodać, że po zmianie orientacji na odwrotną nie występuje. Przynajmniej na urządzeniach, na których go przetestowałem. Bardzo ważne jest, aby wiedzieć, czy chcesz przerwać rekonfigurację podczas niektórych okien dialogowych itp. – sberezin
ta działa na urządzeniach z odwrotnej portretu i reverse krajobraz. orientacja
Lock:
int orientation = getActivity().getRequestedOrientation(); int rotation = ((WindowManager) getActivity().getSystemService( Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation(); switch (rotation) { case Surface.ROTATION_0: orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; break; case Surface.ROTATION_90: orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; break; case Surface.ROTATION_180: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; break; default: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; break; } getActivity().setRequestedOrientation(orientation);
orientacja Unlock:
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
Zyskaj rotację '" Zwraca obrót ekranu z jego "naturalnej" orientacji. "' [Źródło] (http://developer.android.com/ reference/android/view/Display.html # getRotation()). Tak więc na telefonie mówiącym ROTATION_0 portret jest prawdopodobnie poprawny, ale na tablecie jego "naturalna" orientacja prawdopodobnie krajobrazowa, a ROTATION_0 powinien przywrócić krajobraz zamiast portretu. – jp36
@ jp36, testowałem na Nexusie 7, który ma naturalną orientację, która jest taka sama jak telefon. Dzięki za testowanie na większym tablecie (którego nie mam). – pstoppani
Jak powiedział jp36, nie działa on na tabletach o naturalnej orientacji poziomej! – DominicM
Alternatywa @pstoppani odpowiedź ze wsparciem dla tabletów (jak w przypadku odpowiedzi @pstoppani, to będzie działa tylko na urządzeniach> 2.2)
-Testowane na Samsung Galaxy SIII
i Samsung Galaxy Tab 10.1
public static void lockOrientation(Activity activity) {
Display display = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int rotation = display.getRotation();
int tempOrientation = activity.getResources().getConfiguration().orientation;
int orientation = 0;
switch(tempOrientation)
{
case Configuration.ORIENTATION_LANDSCAPE:
if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90)
orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
else
orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
break;
case Configuration.ORIENTATION_PORTRAIT:
if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270)
orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
else
orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
}
activity.setRequestedOrientation(orientation);
}
Tu jest mój kodu, można zablokować jedną z tych metod ekranu, a po jego zakończeniu zadanie odblokować go unlockOrientation:
/** Static methods related to device orientation. */
public class OrientationUtils {
private OrientationUtils() {}
/** Locks the device window in landscape mode. */
public static void lockOrientationLandscape(Activity activity) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
/** Locks the device window in portrait mode. */
public static void lockOrientationPortrait(Activity activity) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
/** Locks the device window in actual screen mode. */
public static void lockOrientation(Activity activity) {
final int orientation = activity.getResources().getConfiguration().orientation;
final int rotation = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
// Copied from Android docs, since we don't have these values in Froyo 2.2
int SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
int SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;
// Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO
if (!BuildVersionUtils.hasGingerbread()) {
SCREEN_ORIENTATION_REVERSE_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
SCREEN_ORIENTATION_REVERSE_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90){
if (orientation == Configuration.ORIENTATION_PORTRAIT){
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
else if (orientation == Configuration.ORIENTATION_LANDSCAPE){
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
else if (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270)
{
if (orientation == Configuration.ORIENTATION_PORTRAIT){
activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
}
else if (orientation == Configuration.ORIENTATION_LANDSCAPE){
activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
}
}
}
/** Unlocks the device window in user defined screen mode. */
public static void unlockOrientation(Activity activity) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
}
}
Oto konwersja Xamarin z @pstoppani odpowiedź powyżej.
UWAGA: dotyczy fragmentu, należy wymienić aktywność . z to., jeśli jest używane w ramach działania.
public void LockRotation()
{
ScreenOrientation orientation;
var surfaceOrientation = Activity.WindowManager.DefaultDisplay.Rotation;
switch (surfaceOrientation) {
case SurfaceOrientation.Rotation0:
orientation = ScreenOrientation.Portrait;
break;
case SurfaceOrientation.Rotation90:
orientation = ScreenOrientation.Landscape;
break;
case SurfaceOrientation.Rotation180:
orientation = ScreenOrientation.ReversePortrait;
break;
default:
orientation = ScreenOrientation.ReverseLandscape;
break;
}
Activity.RequestedOrientation = orientation;
}
public void UnlockRotation()
{
Activity.RequestedOrientation = ScreenOrientation.Unspecified;
}
To nie jest testowane, ponieważ zastosowano inne podejście przed użyciem, ale może być użyteczne.
To jest ta sama odpowiedź, co pstoppani, i nie powiedzie się na tablecie. –
Ok dzięki. Działa to świetnie. To otrzyma aktualną orientację. getResources(). GetConfiguration().orientacja – Jared
Ostrożnie! Musisz rozróżnić, co zwraca getConfiguration() i jakie jest wymagane ustawienie setRequestedOrientation - zobacz moją odpowiedź poniżej dla szczegółów –
jest problem z tym podejściem. Upewnij się, że przeglądasz komentarz [tej odpowiedzi] (http://stackoverflow.com/a/3614089/1708390) –