web-dev-qa-db-ja.com

Android携帯で向きを確認する

Android携帯が横置きか縦置きかを確認するにはどうすればよいですか。

375
Mohit Deshpande

どのリソースを取得するかを決定するために使用される現在の設定は、ResourcesのConfigurationオブジェクトから入手できます。

getResources().getConfiguration().orientation;

その値を見れば、向きを確認できます。

int orientation = getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
    // In landscape
} else {
    // In portrait
}

詳しい情報は Android Developer にあります。

612
hackbod

一部のデバイスで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;
}
168
Jarek Potiuk

この問題を解決するもう1つの方法は、ディスプレイからの正しい戻り値に頼らずに、解決する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)
52
Paul

電話の現在の向きを指定する完全な方法:

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

チアビングエン

46

これは、 hackbodMartijn が推奨する画面の向きを取得する方法のコードスニペットデモです。

❶方向を変更したときにトリガーする:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
        int nCurrentOrientation = _getScreenOrientation();
    _doSomeThingWhenChangeOrientation(nCurrentOrientation);
}

❷現在の向きを hackbod の推奨どおりに取得します。

private int _getScreenOrientation(){    
    return getResources().getConfiguration().orientation;
}

❸現在の画面の向きを取得するための代替ソリューションがあります。❷フォロー Martijn ソリューション:

private int _getScreenOrientation(){
        Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
        return display.getOrientation();
}

注意:私は❷と❸の両方を実装してみましたが、RealDevice(NexusOne SDK 2.3)の場合は間違った向きを返します。

★だからiより良い利点を持っている画面の向きを得るために使用される解決策❷をお勧めします:明らかに、シンプルで魅力のように動作します。

★私たちの予想通りに正しいことを確認するために慎重に向きの戻りをチェックしてください(物理的なデバイスの仕様によっては限られているかもしれません)

それが助けを願っています、

27
NguyenDat
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;
        }
16
anshul

getResources().getConfiguration().orientationを使うのが正しい方法です。

あなたはただ異なったタイプの景色、装置が通常使用する景色および他に注意する必要があります。

それを管理する方法をまだ理解していません。

13
neteinstein

これらの答えの大部分が投稿されてからしばらく経っており、現在は非推奨のメソッドや定数を使用しているものもあります。

私は 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の使い方を示唆する方法とは対照的に、これをテストしたすべてのデバイスで信頼できることがわかりました。

12
Baz

実行時に画面の向きを確認してください。

@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();        
    }
}
6
Kumar

もう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;
    }       
}
5
maximus

Android SDKはこれを問題なく伝えることができます。

getResources().getConfiguration().orientation
4

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

この人に問題があるかどうか教えてください。

2
steveh

このコードは向きの変更が有効になった後に機能する可能性があると思います

Display getOrient = getWindowManager().getDefaultDisplay();

int orientation = getOrient.getOrientation();

setContentViewを呼び出す前に新しい方向について通知を受けたい場合は、Activity.onConfigurationChanged(Configuration newConfig)関数をオーバーライドし、newConfig、orientationを使用します。

2
Daniel

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;
}
2
ManuelTS

このようなこれは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;
    }
1
yueyue_projects

シンプルで簡単:)

  1. 2つのxmlレイアウト(縦と横)を作る
  2. 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.
    
1
Kerelos

私はこの解決法が簡単だと思います

if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
  user_todat_latout = true;
} else {
  user_todat_latout = false;
}
1
Issac Nabil

この方法を使用して、

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

文字列にはオリエンテーションがあります

1
user5037478

古い記事私は知っています。縦向きや横向きの機能がデバイス上でどのように構成されているかを知る必要なく、デバイスを正しい向きに設定するために使用されるこの機能を設計しました。

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

    }

魅力のように動作します!

1
Codebeat

これを行うには多くの方法がありますが、このコードは私には役に立ちます

 if (this.getWindow().getWindowManager().getDefaultDisplay()
                .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
             // portrait mode
} else if (this.getWindow().getWindowManager().getDefaultDisplay()
                .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
                      // landscape
        }
1
Mehroz Munir

アクティビティファイルで:

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        checkOrientation(newConfig);
    }

    private void checkOrientation(Configuration newConfig){
        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Log.d(TAG, "Current Orientation : Landscape");
            // Your magic here for landscape mode          
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            Log.d(TAG, "Current Orientation : Portrait");
            // Your magic here for portrait mode         
        }
    }

マニフェストファイルのAND:

<activity Android:name=".ActivityName"
            Android:configChanges="orientation|screenSize">

お役に立てば幸いです。

0
Viral Patel

Android 7/API 24+で導入された Multi-Window Support がめちゃくちゃになる可能性があるため、レイアウト上の理由からgetResources().getConfiguration().orientationを使用して明示的な方向付けをチェックするのはあまり良い理由ではありません。どちらの方向でもレイアウトはかなり異なります。どのレイアウトが使用されているかを判断するための他のトリックとともに、<ConstraintLayout>、および 利用可能な幅または高さに応じた代替レイアウト の使用を検討することをお勧めします。あなたの活動に添付されている特定の断片の有無。

0
qix

これを使うことができます( に基づいてここに ):

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