[java] 안드로이드 폰의 방향 확인

Android 전화가 가로 또는 세로인지 확인하려면 어떻게합니까?



답변

검색 할 자원을 판별하는 데 사용되는 현재 구성은 자원 Configuration오브젝트 에서 사용 가능 합니다.

getResources().getConfiguration().orientation;

값을보고 방향을 확인할 수 있습니다.

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

자세한 정보는 Android 개발자 에서 찾을 수 있습니다 .


답변

일부 장치에서 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;
}


답변

이 문제를 해결하는 또 다른 방법은 디스플레이의 올바른 반환 값에 의존하지 않고 Android 리소스 분석에 의존하는 것입니다.

파일 생성 layouts.xml폴더에있는 res/values-landres/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";
            }
        }

치어 빈 응 우옌


답변

다음은 hackbodMartijn 이 화면 방향을 얻는 방법을 권장하는 코드 스 니펫 데모입니다 .

❶ 방향 변경시 트리거 :

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

hack hackbod가 권장하는 현재 방향을 얻으십시오 .

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

screen 현재 화면 방향을 얻는 대안 솔루션이 있습니다. Mar Martijn 솔루션을 따르십시오 .

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

참고 : ❷ & implement을 모두 시도했지만 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;
        }


답변

사용하다 getResources().getConfiguration().orientation올바른 방법으로 .

다른 유형의 풍경, 장치가 일반적으로 사용하는 풍경 및 다른 풍경을주의해야합니다.

여전히 관리 방법을 이해하지 못합니다.