programing

안드로이드에서 방향 변경을 비활성화하려면 어떻게 해야 합니까?

kingscode 2023. 8. 9. 22:15
반응형

안드로이드에서 방향 변경을 비활성화하려면 어떻게 해야 합니까?

세로 모드에서 사용하고 싶은 응용 프로그램이 있으므로 매니페스트 XML에서 Android:screenOrientation="세로"를 정의했습니다. 이는 HTC Magic 전화기에서 정상적으로 작동하며 다른 전화기에서도 방향 변경을 방지합니다.

하지만 하드웨어 QWERTY 키보드(가상 키보드가 아님)를 열 때 HTC G1 전화기에 문제가 있습니다.활동이 세로 모드로 유지되지만 다시 시작되고 모든 상태가 손실되는 것 같습니다.HTC Hero 버전에서는 이러한 현상이 발생하지 않습니다.

내 응용 프로그램은 상당히 크기 때문에 키보드를 열었을 때 다시 시작되어 모든 상태가 손실되는 것을 원하지 않습니다.어떻게 하면 막을 수 있을까요?

2013년 4월 업데이트:이러지마세요.제가 처음 질문에 답했을 때인 2009년에는 좋은 생각이 아니었고 지금은 정말 좋은 생각이 아닙니다.다음과 같은 이유로 hackbod의 답변을 봅니다.

Android에서 방향 변경 시 비동기 작업으로 활동 다시 로드 방지

더하다android:configChanges="keyboardHidden|orientation"AndroidManifest.xml 파일입니다.이 메시지는 시스템에 사용자가 직접 처리할 구성 변경사항을 알려줍니다(이 경우에는 아무것도 하지 않음).

<activity android:name="MainActivity"
     android:screenOrientation="portrait"
     android:configChanges="keyboardHidden|orientation">

자세한 내용은 개발자 참조 구성 변경을 참조하십시오.

그러나 전화 통화 등으로 언제든지 프로그램이 중단될 수 있으므로 프로그램이 일시 중지될 때 프로그램의 상태를 저장하기 위해 코드를 추가해야 합니다.

업데이트: Android 3.2부터는 "screenSize"도 추가해야 합니다.

<activity
    android:name="MainActivity"
    android:screenOrientation="portrait"
    android:configChanges="keyboardHidden|orientation|screenSize">

개발자 가이드에서 직접 구성 변경 처리

: 3 13방향과 할 때 크기됩니다.Android 3.2(API 레벨 13)부터는 장치가 세로 방향과 가로 방향으로 전환될 때 "화면 크기"도 변경됩니다.따라서 API 레벨 13 이상(minSdkVersion 및 targetSdkVersion 특성에 의해 선언됨)을 개발할 때 방향 변경으로 인한 런타임 재시작을 방지하려면 "방향" 값 외에 "screenSize" 값을 포함해야 합니다. 즉, 다을선야합니를 .android:configChanges="orientation|screenSize"그러나 응용 프로그램이 API 수준 12 이하를 대상으로 하는 경우 활동은 항상 이 구성 변경 자체를 처리합니다(이 구성 변경은 Android 3.2 이상의 장치에서 실행되는 경우에도 활동을 다시 시작하지 않습니다).

Complexations(이전의 Ashton)에서 언급한 대로 AndroidManifest.xml을 수정하고 작업이 원하는 대로 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다음과 같은 경우:

재정의onConfigurationChanged()

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    //here you can handle orientation change
}

활동에 이 줄 추가onCreate()

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

에 같은 라인을 추가하는 것보다 낫습니다.onConfigurationChanged앱이 세로 모드로 전환되었다가 가로로 다시 전환되기 때문입니다(한 번만 발생하지만 귀찮습니다).

또한 설정할 수 있습니다.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:screen Orientation="경관"입니다.

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

더하다

android:configChanges="keyboardHidden|orientation|screenSize" 

당신의 매니페스토까지.

Visual Studio Xamarin에서:

  1. 추가:

using Android.Content.PM;작업 네임스페이스 목록에 추가합니다.

  1. 추가:

[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]

클래스의 속성으로 다음과 같이 표시됩니다.

[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}

앱의 모든 활동에 대해 PRIOTRACT 모드만 사용하려면 응용 프로그램 클래스에서 아래와 같이 간단히 사용할 수 있습니다.

class YourApplicationName : Application() {

override fun onCreate() {
    super.onCreate()

    registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {

        override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        }

        override fun onActivityStarted(activity: Activity) {

        }

        override fun onActivityResumed(activity: Activity) {

        }

        override fun onActivityPaused(activity: Activity) {

        }

        override fun onActivityStopped(activity: Activity) {

        }

        override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {

        }

        override fun onActivityDestroyed(activity: Activity) {

        }

    })

}

}

지금은 어떤 방법도 효과가 없는 것 같습니다!

Android Studio 1에서 한 가지 간단한 방법은 다음과 같습니다.android:screenOrientation="nosensor".

이렇게 하면 화면 방향이 효과적으로 잠깁니다.

이전 솔루션:

@SuppressLint("SourceLockedOrientationActivity")
fun Activity?.lockScreenOrientation() {
    this ?: return

    val display: Display = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        display
    } else {
        @Suppress("DEPRECATION")
        windowManager.defaultDisplay
    } ?: return

    val width: Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        window.windowManager.currentWindowMetrics.bounds.width()
    } else {
        @Suppress("DEPRECATION")
        display.width
    }
    val height: Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        window.windowManager.currentWindowMetrics.bounds.height()
    } else {
        @Suppress("DEPRECATION")
        display.height
    }

    when (display.rotation) {
        // 0
        Surface.ROTATION_0 -> {
            requestedOrientation = if (height > width) {
                ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
            } else {
                ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
            }
        }
        // 1
        Surface.ROTATION_90 -> {
            requestedOrientation = if (width > height) {
                ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
            } else {
                ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT
            }
        }
        // 2
        Surface.ROTATION_180 -> {
            requestedOrientation = if (height > width) {
                ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT
            } else {
                ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
            }
        }
        // 3
        Surface.ROTATION_270 -> {
            requestedOrientation = if (width > height) {
                ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE
            } else {
                ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
            }
        }
    }
}

새로운 솔루션:

fun Activity?.lockScreenOrientation() {
    this ?: return
    requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LOCKED
}

솔루션 잠금 해제:

fun Activity?.unlockScreenOrientation() {
    this ?: return
    requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
}

언급URL : https://stackoverflow.com/questions/1512045/how-do-i-disable-orientation-change-on-android

반응형