2012-04-25 17 views
2

次のコードが付いたチェックボックスがあります:フリーズ画面の向き

私はそれをチェックするときに、画面が(私のタブレットのためのランドスケープ)システムの向きをデフォルトに回転させて
CheckBox cb = (CheckBox)findViewById(R.id.freezer); 
    cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (isChecked) { 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 
      } else { 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); 
      } 
     } 
    }); 

現在の方向をフリーズする必要があります。デバイスをポートレートに切り替えてチェックボックスをオンにした場合、CheckBoxがオフになるまでデバイスのローテーションを挿入する必要があります。

各デバイスは、それがmemeber変数を作成するには、現在の向きを取得する方法を知っているので、自分のSurface.ROTATION

答えて

6

ここに私の解決策があります。

private int getCurentOrientation() { 
    Display d = ((WindowManager) getSystemService(WINDOW_SERVICE)) 
      .getDefaultDisplay(); 
    boolean isWide = d.getWidth() >= d.getHeight(); 
    switch (d.getRotation()) { 
    case Surface.ROTATION_0: 
     return isWide ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE 
       : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 
    case Surface.ROTATION_90: 
     return isWide ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE 
       : ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 
    case Surface.ROTATION_180: 
     return isWide ? ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE 
       : ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 
    case Surface.ROTATION_270: 
     return isWide ? ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE 
       : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 
    } 
    return -1; 
} 

private void lockOrientation(boolean lock) { 
    if (lock) { 
     setRequestedOrientation(getCurentOrientation()); 
    } else { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); 
    } 
} 

4つのデバイス(2つのスマートフォンと2つのタブレット)では、neddedとして動作します。

1

ちょうど

if(isChecked){ 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
} else { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
} 
+0

正しい向きを取得する方法をご存知ですか? – styanton

+0

'ディスプレイの表示=((WindowManager)getSystemService(WINDOW_SERVICE))。getDefaultDisplay(); int orientation =表示。getOrientation(); '//ポートレート= 1;風景= 2; – Pallavi

+0

@styantonはあなたに合った答えを受け入れます。 – Pallavi

1

の書き込みがあるためDisplay.getRotationは()、解決策ではありません現在の設定状態を保存します。 short is_landscape = -1;

oncheckedchangeリスナーあなたの状態を永久に設定して保存できます。

if (is_landscape == -1) { 
    Configuration config_screen = getResources().getConfiguration(); 
    int orientation = config_screen.orientation; 
    if (orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     setRequestedOrientation(Configuration.ORIENTATION_LANDSCAPE); 
     is_landscape = 0; 
    } else { 
     setRequestedOrientation(Configuration.ORIENTATION_PORTRAIT); 
     is_landscape = 1; 
    } 
} 

問題は、デバイスを回転するたびにアクティビティを再作成して状態を失うことです。したがって、is_landscape変数を

に保存する
@Override 
protected void onSaveInstanceState(Bundle outState) { 
    oustate.putExtra("last_state", is_landscape); 
    super.onSaveInstanceState(outState); 
} 

you can restore your position on on restore instance 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    is_landscape = savedInstanceState.getShort("last_state"); 
    if (is_landscape == 0) { 
     setRequestedOrientation(Configuration.ORIENTATION_LANDSCAPE); 
    } else if (is_landscape == 1) { 
     setRequestedOrientation(Configuration.ORIENTATION_PORTRAIT); 
    } 
    super.onRestoreInstanceState(savedInstanceState); 
} 

インスタンスを保存して復元したくない場合は、使用することができます。

アンドロイド:あなたのmenifestファイルでconfigChanges =「方向」

が、それはあなたのデバイスの向きを変える上での活動を再作成することはできません。

うまくいくと思います。

あなたが逆の状態を検出する場合も、あなたは使用することができます

int型状態=(ウィンドウマネージャ)getSystemService(WINDOW_SERVICE))getDefaultDisplay()getRotation()。。。

状態がSurface.ROTATION_0である場合、それは状態がSurface.ROTATION_90ある場合、それは状態がSurface.ROTATION_180あれば状態はSurface.ROTATION_270それは意志その後であればそれは逆肖像 あろう景色 なり肖像 あろう逆景観であること

Surface.ROTATION_0とSurface.ROTATION_180の場合は、ポートレートを設定します。 は、Surface.ROTATION_90とSurface.ROTATION_270の場合にランドスケープを設定します。

また、向きが回転する代わりに回転を設定して、デバイスが指向の状態ではなく回転した状態になるようにすることもできます。

+0

あなたのコードはREVERSE_LANDSCAPEとREVERSE_PORTRAIT向きで失敗します – styanton

+0

もしそれがランドスケープとポートレートのために働いていれば、それは動作させることができます。あなたはreverse_landscapeとreverse_portraiモードを検出してその状態を保存して復元する必要があると思っています。 –

+0

あなたは今あなたの逆の状態を保存し、それを復元するonrestoreinstance残っているものを復元することができますあなたはreverse_landscapeとreverse_portraitを検出して保存する必要があるだけです。 –