私は縦長モードで使いたいアプリケーションがあるので、マニフェストXMLでAndroid:screenOrientation = "portrait"を定義しました。これは HTC Magic 電話では問題なく動作します(他の電話でも方向の変更が防止されます)。
しかし、ハードウェアを開くと HTC G1 電話機に問題があります QWERTYキーボード (仮想キーボードではありません)。私の活動はポートレートモードのままですが、再開されたように見え、すべての状態を失います。これは HTC Hero バージョンでは起こりません。
私のアプリケーションは非常に大きいので、キーボードを開いたときに再起動してすべての状態を失ってはいけません。どうすればそれを防ぐことができますか?
2013年4月の更新:これをしないでください。私が最初に質問に答えた2009年にはそれは良い考えではありませんでした、そしてそれは今本当に良い考えではありません。理由のためにhackbodによってこの答えを見なさい:
Androidでの向きの変更時にasynctaskを使ったアクティビティのリロードを避けます
AndroidManifest.xmlにAndroid:configChanges="keyboardHidden|orientation"
を追加します。これはシステムにあなたがどの構成変更を自分で処理しようとしているかを伝えます - この場合何もしないことによって。
<activity Android:name="MainActivity"
Android:screenOrientation="portrait"
Android:configChanges="keyboardHidden|orientation">
詳しくは開発者リファレンス configChanges をご覧ください。
ただし、アプリケーションはいつでも中断される可能性があります。アプリケーションを一時停止したときの状態を保存するためのコードを追加する必要があります。
更新:Android 3.2以降、 "screenSize"も追加する必要があります。
<activity
Android:name="MainActivity"
Android:screenOrientation="portrait"
Android:configChanges="keyboardHidden|orientation|screenSize">
開発者ガイドより 自分で設定変更を処理する
注意:Android 3.2(APIレベル13)以降では、デバイスが縦向きと横向きの間で切り替わるときにも「画面サイズ」が変わります。したがって、(minSdkVersion属性およびtargetSdkVersion属性で宣言されているように)APIレベル13以上で開発するときに、向きの変更によるランタイムの再起動を防止したい場合は、 "orientation"値に加えて "screenSize"値を含める必要があります。つまり、
Android:configChanges="orientation|screenSize"
を宣言する必要があります。ただし、アプリケーションがAPIレベル12以下をターゲットにしている場合、アクティビティは常にこの設定変更自体を処理します(Android 3.2以降のデバイスで実行している場合でも、この設定変更はアクティビティを再開しません)。
AndroidManifest.xmlを Intrications (以前のAshton)のように変更し、アクティビティが処理したいときにonConfigurationChangedイベントを処理するようにする必要があります。これはどのように見えるべきかです:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
私はあなたが両方を必要としているのをいつも見つけました
Android:screenOrientation="nosensor" Android:configChanges="keyboardHidden|orientation"
前述のように、(マニフェストファイル内の)アクティビティのAndroid:configChanges
をkeyboardHidden|orientation
に設定してから、次のようにします。
1)onConfigurationChanged()
をオーバーライドする
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//here you can handle orientation change
}
2)この行をあなたのアクティビティのonCreate()
に追加してください
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
onConfigurationChanged
に同じ行を追加するよりも優れています。アプリが縦モードになってから横モードに戻るからです(1回しか発生しませんが、厄介です)。
あなたの活動にAndroid:screenOrientation="nosensor"
を設定することもできます(マニフェストで)。 しかしこの方法では、向きの変更をまったく処理できません。
これを使って..
Android:screenOrientation="portrait"
あなたの活動のOnCreateメソッドでこのコードを使用してください:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
これであなたの向きは縦向きに設定され、変わることはありません。
AndroidManifest.xmlファイルで、ロックしたいアクティビティごとに最後のscreenOrientation
行を追加します。
Android:label="@string/app_name"
Android:name=".Login"
Android:screenOrientation="portrait" >
またはAndroid:screenOrientation = "landscape"。
あなたのandroidmanifest.xmlファイルに:
<activity Android:name="MainActivity" Android:configChanges="keyboardHidden|orientation">
または
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
コードで画面をロックするには、画面の実際の回転(0、90、180、270)を使用する必要があります。また、スマートフォンの場合は自然な位置は縦向きでタブレットの場合はそれは風景になります。
これがコード(ロックとロック解除の方法)です、それはいくつかのデバイス(スマートフォンとタブレット)でテストされました、そして、それは素晴らしい働きをします。
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);
}
Visual Studio Xamarinの場合:
あなたへのusing Android.Content.PM;
アクティビティ名前空間リスト。
[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]
あなたのクラスの属性として、
[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}
注意してください、今のところどの方法もうまくいかないようです!
Android Studio 1では、簡単な方法の1つはAndroid:screenOrientation="nosensor"
を追加することです。
これにより、画面の向きが効果的に固定されます。
追加する
Android:configChanges="keyboardHidden|orientation|screenSize"
あなたのマニフェストに.