문제

초상화 모드에서 사용하려는 응용 프로그램이 있으므로 Manifest XML에서 Android : Screenorientation = "Portrait"을 정의했습니다.이것은 괜찮습니다. HTC 매직 (다른 전화기에서도 방향 변경을 방지합니다)

하지만 문제가 있어요 HTC G1 하드웨어를 열면서 전화를 받음 QWERTY 키보드 (가상 키보드가 아님)내 활동은 세로 모드로 유지되지만 다시 시작되고 모든 상태가 손실되는 것 같습니다.이런 일이 발생하지 않습니다 HTC 히어로 버전.

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

도움이 되었습니까?

해결책

2013 년 4 월 업데이트 :이 작업을 수행하지 마십시오. 2009 년에 질문에 처음 답변 한 것은 좋은 생각이 아니었고 지금은 실제로 좋은 생각이 아닙니다. 이유는 HackBod 의이 답변을 참조하십시오.

안드로이드의 방향 변화에 대한 Asynctask로 활동을 다시로드하지 마십시오.

추가하다 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">

개발자 가이드에서 구성을 처리하면 직접 변경됩니다

주의 : Android 3.2 (API 레벨 13)부터 "화면 크기"도 장치가 인물 사진과 조경 방향을 전환 할 때도 변경됩니다. 따라서 API 레벨 13 이상을 개발할 때 방향 변경으로 인해 런타임이 다시 시작되는 것을 방지하려면 (MINSDKVersion 및 TargetSDKversion 속성으로 선언) "방향"값 외에 "스크린 크기"값을 포함해야합니다. 즉, 당신은 선언해야합니다 android:configChanges="orientation|screenSize". 그러나 애플리케이션이 API 레벨 12 이하를 대상으로하면 활동이 항상이 구성 변경 자체를 처리합니다 (이 구성 변경은 Android 3.2 이상에서 실행될 때에도 활동을 다시 시작하지 않습니다).

다른 팁

AndroidManifest.xml AS를 수정해야합니다 복잡한 (이전에 Ashton) 언급하고 활동이 처리하려는대로 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 그런 다음:

1) 재정의 onConfigurationChanged()

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

2) 활동에 이 줄을 추가하세요. onCreate()

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

같은 줄을 추가하는 것보다 낫습니다. onConfigurationChanged, 앱이 세로 모드로 바뀌었다가 다시 가로 모드로 전환되기 때문입니다(한 번만 발생하지만 짜증스럽습니다).

또한 설정할 수 있습니다 android:screenOrientation="nosensor" 귀하의 활동에 대해(매니페스트에서) 하지만 이 방법을 사용하면 방향 변경을 전혀 처리할 수 없습니다.

이거 ..

    android:screenOrientation="portrait"

활동의 onecreate 방법 에서이 코드를 사용하십시오.

    @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 : Screenorientation = "Landscape".

당신의 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);
}

Visual Studio Xamarin에서 :

  1. 추가하다:

using Android.Content.PM; 당신에게 활동 네임 스페이스 목록.

  1. 추가하다:

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

다음과 같이 클래스에 대한 속성으로.

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

추가하다

android:configChanges="keyboardHidden|orientation|screenSize" 

당신의 명백에.

메소드 중 어느 것도 작동하지 않는 것 같습니다!

~ 안에 안드로이드 스튜디오 1 간단한 방법은 추가하는 것입니다android:screenOrientation="nosensor".

이것은 화면 방향을 효과적으로 잠급니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top