Android에서 레이아웃의 방향 변경을 감지하는 방법은 무엇입니까? 방금 방향 변경 기능을 구현했습니다. 예를

방금 방향 변경 기능을 구현했습니다. 예를 들어 레이아웃이 세로에서 가로로 (또는 그 반대로) 변경 될 때. 방향 변경 이벤트가 언제 끝났는지 어떻게 알 수 있습니까?

OrientationEventListener작동하지 않았다. 레이아웃 방향 변경 이벤트에 대한 알림을 받으려면 어떻게해야합니까?



답변

Activity 의 onConfigurationChanged 메소드를 사용하십시오 . 다음 코드를 참조하십시오.

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

또한 적절한 android : configChanges 를 포함 할 매니페스트 파일의 요소는
아래 코드를 참조하십시오.

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">

참고 : Android 3.2 (API 레벨 13) 이상에서는 기기가 세로 방향과 가로 방향 사이를 전환 할 때 ‘화면 크기’도 변경됩니다. 따라서 API 레벨 13 이상으로 개발할 때 방향 변경으로 인한 런타임 재시작을 방지하려면 API 레벨 13 이상에 대해 android : configChanges = “orientation | screenSize”를 선언해야합니다 .

이것이 당신을 도울 것입니다 … 🙂


답변

에서 레이아웃로드를 들어 레이아웃 토지 폴더 수단을 당신은 두 개의 별도의 레이아웃을 가지고 당신은 확인해야합니다 setContentView으로 onConfigurationChanged하는 방법.

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

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        setContentView(R.layout.yourxmlinlayout-land);
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        setContentView(R.layout.yourxmlinlayoutfolder);
    }
}

레이아웃이 하나만있는 경우이 메서드에서 setContentView를 만들 필요가 없습니다. 간단히

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

답변

onConfigurationChanged 후 모든 번들을 저장하는 방법을 보여주고 싶었습니다.

수업 직후 새 번들을 만듭니다.

public class MainActivity extends Activity {
    Bundle newBundy = new Bundle();

다음으로 “protected void onCreate”후에 다음을 추가하십시오.

@Override
public void onConfigurationChanged(Configuration newConfig) {
     super.onConfigurationChanged(newConfig);
     if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            onSaveInstanceState(newBundy);
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            onSaveInstanceState(newBundy);
        }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBundle("newBundy", newBundy);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    savedInstanceState.getBundle("newBundy");
}

이것을 추가하면 생성 된 모든 클래스가 MainActivity에 저장됩니다.

그러나 가장 좋은 방법은 AndroidManifest에 다음을 추가하는 것입니다.

<activity name= ".MainActivity" android:configChanges="orientation|screenSize"/>

답변

이 방법을 사용

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
        Toast.makeText(getActivity(),"PORTRAIT",Toast.LENGTH_LONG).show();
       //add your code what you want to do when screen on PORTRAIT MODE
    }
    else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        Toast.makeText(getActivity(),"LANDSCAPE",Toast.LENGTH_LONG).show();
        //add your code what you want to do when screen on LANDSCAPE MODE
   }
}

그리고 이것을 Androidmainfest.xml에 추가하는 것을 잊지 마십시오.

android:configChanges="orientation|screenSize"

이렇게

<activity android:name=".MainActivity"
          android:theme="@style/Theme.AppCompat.NoActionBar"
          android:configChanges="orientation|screenSize">

    </activity>

답변

활동의 메서드 onConfigurationChanged 재정의


답변

위에서 설명한대로 여러분 중 일부와 관련된 또 다른 대안을 제안하고 싶습니다.

android:configChanges="orientation|keyboardHidden" 

주입 할 레이아웃을 명시 적으로 선언했음을 의미합니다.

레이아웃 랜드 및 레이아웃 폴더 덕분에 자동 주입을 유지하려는 경우. onCreate에 추가하기 만하면됩니다.

    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        getSupportActionBar().hide();

    } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        getSupportActionBar().show();
    }

여기에서 전화기의 방향에 따라 액션 바를 표시하거나 표시하지 않습니다.


답변

OrientationEventListener클래스 의 인스턴스를 만들고 활성화합니다.

OrientationEventListener mOrientationEventListener = new OrientationEventListener(YourActivity.this) {
    @Override
    public void onOrientationChanged(int orientation) {
        Log.d(TAG,"orientation = " + orientation);
    }
};

if (mOrientationEventListener.canDetectOrientation())
    mOrientationEventListener.enable();