Come faccio a disattivare il cambiamento dell'orientamento su Android?
-
19-09-2019 - |
Domanda
Ho una domanda che ho appena piacerebbe utilizzare in modalità verticale, così ho definito Android: screenOrientation = "ritratto" in XML manifesto. Questo funziona bene per la HTC Magic telefono (e impedisce modifiche di orientamento su altri telefoni pure).
Ma ho un problema con il HTC G1 telefono come apro l'hardware tastiera QWERTY (non la tastiera virtuale). La mia attività rimane in modalità ritratto, ma sembra avere riavviato e perde tutti i suoi stati. Questo non accade con la versione HTC Hero .
La mia domanda è abbastanza grande, quindi non voglio che per riavviare e perdere tutti i suoi stati quando la tastiera è aperta. Come posso evitare questo?
Soluzione
Aggiornamento aprile 2013: Non fare questo. Non è stata una buona idea, nel 2009, quando ho risposto alla domanda e non è davvero una buona idea ora. Vedere questa risposta da hackbod per motivi:
Evitare di ricaricare l'attività con AsyncTask sul cambiamento dell'orientamento in Android
Aggiungi android:configChanges="keyboardHidden|orientation"
al AndroidManifest.xml. Questo dice al sistema di quali cambiamenti di configurazione che si sta per gestire da soli -. In questo caso per non fare nulla
<activity android:name="MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation">
configChanges per ulteriori dettagli.
Tuttavia, l'applicazione può essere interrotta in qualsiasi momento, ad esempio, da una telefonata, così si dovrebbe aggiungere il codice per salvare lo stato della vostra applicazione quando è in pausa.
Aggiornamento: A partire da Android 3.2, è inoltre necessario aggiungere "Screensize":
<activity
android:name="MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation|screenSize">
Da guida Developer Gestione della configurazione cambiare se stessi
Attenzione: A partire da Android 3.2 (API di livello 13), la "dimensione dello schermo" cambia anche quando il dispositivo commuta tra verticale e orizzontale orientamento. Quindi, se si vuole evitare un riavviamento di runtime dovuti a modifica dell'orientamento non sviluppa per API di livello 13 o superiore (come dichiarati dal minSdkVersion e gli attributi targetSdkVersion), è deve includere il valore "Screensize" oltre alla "orientamento" valore. Cioè, è necessario dichiarare
android:configChanges="orientation|screenSize"
. Tuttavia, se il obiettivi applicativi livello di API 12 o più basso, allora la vostra attività sempre gestisce la modifica alla configurazione in sé (la modifica alla configurazione non riavviare l'attività, anche se in esecuzione su un Android 3.2 o superiore del dispositivo).
Altri suggerimenti
È necessario modificare AndroidManifest.xml come Intrications (in precedenza Ashton) menzionato e assicurarsi che l'attività gestisce l'evento onConfigurationChanged come lo vuoi gestito. Questo è come dovrebbe apparire:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Ho sempre trovato il necessario sia
android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"
Come detto, impostare android:configChanges
della vostra attività (nel file manifesto) per keyboardHidden|orientation
e poi:
1) Override onConfigurationChanged()
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//here you can handle orientation change
}
2) Aggiungere questa riga al onCreate()
della vostra attività
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
E 'meglio che aggiungere stessa linea per onConfigurationChanged
, perché la vostra applicazione si trasformi in modalità verticale e poi di nuovo al paesaggio (avverrà solo una volta, ma è fastidioso).
Inoltre è possibile impostare android:screenOrientation="nosensor"
per la vostra attività (in manifesto). Ma utilizzando questo modo un non sei in grado di gestire l'orientamento cambia affatto.
Utilizzare questa ..
android:screenOrientation="portrait"
Nel metodo OnCreate della vostra attività di questo codice:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Ora l'orientamento verrà impostato su ritratto e non cambierà mai.
Nel file AndroidManifest.xml, per ogni attività che si desidera bloccare aggiungere l'ultima riga screenOrientation
:
android:label="@string/app_name"
android:name=".Login"
android:screenOrientation="portrait" >
o Android:. ScreenOrientation = "paesaggio"
AndroidManifest.xml file:
<activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">
o
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Per bloccare lo schermo dal codice è necessario utilizzare la rotazione effettiva dello schermo (0, 90, 180, 270) e si deve conoscere la posizione naturale di esso, in uno smartphone posizione naturale sarà verticale e in un tablet, sarà orizzontale.
Ecco il codice (bloccare e sbloccare i metodi), è stato testato in alcuni dispositivi (smartphone e tablet) e funziona benissimo.
public static void lockScreenOrientation(Activity activity)
{
WindowManager windowManager = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
Configuration configuration = activity.getResources().getConfiguration();
int rotation = windowManager.getDefaultDisplay().getRotation();
// Search for the natural position of the device
if(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE &&
(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) ||
configuration.orientation == Configuration.ORIENTATION_PORTRAIT &&
(rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270))
{
// Natural position is Landscape
switch (rotation)
{
case Surface.ROTATION_0:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
case Surface.ROTATION_90:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
break;
case Surface.ROTATION_180:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
break;
case Surface.ROTATION_270:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
}
}
else
{
// Natural position is Portrait
switch (rotation)
{
case Surface.ROTATION_0:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
case Surface.ROTATION_90:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
case Surface.ROTATION_180:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
break;
case Surface.ROTATION_270:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
break;
}
}
}
public static void unlockScreenOrientation(Activity activity)
{
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
In Visual Studio Xamarin:
- Aggiungi:
using Android.Content.PM;
a voi elenco delle attività dello spazio dei nomi.
- Aggiungi:
[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]
come un attributo di classe a voi, così:
[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}
Aggiungi
android:configChanges="keyboardHidden|orientation|screenSize"
per il vostro manifesto.
Si prega di notare, nessuno dei metodi sembra funzionare ora!
Android studio 1 Un modo semplice è quello di aggiungere
android:screenOrientation="nosensor"
.
Ciò blocca efficacemente l'orientamento dello schermo.