背景:
小規模の調製においてAndroidアプリケーションは、このような問題が発生しました。電話は物理的なキーボードを開いたときに、画面が横長に肖像によって変換され、その後、アプリケーション(活性)のディスプレイインターフェイスは、これを破壊します人々はもっと落ち込んで作ります。
どのようにこの活動には、それを破壊されないことができますか?
背景分割線------------------------------------- ---------- -----------------------------------
お問い合わせ:
オンラインアンドロイド開発ので、いくつかの段落では:
装置の構成は、(によって定義されるような場合にはResources.Configuration
変更クラス)、ユーザインタフェースを表示するものは、その設定と一致するように更新する必要があります。アクティビティは、ユーザと対話するための主要なメカニズムであるので、構成の変更を処理するための特別なサポートを含みます。
特に指定しない限り、あなたの現在のアクティビティが発生します(たとえば、画面の向き、言語、入力デバイスなどの変化など)の構成変更をする破壊の通常の活動のライフサイクルプロセスを経、onPause()
、onStop()
、およびonDestroy()
適宜。アクティビティがフォアグラウンドにされたり、ユーザーに見える、一度していた場合onDestroy()
、そのインスタンスで呼び出され、その後の活動の新しいインスタンスが生成されていたからどんなsavedInstanceState前のインスタンスで、作成されますonSaveInstanceState(Bundle)
。
いくつかの特殊なケースでは、構成の変更の1つまたは複数のタイプに基づいて、あなたの活動の再開をバイパスすることもできます。これはで行われandroid:configChanges
、そのマニフェストの属性。あなたがそこに扱うと言う構成変更のいずれかのタイプでは、あなたの現在のアクティビティの呼び出しに送信されますonConfigurationChanged(Configuration)
代わりに再起動されている方法を。設定の変更は、あなたが処理しないこといずれかを必要とする場合は、しかし、活動はまだ再起動され、onConfigurationChanged(Configuration)
呼び出されません。
あなたの活動は、設定の変更を処理することを宣言するには、適切な編集<activity>
含まれるようにマニフェストファイル内の要素をあなたが処理したい設定を表す文字列値を持つ属性を。可能な値は、のドキュメントに記載されています(最も一般的に使用される値は、属性と、画面の向きの変更扱うようにしてたときに、キーボードの可用性の変更を処理するために)。あなたは、パイプ文字(「|」)で区切ることにより、属性に複数の設定値を宣言することができます。 android:configChanges
android:configChanges
orientation
keyboardHidden
例えば、次のマニフェストスニペットは、画面の向きの変更及びキーボード可用性変化の両方を処理するアクティビティを宣言します。
<活動のアンドロイド:名= "MyActivity。" アンドロイド:configChanges = "オリエンテーション| keyboardHidden" アンドロイド:ラベル= "@文字列/ APP_NAME">
これらのいずれかの構成が変更されたときに今、MyActivity
再起動されません。代わりに、活動への呼び出しを受けますonConfigurationChanged()
。このメソッドは、渡されたConfiguration
新しいデバイス構成を指定するオブジェクトを。フィールドを読み取ることによりConfiguration
、新しい構成を決定することができますし、あなたのインターフェイスで使用されるリソースを更新することにより、適切な変更を行います。このメソッドが呼び出された時点で、あなたの活動のResources
オブジェクトは、新しい設定に基づいてリソースを返すように更新されるので、簡単にあなたの活動を再開するシステムなしで、あなたのUIの要素をリセットすることができます。
------------------------------------分割ライン------------ -----------------------------
ソリューション:
上記の情報を読み取ることにより、解決策は非常に簡単です。
まず、追加の要素Mainifest.xml活動のandroid:configChanges =「オリエンテーション| keyboardHidden 」 プロパティ
< 活動の アンドロイド:名= "FileBrowser"
アンドロイド:ラベル= "@文字列/ APP_NAME"
アンドロイド:configChanges = "オリエンテーション| keyboardHidden" >
< 意図フィルタ>
< アクション アンドロイド:名= "android.intent.action.MAIN" />
< カテゴリ アンドロイド:名= "android.intent.category.LAUNCHER" />
</ 意図フィルタ>
</ アクティビティ>
アプリケーションは、キーボードと画面配向状態(または近いリリース)変更情報を処理することを意味し、このプロパティを追加します。しかし、デバイス構成情報の他の変更は、システムアンドロイド(破壊現在のアクティビティ、および、新しいアクティビティインスタンスを再起動する)によって処理されます。
だから、今、あなたは活動のサブクラスのJavaコード内のコードの変更を処理し、構成情報を追加する必要があります。また、これは非常に簡単です
/ **
* onConfigurationChanged
*パッケージ:android.content.res.Configuration。
* @param newconfigに保存、新しいデバイス構成。
*場合(例えば、画面の向きの変化、物理的キーボードまたは閉じプッシュ、等のような)変化を有するデバイス構成情報、
*この時点で活動し、ランニングがある場合、システムは、この関数を呼び出します。
*注:onConfigurationChanged AnroidMainifest.xmlでアプリケーションを監視します
*アンドロイド:configChangesは=「xxxxは」構成変更の種類を指定します。
*その他の設定変更については、システムは、()現在のアクティビティをonDestroyし、新しいアクティビティのインスタンスを再起動します。
* /
@オーバーライド
公共 のボイド onConfigurationChanged(構成newconfigに保存){
スーパー .onConfigurationChanged(newconfigに保存)。
//テスト画面の向き:縦または横
もし(この .getResources()。getConfiguration()。オリエンテーション
== Configuration.ORIENTATION_LANDSCAPE){
//現在の風景、余分な処理コードを追加します
}
それ以外の 場合(この .getResources()。getConfiguration()。オリエンテーション
== Configuration.ORIENTATION_PORTRAIT){
余分な処理コードを追加する//現在の縦画面、
}
リリースまたはクローズ://状態の物理的なキーボードを検出
もし(newConfig.hardKeyboardHidden
== Configuration.HARDKEYBOARDHIDDEN_NO){
ここでは、余分な処理コードを追加し、起動状態にある//物理的なキーボード、
}
それ以外の 場合(newConfig.hardKeyboardHidden
== Configuration.HARDKEYBOARDHIDDEN_YES){
閉じた位置にある//物理的なキーボード、ここで余分な処理コードを追加します
}
}
それでOK、画面の向きを変更する時間は、アプリケーションのディスプレイ・インターフェースではなく破壊されるの変化、となります!
-----------------------------------まだ------------ラインを割ます---------------------------------
拡張を追加しました:
プロパティ内の活動とに関連した画面の向きがあります:
< 活動
. . .
android:screenOrientation=["unspecified" | "user" | "behind" |
"landscape" | "portrait" |
"sensor" | "nosensor"]
. . .
</activity>
比如,在Mainifest.xml的Activity元素中增加这么一个属性:
android:screenOrientation="portrait"
则无论手机如何变动,拥有这个属性的activity都将是竖屏显示。
android:screenOrientation="landscape“,为横屏显示。
这里提一个小知识,Anroid模拟器中,快捷键"ctrl+F11"可以实现转屏。
横竖屏切换后可采用不同的布局文件,方法如下:
默认情况下(竖屏)是调用res/layout 中的布局,如果要自定义横屏时的布局,可以在res/目录下新建一个layout-land 文件,在这个文件夹中放置横屏的布局,横竖屏的XML 文件的名字必须一样。=====
layout-port和layout-land ----- 在activity中做判断,代码如下: Configuration newConfig = getResources().getConfiguration();" w/ j4 `: ]5 S0 ~) \/ D+ | if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){ //横屏时 setContentView(R.id.landscape); }else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ //竖屏时 setContentView(R.id.portrait);( o) y' l/ e3 \& \2 u }6 |
转自http://www.cnblogs.com/hibraincol/archive/2010/09/18/1829862.html
转载于:https://www.cnblogs.com/moiyer/archive/2011/10/26/2316163.html