스마트기기개발관련/안드로이드 개발

안드로이드 개발 portrait & landscape 처리, 화면 회전 관련

AlrepondTech 2020. 9. 18. 07:38
반응형

 

 

 

=================================

=================================

=================================

 

 

 

 

출처: http://minche.tistory.com/22


안드로이드 폰의 슬라이드가 열리고(landscape),  닫혀서(portrait) 화면이 전환될 때 
필요한 처리를 삽입하는 부분입니다.

아래 코드와 같이 액티비티 코드 내에 onConfigurationChanged() 함수를 오버라이딩하여 사용하면 됩니다.

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

      Log.i(LOGTAG, "=== onConfigurationChanged is called !!! ===");
            
   if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { // 슬라이드 닫힐때
    Log.i(LOGTAG, "=== Configuration.ORIENTATION_PORTRAIT !!! ===");    
   } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { // 슬라이드 열릴때
    Log.i(LOGTAG, "=== Configuration.ORIENTATION_LANDSCAPE !!! ===");   
   }
  }  

 

=================================

=================================

=================================

 

 



출처: http://bhnbhn.tistory.com/entry/Android-Portrait-Landscape-Mode-%EC%97%90-%EB%94%B0%EB%A5%B8-Activity-%EC%A0%81%EC%9A%A9


#1. Portrait, Landscape Mode Check

1)
getWindowManager().getDefaultDisplay().getOrientation();

2) 
int screenHeight = getWindow().getWindowManager().getDefaultDisplay().getHeight(); 
int screenWidth = getWindow().getWindowManager().getDefaultDisplay().getWidth(); 
if (screenWidth > screenHeight) {   }

3)
public void onConfigurationChanged (Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        
        if (newConfig.orientation == newConfig.ORIENTATION_PORTRAIT) {
        }  else {
          
        }
}
** onConfigurationChanged() 를 override 하기 위해서는 Activity를 상속받아야 한다.


#2. Portrait, Landscape에 따른 XML을 각각 구성
- res/layout-land
- res/layout-port



=================================

=================================

=================================

 

 



 

 

 

        Resource에서 화면(layout) 정의

·        세로 화면 :/res/layout-port/~.xml

·        가로 화면 :/res/layout-land/~.xml

·        회전 상태 확인

·        Android 2.1

WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);

Display display = wm.getDefaultDisplay();

 

//--- orientation : 0. 세로, 1. 가로

int orientation = display.getOrientation();

·        Android 2.2

WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);

Display display = wm.getDefaultDisplay();

 

//--- Surface.ROTATION_0  : 세로

//--- Surface.ROTATION_90  : 가로

//--- Surface.ROTATION_180 : 세로

//--- Surface.ROTATION_270 : 가로

int rotation = display.getRotation();

·        화면 회전 금지 방법 1

·        AndroidManifest.xml에서 모든 Activity 다음을 추가 한다.

android:screenOrientation="portrait"       //--- 세로 화면 고정

android:screenOrientation="landscape"      //--- 가로화면 고정

·        화면 회전 금지 방법 2

//--- public void onCreate(Bundle savedInstanceState) 함수에서

//--- setContentView(~); 다음에 아래 라인을 추가 한다.


//--- 
세로 화면 고정
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  
//--- 
가로 화면 고정
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

·        화면이 회전해도 Activity 다시 로딩되지 않도록 하는 방법

·        Activity 다시 로딩되지 않으므로 화면의 크기는 변하지 않는다. 따라서 수작업으로 화면을 조정해 주어야 한다.

·        AndroidManifest.xml에서 모든 Activity 다음을 추가 한다.

android:configChanges="keyboardHidden|orientation"

·        모든 Activity 다음을 추가 한다.

@Override

public void onConfigurationChanged(ConfigurationnewConfig) {

   super.onConfigurationChanged(newConfig);

 

   switch(newConfig.orientation) {

        caseConfiguration.ORIENTATION_PORTRAIT:   
            //--- 
수작업으로 세로 화면 생성

            break;

        caseConfiguration.ORIENTATION_LANDSCAPE:  
            //--- 
수작업으로 가로 화면 생성

            break;

    }

}

·        화면 회전시 정보를 저장한  복구하는 방법

·        public void onCreate(Bundle savedInstanceState) 복구와 관련된 코딩을 한다.

Object obj = getLastNonConfigurationInstance()

if (obj != null) {

   HashMap<String, Object> map = (HashMap<String, Object>) obj;

    //--- 저장된 복구 데이터로 화면 또는 Thread를 복구 한다.

}

·        public void onDestroy() 화면 종료와 관련된 코딩을 한다.

public void onDestroy() {

   if(isFinishing()) {

       //--- 화면이 종료될 때, Thread 처리 등을 한다.

       //---  worker.interrupt();

        //---   worker = null;

    } else {

               //--- 화면이회전할 때

    }

   super.onDestroy();

}

·        public Object onRetainNonConfigurationInstance() 화면 회전시 데이터를 저장하는 코딩을 한다.

public Object onRetainNonConfigurationInstance() {

   HashMap<String, Object> map = null;

 

    map = newHashMap<String, Object>();

    //--- 화면 또는 Thread에서 복구할 데이터를 저장 한다.

    return map;

}

·        참고 문헌

·        안드로이드 UI 디자인 패턴, 2010.5.19 by Google

·        Icon Design Guidelines, Android 2.0

·        Supporting MultipleScreens, 2010.5

·        화면 회전을 빠르게 처리하기 (Faster Screen Orientation Change),2010.6


*** 참고 문헌 ***

·        오픈소스 비즈니스 컨설팅 - Android

·        오픈소스 비즈니스 컨설팅 - Android SDK

 

 

 

 

반응형

 

728x90

 

 

 

=================================

=================================

=================================

 

 

 

출처: http://jmnote.com/wiki/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C_%ED%9A%8C%EC%A0%84_%EB%A7%89%EA%B8%B0

안드로이드 회전 막기

Jmnote

android activity rotation lock안드로이드 화면회전 막기, 안드로이드 액티비티 방향 고정안드로이드 화면 고정, 안드로이드 회전 고정

목차

  [숨기기

핵심코드

  • Activity 클래스의 onCreate 메소드에 아래와 같은 코드 추가

세로로 고정 (길게)

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

→ 정방향 세로로 완전히 고정. 회전불가

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);

→ 역방향 세로 가능. 즉 180도 회전은 가능가로로 고정 (넓게)

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

→ 정방향 가로로 완전히 고정. 회전불가

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);

→ 역방향 가로 가능. 즉 180도 회전은 가능

전체코드 예시

  • MainActivity.java를 수정한 예시
  • 최초 실행되는 MainActivity에 적용되며, 액티비티가 여러 개라면 각 클래스마다 설정해야 함
  • 세로 방향으로 고정됨

package com.example.myfirstapp; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }

 

 

 

=================================

=================================

=================================

 

 

 

 

출처:http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=android&wr_id=14

안드로이드는 화면 회전시(가로=>세로로 전환 또는 반대) oncreate를 다시 호출하기 때문에

기본적으로 내용이 페이지를 처음 열었을때와 같이 변경됩니다. 이를 방지하기 위한 방법 입니다.

주요시스템 변경은 onConfigurationChanged를 이용해 감지할 수 있습니다


orientation: 스크린이 세로에서 가로로 바뀌는것
keyboardHidden: 키보드가 보여지거나 숨겨지는것.
fontScale: 사용자가 원하는 폰트의 크기를 변경하는것.
locale: 사용자가 언어 세팅을 변경하는것.
keyboard: 키보드의 종류가 바뀌는것.



1. AndroidMainfest 정의
<activity android:configchanges="orientation|keyboardhidden"></activity>


2. Source Code 에 추가하기

1 @Override
2 public void onConfigurationChanged(Configuration newConfig) {
3    super.onConfigurationChanged(newConfig);
4    /*
5    // 위 소스만 적용했을때 내용이 유지되고 추가 코드를 입력할때는 아래와 같이 한다
6    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
7       // 가로모드로 변경되었을때 
8    if (newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO)
9       // 키보드가 보여질때
10    */
11 }
12



3. Configuration
http://developer.android.com/reference/android/R.attr.html#configChanges
http://developer.android.com/reference/android/content/res/Configuration.html

전체댓글수 2

  • 활화산ㅋ 10-08-11 08:13 소스보기
  • 적용해 보아야겠네요
  • 루지메이앙 10-08-12 19:12 소스보기
  • configchanges="orientation|keyboardhidden 를 
    configChanges="orientation|keyboardHidden 로 바꿔야 되네요.. 
    대소문자 구분이 안되었네요;

 

 

=================================

=================================

=================================

 

 

반응형