안드로이드 개발 질문/답변
(글 수 45,052)
ScreenOrientaion (Land,Port) 각각에 따른 다름 엑티비티 띠우기
하나의 부모 액티비에서 2개의 자식 엑티비티를 띄우고자 합니다..
하나는 land(가로) 모드, 하나는 Port(세로) 입니다.
서로 사이에도 방향전환시 바꾸고자 하는데요..
에뮬을 통해서 방향을 전환을 해보면
로그에
I/WindowManager( 737): onOrientationChanged, rotation changed to 1 (가로)
I/WindowManager( 737): onOrientationChanged, rotation changed to 0 (세로)
이렇게 방향 전환시 로그가 찍히고 있습니다.
리스너를 통하여 쉽게 변경을 할수 있을줄 알았습니다.
OrientationListener
OrientationEventListener
SensorListener
SensorEventListener
OrientationEventListener 이걸 이름상 가장 정확할줄 알고 하니 값이 이상하게 나오더군요
결국 소스를 보니 가속도 측정하는 리스터 이더이다...
그럼 SensorEventListener로 계산을 해야하는데....너무 복잡하네요
주저리가 되어버렸는데요...
결국제가 궁금한것은요
1. 쉽게 가로 ,세로만 알수 있는 리스너가 있는지?
2. 부모 엑티비티에서 2개의 자식( 가로,세로) 액티비티를 manifest에서 지정할수 는 있는지 ?
그럼 수고하세요~
2009.09.04 10:37:36
답글 감사합니다.
하지만 적용을 해보니 문제점이 있네요~
위의 2가지를 사용하기 위해서는 manifest.xml에서 screenorientation를 prt나 land로 확정해 놓으면 사용할수가 없습니다.
확정을 해보면 1번은 한가지 값만 들어오고, 2번은 실행되지두 않네요
또한 실행을 해보면 순간적으로 가로에서 세로로 넘어가는것이 불명확할때가 발생합니다.
예를 들면 세로에서 가로로 바꿀경우 세로 모양을 디스플레이가 가로모드에서 하단이 잘려서 보이네요~
하지만 적용을 해보니 문제점이 있네요~
위의 2가지를 사용하기 위해서는 manifest.xml에서 screenorientation를 prt나 land로 확정해 놓으면 사용할수가 없습니다.
확정을 해보면 1번은 한가지 값만 들어오고, 2번은 실행되지두 않네요
또한 실행을 해보면 순간적으로 가로에서 세로로 넘어가는것이 불명확할때가 발생합니다.
예를 들면 세로에서 가로로 바꿀경우 세로 모양을 디스플레이가 가로모드에서 하단이 잘려서 보이네요~
2009.09.04 11:42:25
자세한 설명 부탁 드리겠습니다.
2. Xml의 뷰을 바꾸시는거라면 res/layout-land , res/layout-port 와 같이 폴더를 추가하시면 Orientation에 따라 리소스가 바뀝니다.
테스트 해보고 싶어 지금 마쳤는데요.
각각 두가지 폴더를만들고 같은이름의 xml을 생성한다음 내용을 조금 다르게 해서 실행해 보았습니다.
port 모드에서 land 로는 잘 바뀌는데 ,,,
land에서 port 로는 바뀌지가 않네요~
onConfigurationChanged 이 메서드롤 로그를 찍어보니 land 모드로 갈때는 나오는데 port 모드로 갈때는 로그가 보이지 않습니다.
결국 port 로 변경시에는 이 메서드가 실행이 안된다는 것인데 왜 그럴까요 ??
2. Xml의 뷰을 바꾸시는거라면 res/layout-land , res/layout-port 와 같이 폴더를 추가하시면 Orientation에 따라 리소스가 바뀝니다.
테스트 해보고 싶어 지금 마쳤는데요.
각각 두가지 폴더를만들고 같은이름의 xml을 생성한다음 내용을 조금 다르게 해서 실행해 보았습니다.
port 모드에서 land 로는 잘 바뀌는데 ,,,
land에서 port 로는 바뀌지가 않네요~
onConfigurationChanged 이 메서드롤 로그를 찍어보니 land 모드로 갈때는 나오는데 port 모드로 갈때는 로그가 보이지 않습니다.
결국 port 로 변경시에는 이 메서드가 실행이 안된다는 것인데 왜 그럴까요 ??
2009.09.04 11:45:36
문제는 이것이네요
manifest.xml
android:configChanges="orientation"
orientation변경마다 새로 onCreat하기 싫어서 막아놓았었는데..
이것을 없에버리니 문제가 해결되네요~
그러면 변경때마 새로 onCreate 하니..속도가 조금 걱정이기는 하네요~
manifest.xml
android:configChanges="orientation"
orientation변경마다 새로 onCreat하기 싫어서 막아놓았었는데..
이것을 없에버리니 문제가 해결되네요~
그러면 변경때마 새로 onCreate 하니..속도가 조금 걱정이기는 하네요~
2009.09.04 14:39:59
아 설명이 많이 부족했나봅니다. 죄송합니다.
2. 번의 경우 res/layout 이라고 되있는 폴더에 보통 우리가 xml 파일을 작성하고있습니다.
이것을 setContentView 라던지 inflate 서비스를 통해 java 로 가져와 처리해주게 되는데요
만약에 res/layout/a.xml 이렇게 레이아웃이 있다고 하면
이것을 같은이름으로
res/layout-land/a.xml , res/layout-port/a.xml 이렇게 두고
Activity에서 setContentView(R.layout.a); 라고 하면
Manifest에서 Orientation을 고정하지 않았다면
자동으로 폴더를 참조해서 가져오게 됩니다.
2. 번의 경우 res/layout 이라고 되있는 폴더에 보통 우리가 xml 파일을 작성하고있습니다.
이것을 setContentView 라던지 inflate 서비스를 통해 java 로 가져와 처리해주게 되는데요
만약에 res/layout/a.xml 이렇게 레이아웃이 있다고 하면
이것을 같은이름으로
res/layout-land/a.xml , res/layout-port/a.xml 이렇게 두고
Activity에서 setContentView(R.layout.a); 라고 하면
Manifest에서 Orientation을 고정하지 않았다면
자동으로 폴더를 참조해서 가져오게 됩니다.
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 {
}
}
2. Xml의 뷰을 바꾸시는거라면 res/layout-land , res/layout-port 와 같이 폴더를 추가하시면 Orientation에 따라 리소스가 바뀝니다.
위의 코드로 체크후 setContentView 같은것이나 inflate 로 하셔도 될듯 하고요.
엑티비티를 다르게 가시는 거라면 위의 Orientation 체크를 통해 Intent 를 날리는 방법이 있을 것 같습니다.