Pergunta

Eu tenho um aplicativo que eu gostaria de usar no modo retrato, para que eu tenha definido android: screenOrientation = "retrato" na XML manifesto. Este OK trabalha para o HTC telefone Magia (e orientação impede alterações em outros telefones também).

Mas eu tenho um problema com o telefone HTC G1 como eu abrir o hardware teclado QWERTY (não o teclado virtual). Minha atividade estadias em modo retrato, mas parece ter reiniciado e perde todos os seus estados. Isso não acontece com a versão HTC Hero .

A minha aplicação é muito grande, então eu não quero isso para reiniciar e perder todos os seus estados quando o teclado é aberto. Como posso evitar isso?

Foi útil?

Solução

Atualização abril 2013: Não faça isso. Não foi uma boa idéia em 2009, quando eu respondi a primeira a pergunta e ele realmente não é uma boa ideia agora. Veja esta resposta por hackbod por razões:

Evite recarregar atividade com AsyncTask na mudança de orientação no android

Adicionar android:configChanges="keyboardHidden|orientation" ao seu AndroidManifest.xml. Isso informa ao sistema que alterações de configuração que você está indo para lidar consigo mesmo -., Neste caso, por não fazer nada

<activity android:name="MainActivity"
     android:screenOrientation="portrait"
     android:configChanges="keyboardHidden|orientation">

Veja referência desenvolvedor configChanges para mais detalhes.

No entanto, a sua aplicação pode ser interrompido a qualquer momento, por exemplo, por uma chamada de telefone, então você realmente deve adicionar código para salvar o estado do seu aplicativo quando ele está em pausa.

Update: a partir de Android 3.2, você também precisa adicionar "screensize":

<activity
    android:name="MainActivity"
    android:screenOrientation="portrait"
    android:configChanges="keyboardHidden|orientation|screenSize">

De guia desenvolvedor manusear o Configuration Change-se

Atenção: Começando com Android 3.2 (nível API 13), o "tamanho da tela" também se altera quando o dispositivo comuta entre retrato e paisagem orientação. Assim, se você quer evitar de tempo de execução é reiniciado devido a mudança de orientação ao desenvolver para o nível API 13 ou superior (como declarados pelos atributos minSdkVersion e targetSdkVersion), você deve incluir o valor "screensize", além da "orientação" valor. Ou seja, você deve declarar android:configChanges="orientation|screenSize". No entanto, se o seu metas de aplicação de nível API 12 ou menor, então a sua atividade sempre lida com essa própria mudança de configuração (essa alteração de configuração não reinicia sua atividade, mesmo quando rodando em um Android 3.2 ou maior dispositivo).

Outras dicas

Você precisa modificar AndroidManifest.xml como Intrications (anteriormente Ashton) mencionado e certifique-se as alças de atividade do evento onConfigurationChanged como você quer manipulados. Este é como ele deve procurar:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

Eu sempre achei que você precisa tanto

android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"

Como disse, conjunto android:configChanges de sua atividade (em arquivo de manifesto) para keyboardHidden|orientation e depois:

1) Substituir onConfigurationChanged()

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    //here you can handle orientation change
}

2) Adicione esta linha ao onCreate() da sua actividade

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

É melhor do que add mesma linha para onConfigurationChanged, porque a sua aplicação vai virar para o modo retrato e depois voltar para paisagem (isso vai acontecer apenas uma vez, mas é irritante).

Além disso, você pode definir android:screenOrientation="nosensor" para a sua atividade (no manifesto). Mas utilizando desta forma você um não é capaz de mudanças de orientação punho em tudo.

Use este ..

    android:screenOrientation="portrait"

método Em OnCreate de sua atividade de usar este código:

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

Agora sua orientação será definido como retrato e nunca vai mudar.

No arquivo AndroidManifest.xml, para cada atividade que você deseja bloquear adicionar a última linha screenOrientation:

android:label="@string/app_name"
android:name=".Login"
android:screenOrientation="portrait" >

ou android:. ScreenOrientation = "paisagem"

Em sua AndroidManifest.xml arquivo:

   <activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">

ou

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

Para bloquear a tela de código que você tem que usar a rotação real da tela (0, 90, 180, 270) e você tem que saber a posição natural de que, em um smartphone a posição natural será retrato e na um tablet, será paisagem.

Aqui está o código (bloquear e desbloquear métodos), ele foi testado em alguns dispositivos (smartphones e tablets) e ele funciona muito bem.

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);
}

No Visual Studio Xamarin:

  1. Adicionar:

using Android.Content.PM;-lhe lista de atividades namespace.

  1. Adicionar:

[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]

como um atributo para você classe, assim:

[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}

Adicionar

android:configChanges="keyboardHidden|orientation|screenSize" 

para o seu manifesto.

Por favor note, nenhum dos métodos parece funcionar agora!

Na Estúdio Android 1 de uma maneira simples é adicionar android:screenOrientation="nosensor".

Isto bloqueia de forma eficaz a orientação da tela.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top