回答:
取得するリソースを決定するために使用される現在の構成は、ResourcesのConfiguration
オブジェクトから利用できます。
getResources().getConfiguration().orientation;
値を見て、方向を確認できます。
int orientation = getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
// In landscape
} else {
// In portrait
}
詳細については、Androidデベロッパーをご覧ください。
android:screenOrientation="portrait"
)、このメソッドは、ユーザーがデバイスを回転させた方法に関係なく、同じ値を返します。その場合は、加速度計または重力センサーを使用して、方向を正しく把握します。
一部のデバイスでgetResources()。getConfiguration()。orientationを使用すると、エラーが発生します。最初はhttp://apphance.comでこのアプローチを使用していました。Apphanceのリモートロギングのおかげで、さまざまなデバイスでそれを見ることができ、断片化がここで役割を果たすことがわかりました。私は奇妙なケースを見ました:たとえば、HTC Desire HDでポートレートとスクエア(?!)を交互に:
CONDITION[17:37:10.345] screen: rotation: 270 orientation: square
CONDITION[17:37:12.774] screen: rotation: 0 orientation: portrait
CONDITION[17:37:15.898] screen: rotation: 90
CONDITION[17:37:21.451] screen: rotation: 0
CONDITION[17:38:42.120] screen: rotation: 270 orientation: square
または向きをまったく変更しない:
CONDITION[11:34:41.134] screen: rotation: 0
CONDITION[11:35:04.533] screen: rotation: 90
CONDITION[11:35:06.312] screen: rotation: 0
CONDITION[11:35:07.938] screen: rotation: 90
CONDITION[11:35:09.336] screen: rotation: 0
一方、width()とheight()は常に正しいです(ウィンドウマネージャーによって使用されるため、より適切なはずです)。最高のアイデアは、常に幅/高さのチェックを行うことだと思います。瞬間について考える場合、これはまさにあなたが望んでいることです-幅が高さ(縦)よりも小さいか、その逆(横)であるか、またはそれらが同じ(正方形)であるかを知ることです。
次に、この単純なコードに行き着きます。
public int getScreenOrientation()
{
Display getOrient = getWindowManager().getDefaultDisplay();
int orientation = Configuration.ORIENTATION_UNDEFINED;
if(getOrient.getWidth()==getOrient.getHeight()){
orientation = Configuration.ORIENTATION_SQUARE;
} else{
if(getOrient.getWidth() < getOrient.getHeight()){
orientation = Configuration.ORIENTATION_PORTRAIT;
}else {
orientation = Configuration.ORIENTATION_LANDSCAPE;
}
}
return orientation;
}
getWidth
とgetHeight
非推奨ではありません。
getSize(Point outSize)
代わりに使用してください。私はAPI 23.使用しています
この問題を解決する別の方法は、ディスプレイからの正しい戻り値に依存するのではなく、Androidリソースの解決に依存することです。
ファイルを作成しlayouts.xml
たフォルダにres/values-land
し、res/values-port
次の内容で:
res / values-land / layouts.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="is_landscape">true</bool>
</resources>
res / values-port / layouts.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="is_landscape">false</bool>
</resources>
ソースコードでは、次のように現在の向きにアクセスできます。
context.getResources().getBoolean(R.bool.is_landscape)
電話の現在の向きを指定する完全な方法:
public String getRotation(Context context){
final int rotation = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();
switch (rotation) {
case Surface.ROTATION_0:
return "portrait";
case Surface.ROTATION_90:
return "landscape";
case Surface.ROTATION_180:
return "reverse portrait";
default:
return "reverse landscape";
}
}
チアビングエン
getOrientation()
動作するか覚えていませんが、を使用してgetRotation()
いる場合、これは正しくありません。回転"Returns the rotation of the screen from its "natural" orientation."
ソースを取得します。そのため、スマートフォンではROTATION_0が縦長である可能性が高いですが、タブレットでは「自然な」方向が横長である可能性が高く、ROTATION_0は縦長ではなく横長を返すはずです。
以下は、画面の向きを取得する方法のコードスニペットデモです。hackbodとMartijnが推奨しています。
Orient方向変更時にトリガー:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
int nCurrentOrientation = _getScreenOrientation();
_doSomeThingWhenChangeOrientation(nCurrentOrientation);
}
private int _getScreenOrientation(){
return getResources().getConfiguration().orientation;
}
❸Thereは続く❷現在の画面の向きを取得するための代替ソリューションですマルタインのソリューションを:
private int _getScreenOrientation(){
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
return display.getOrientation();
}
★ 注:❷とbothの両方を実装しようとしましたが、RealDevice(NexusOne SDK 2.3)の向きでは、間違った向きが返されます。
★ 使用済みのソリューションをお勧めしますはより明確な、シンプルで魅力のように機能する、より有利な画面の向きを得るため ❷をます。
★オリエンテーションの戻りを注意深くチェックして、期待どおりに正しいことを確認します(物理デバイスの仕様によっては制限される場合があります)
お役に立てれば幸いです。
int ot = getResources().getConfiguration().orientation;
switch(ot)
{
case Configuration.ORIENTATION_LANDSCAPE:
Log.d("my orient" ,"ORIENTATION_LANDSCAPE");
break;
case Configuration.ORIENTATION_PORTRAIT:
Log.d("my orient" ,"ORIENTATION_PORTRAIT");
break;
case Configuration.ORIENTATION_SQUARE:
Log.d("my orient" ,"ORIENTATION_SQUARE");
break;
case Configuration.ORIENTATION_UNDEFINED:
Log.d("my orient" ,"ORIENTATION_UNDEFINED");
break;
default:
Log.d("my orient", "default val");
break;
}
これらの回答のほとんどが投稿されてからしばらく時間が経過し、一部は現在非推奨のメソッドと定数を使用しています。
これらのメソッドと定数をもう使用しないようにJarekのコードを更新しました。
protected int getScreenOrientation()
{
Display getOrient = getWindowManager().getDefaultDisplay();
Point size = new Point();
getOrient.getSize(size);
int orientation;
if (size.x < size.y)
{
orientation = Configuration.ORIENTATION_PORTRAIT;
}
else
{
orientation = Configuration.ORIENTATION_LANDSCAPE;
}
return orientation;
}
このモードConfiguration.ORIENTATION_SQUARE
はサポートされなくなったことに注意してください。
私はこれをテストしたすべてのデバイスで信頼できることがわかりました。 getResources().getConfiguration().orientation
実行時に画面の向きを確認します。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
それを行うもう1つの方法があります。
public int getOrientation()
{
if(getResources().getDisplayMetrics().widthPixels>getResources().getDisplayMetrics().heightPixels)
{
Toast t = Toast.makeText(this,"LANDSCAPE",Toast.LENGTH_SHORT);
t.show();
return 1;
}
else
{
Toast t = Toast.makeText(this,"PORTRAIT",Toast.LENGTH_SHORT);
t.show();
return 2;
}
}
ユーザーが縦向きを設定したかどうかに関係なく、API 28で2019年にテストされました。また、別の古い回答と比較して最小限のコードで、以下は正しい向きを提供します。
/** @return The {@link Configuration#ORIENTATION_SQUARE}, {@link Configuration#ORIENTATION_PORTRAIT}, {@link Configuration#ORIENTATION_LANDSCAPE} constants based on the current phone screen pixel relations. */
private int getScreenOrientation()
{
DisplayMetrics dm = context.getResources().getDisplayMetrics(); // Screen rotation effected
if(dm.widthPixels == dm.heightPixels)
return Configuration.ORIENTATION_SQUARE;
else
return dm.widthPixels < dm.heightPixels ? Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE;
}
http://developer.android.com/reference/android/view/Display.html#getRotation%28%29 getRotation()画面の回転を「自然」から返すため、getRotationv()を使用しても役に立たないと思い ますオリエンテーション。
したがって、「自然な」方向を知らない限り、回転は意味がありません。
私はもっと簡単な方法を見つけました、
Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
if(width>height)
// its landscape
この人に問題があるかどうか教えてください。
これはoneplus3などのすべての電話をオーバーレイします
public static boolean isScreenOriatationPortrait(Context context) {
return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
}
次のように正しいコード:
public static int getRotation(Context context){
final int rotation = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();
if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180){
return Configuration.ORIENTATION_PORTRAIT;
}
if(rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270){
return Configuration.ORIENTATION_LANDSCAPE;
}
return -1;
}
私の知っている古い記事。向きはどのようなものでも、入れ替えてもかまいません。この機能は、ポートレートとランドスケープの機能がデバイス上でどのように構成されているかを知る必要なく、デバイスを正しい方向に設定するために使用します。
private void initActivityScreenOrientPortrait()
{
// Avoid screen rotations (use the manifests android:screenOrientation setting)
// Set this to nosensor or potrait
// Set window fullscreen
this.activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
DisplayMetrics metrics = new DisplayMetrics();
this.activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
// Test if it is VISUAL in portrait mode by simply checking it's size
boolean bIsVisualPortrait = ( metrics.heightPixels >= metrics.widthPixels );
if( !bIsVisualPortrait )
{
// Swap the orientation to match the VISUAL portrait mode
if( this.activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT )
{ this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); }
else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ); }
}
else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); }
}
魅力的な作品!
この方法を使用して、
int orientation = getResources().getConfiguration().orientation;
String Orintaion = "";
switch (orientation)
{
case Configuration.ORIENTATION_UNDEFINED: Orintaion = "Undefined"; break;
case Configuration.ORIENTATION_LANDSCAPE: Orintaion = "Landscrape"; break;
case Configuration.ORIENTATION_PORTRAIT: Orintaion = "Portrait"; break;
default: Orintaion = "Square";break;
}
文字列にはOriantionがあります
これを行うには多くの方法がありますが、このコードは私にとってはうまくいきます
if (this.getWindow().getWindowManager().getDefaultDisplay()
.getOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
// portrait mode
} else if (this.getWindow().getWindowManager().getDefaultDisplay()
.getOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
// landscape
}
この解決策は簡単だと思います
if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
user_todat_latout = true;
} else {
user_todat_latout = false;
}
シンプルで簡単:)
Javaファイルで、次のように記述します。
private int intOrientation;
onCreate
方法と前にsetContentView
書き込み:
intOrientation = getResources().getConfiguration().orientation;
if (intOrientation == Configuration.ORIENTATION_PORTRAIT)
setContentView(R.layout.activity_main);
else
setContentView(R.layout.layout_land); // I tested it and it works fine.
Android 7 / API 24+で導入さgetResources().getConfiguration().orientation
れたマルチウィンドウのサポートがレイアウトをかなり乱す可能性があるため、今日では、レイアウトの理由でそうしている場合、明示的な方向を確認する良い理由はあまりないことも注目に値します。オリエンテーション。より良い使用を考慮する<ConstraintLayout>
と、代替レイアウト可能な幅や高さに依存して、あなたの活動に添付されている特定のフラグメントの例えば、使用されているレイアウトの存在を決定するための他のトリックと一緒に、またはありません。
これを使用できます(ここに基づいて):
public static boolean isPortrait(Activity activity) {
final int currentOrientation = getCurrentOrientation(activity);
return currentOrientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT || currentOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
public static int getCurrentOrientation(Activity activity) {
//code based on https://www.captechconsulting.com/blog/eric-miles/programmatically-locking-android-screen-orientation
final Display display = activity.getWindowManager().getDefaultDisplay();
final int rotation = display.getRotation();
final Point size = new Point();
display.getSize(size);
int result;
if (rotation == Surface.ROTATION_0
|| rotation == Surface.ROTATION_180) {
// if rotation is 0 or 180 and width is greater than height, we have
// a tablet
if (size.x > size.y) {
if (rotation == Surface.ROTATION_0) {
result = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
}
} else {
// we have a phone
if (rotation == Surface.ROTATION_0) {
result = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
}
}
} else {
// if rotation is 90 or 270 and width is greater than height, we
// have a phone
if (size.x > size.y) {
if (rotation == Surface.ROTATION_90) {
result = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
}
} else {
// we have a tablet
if (rotation == Surface.ROTATION_90) {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
}
}
return result;
}