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

[android] 안드로이드 android 개발 키보드 옵션

AlrepondTech 2016. 8. 4. 15:24
반응형

 

 

 

 

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

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

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

 

 

 

 

 

 

출처: http://ceight.egloos.com/6386028

 

웹뷰에서 텍스트 입력시 키보드가 올라오면서 텍스트창을 막아버리는 현상이 발생하였다.

웹뷰를 scrollview로 감싸준뒤

Manifest에서 해당 Activity에 

android:windowSoftInputMode="stateHidden|adjustResize"


을 해주거나 해당 Activity Java파일에서 

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE );

같은 식으로 설정을 잡아주면 된다.


http://arabiannight.tistory.com/entry/277


adjustPan : 키보드가 올라오면 EditText에 맞춰 화면 UI가 실종 됩니다. (위 아래로 잘림)
adjustResize : 키보드가 올라와도 EditText와 UI가 화면에 보이도록 Activity를 resize 한다.

adjustPan / adjustResize 의 경우 웹뷰 단독으로만 있을경우 시각적으로는 차이가 없다.

 - 추가 : 스크롤뷰사용시 adjustPan 은 스크롤뷰 사이즈만큼 스크롤 불가 

-> adjustResize를 사용

stateHidden 옵션은 키보드를 일단 숨김상태로 시작하게한다.
 
 
풀스크린에서 adjustResize가 안먹히는 안드로이드 버그
 ->getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
 -> 꼭 fullscreen을 해야 되는 경우가 아니면 빼자
 
 
----------------------------------------------------------------------------------
 
http://develog.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%ED%92%80%EC%8A%A4%ED%81%AC%EB%A6%B0-%EC%95%B1%EC%97%90%EC%84%9C-adjustResize-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0
 
 
1) 풀스크린 만들기
보통 테마 설정에서 android:windowFullscreen 속성을true로 주거나,
액티비티 내에서 코드상으로 Window객체에 WindowManager.LayoutParams.FLAG_FULLSCREEN  속성을 주거나,
혹은 4.0+ 에선 DecorView의 setSystemUiVisibility()를 사용하여 설정할 것이다.
(이러면 앱이 실행중일땐 StatusBar가 안보이게 된다.)
 
2) 액티비티에서 소프트키보드가 나타나는 경우
adjustResize, adjustPan, adjustNothing 세 가지 옵션이 있는데,
각각 키보드 크기만큼 액티비티를 리사이징,
커서가 보이는 위치만큼 액티비티가 밀려 올라감,
액티비티 위를 키보드가 덮음을 의미한다.
 
 
3) 구글 개발자 문서를 보면 FLAG_FULLSCREEN은 SOFT_INPUT_ADJUST_RESIZE를 무시한다고 되어있다.
이는 풀스크린앱은 사용자가 컨텐츠에 집중하는 화면이기 때문에
구글에선 이 모드에서 사용자 입력이 없을것이라고 생각한것 같다. (아마도..)
 
4) 그래서 나는 setSystemUiVisibility()로 SYSTEM_UI_FLAG_FULLSCREEN 플래그를 줘서 풀스크린을 만들었는데,
문제는 이 경우 소프트키보드가 나타나면 StatusBar가 다시 나타난다는 것.
그리고 StatusBar가 나타나면서 화면 레이아웃이 휙휙 바뀌어버리니(액티비티 크기가 StatusBar의 높이만큼 변함)
부자연스럽다고 느낄수밖에..
 
5) 그래서 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 플래그를 같이 적용했다.
그럼 StatusBar가 오버레이되어 나오기 때문에 액티비티 사이즈가 변하지 않게되고,
그래서 자연스러웠는데......
 
6) 3)에서 FLAG_FULLSCREEN을 적용할 때와 마찬가지로 adjustResize가 작동하지 않는다(!!)
 
7) 이것때문에 풀스크린을 포기하자고 설득하려 했는데 가능하다는 답변이 돌아와서 그대로 적용..
힌트는 Dialog는 resize 된다는 거..
하하... 생각보다 너무 간단해서 내가 그동안 뭐한거지란 생각이 절로 들었다..
 
8) 테마의 android:windowIsFloating속성을 true로 주고
Window의 LayoutParams의 width와 height를 MATCH_PARENT로 조정해주면 간단하게 해결된다..
 
9) 나 진짜 이제까지 뭐한거지....ㅠㅠㅠㅠㅠ
 

 

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

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

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

 

 

//안드로이드 소프트키보드 옵션

 

출처: https://developer.android.com/guide/topics/manifest/activity-element.html#wsoft

 

 

 

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

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

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

 

 

 

위와 같이  android:windowSoftInputMode="adjustPan" 값을 설정 함을로서 키보드의 배치와 관련한 지시를 할 수 있게 됩니다.

  "adjustPan" 이 외에도 더 많은 설정값을 제공하는데요 해당 목록은 아래와 같습니다. 

stateUnspecified : 설정값 없음, System에서 알아서 설정하거나 기존의 Theme 값을 따른다.
stateUnchanged : 이전의 셋팅값을 유지한다.
stateHidden : 엑티비티 진입 시에 가상 키보드를 숨긴다.
stateAlwaysHidden : 가상 키보드를 항상 숨긴다.
stateVisible : 엑티비티 진입시 적절한 상황이면 가상 키보드를 보여준다.
stateAlwaysVisible : 엑티비티 진입 시에 가상 키보드를 보여준다.
adjustUnspecified : 설정값 없음. System에서 알아서 설정한다.
adjustResize : 엑티비티를 리사이즈 시켜 가상 키보드를 보여준다.
adjustPan : Window의 Focus가 Input Focus 에 맞추어 이동해서 보여준다.


기타 자세한 내용은 안드로이드 개발자 페이지에 기술 되어 있습니다.
http://developer.android.com/guide/topics/manifest/activity-element.html#wsoft

 

 

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

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

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

 

 

출처: http://tb.chan.je/484

 

Android FullScreen + AdjustResize

 

FullScreen 모드에서 adjustResize가 안되는 문제가 있습니다.

안드로이드 버그라고 하네요, 아래의 한 줄을 삽입하면 정상 작동~


getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);

 

출처 : http://zo2rock.tistory.com/8

 
 

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

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

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

 

 

출처: http://develog.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%ED%92%80%EC%8A%A4%ED%81%AC%EB%A6%B0-%EC%95%B1%EC%97%90%EC%84%9C-adjustResize-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0

 

 

진짜 이거 하나 해보겠다고 온갖 삽질을 다 했는데..

그 나마도 결과가 안좋아서 좌절하고 있던 차에.......

회사 내의 다른 개발자님들의 코드에서 답을 찾았다........ 쥬륵...ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

 

1) 풀스크린 만들기

보통 테마 설정에서 android:windowFullscreen 속성을true로 주거나,

액티비티 내에서 코드상으로 Window객체에 WindowManager.LayoutParams.FLAG_FULLSCREEN  속성을 주거나,

혹은 4.0+ 에선 DecorView의 setSystemUiVisibility()를 사용하여 설정할 것이다.

(이러면 앱이 실행중일땐 StatusBar가 안보이게 된다.)

 

2) 액티비티에서 소프트키보드가 나타나는 경우

adjustResize, adjustPan, adjustNothing 세 가지 옵션이 있는데,

각각 키보드 크기만큼 액티비티를 리사이징,

커서가 보이는 위치만큼 액티비티가 밀려 올라감,

액티비티 위를 키보드가 덮음을 의미한다.

 

3) 구글 개발자 문서를 보면 FLAG_FULLSCREEN은 SOFT_INPUT_ADJUST_RESIZE를 무시한다고 되어있다.

이는 풀스크린앱은 사용자가 컨텐츠에 집중하는 화면이기 때문에

구글에선 이 모드에서 사용자 입력이 없을것이라고 생각한것 같다. (아마도..)


4) 그래서 나는 setSystemUiVisibility()로 SYSTEM_UI_FLAG_FULLSCREEN 플래그를 줘서 풀스크린을 만들었는데,

문제는 이 경우 소프트키보드가 나타나면 StatusBar가 다시 나타난다는 것.

그리고 StatusBar가 나타나면서 화면 레이아웃이 휙휙 바뀌어버리니(액티비티 크기가 StatusBar의 높이만큼 변함)

부자연스럽다고 느낄수밖에..

 

5) 그래서 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 플래그를 같이 적용했다.

그럼 StatusBar가 오버레이되어 나오기 때문에 액티비티 사이즈가 변하지 않게되고,

그래서 자연스러웠는데......

 

6) 3)에서 FLAG_FULLSCREEN을 적용할 때와 마찬가지로 adjustResize가 작동하지 않는다(!!)

 

7) 이것때문에 풀스크린을 포기하자고 설득하려 했는데 가능하다는 답변이 돌아와서 그대로 적용..

힌트는 Dialog는 resize 된다는 거..

하하... 생각보다 너무 간단해서 내가 그동안 뭐한거지란 생각이 절로 들었다..

 

8) 테마의 android:windowIsFloating속성을 true로 주고

Window의 LayoutParams의 width와 height를 MATCH_PARENT로 조정해주면 간단하게 해결된다..

 

9) 나 진짜 이제까지 뭐한거지....ㅠㅠㅠㅠㅠ

 

10) 2016.03.26 내용 추가

테마 속성 중에 windowTranslucentNavigation을 true로 줬다면 이 방법으로도 adjustResize는 불가능하다.

완전한 풀스크린은 무조건 adjustPan으로 되버린다..ㅠㅠ

 

11) 2016.04.18 내용 추가

Activity, FragmentActivity 로는 안되고 AppCompatActivity로만 가능하다.

(즉 support-v7 library를 사용해야된다는 의미).
이 마저도 23.1.1버전까진 가능했으나 이후 3월에 릴리즈된 23.2.0버전부터는 적용되지 않는다.

 

12) 2016.05.10 내용 추가

23.1.1 까지 됐던 코드

public void onCreate(Bundle savedInstanceState){
getWindow().getAttributes().width = WindowManager.LayoutParams.MATCH_PARENT;

getWindow().getAttributes().height = WindowManager.LayoutParams.MATCH_PARENT;

setContentView(R.layout.activity_main);...}

 

23.2.0부터 되는 코드

public void onCreate(Bundle savedInstanceState){

setContentView(R.layout.activity_main);

getWindow().getAttributes().width = WindowManager.LayoutParams.MATCH_PARENT;

getWindow().getAttributes().height = WindowManager.LayoutParams.MATCH_PARENT;

...

}

 

예전 기억을 더듬어보니 setContentView()를 호출하기 전에

Window 관련 파라메터들을 설정하라면서 크래시를 냈던거같은데..

당황스럽군..;;

 

 

 

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

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

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

 

 

출처: http://caliou.tistory.com/19

 

 


안드로이드는 모바일 프로그래밍이기 때문에, 화면의 제약이 많습니다.
이에 따라서, 화면을 효율적으로 사용하기 위하여, 키보드가 올라왔을경우, 화면을 어떻게 표현할 것인가가 중요한 이슈가 되기도 하죠.

그래서, 안드로이드는 키보드가 화면에 보여질때 어떻게 표현할 것인가에 대해서, 몇가지 가이드라인을 주고 있습니다.

제가 겪은 일중 하나는, 안드로이드 키보드가 올라올시 레이아웃이 재조정되는 현상이 있었습니다. 
저는, 키보드가 올라오더라도 레이아웃이 유지되기를 원했습니다. 그래서, 
이것을 해결하기 위해, 매니페스트 파일을 조정해 주었습니다.

android:windowSoftInputMode="adjustPan"
저는 위의 방법을 썼네요, 

네임플레이스와, 옵션은 다음과 같습니다. 

android:windowSoftInputMode – 소프트 키보드 상태 : 액티비티가 사용자 관심의 포커스를 받을 때 소프트 키보드가 보여지는지 여부를 설정한다.

액티비티 메인 윈도우에 대한 조정 : 소프트 키보드를 위한 공간을 만들기 위해 액티비티 메인 윈도우를 작게 줄일 지의 여부 또는 메인 윈도우 일부가 소프트 키보드에 의해 가려질 때 현재 포커스를 보이도록 하기 위해 메인 윈도우의 컨텐트가 상하로 움직일 지의 여부를 설정한다.

[ 안드로이드 키보드 보이기 모드 옵션 ]

stateUnspecified : 소프트 키보드 상태에 대해 시스템이 적절한상태를 선택하거나 테마 설정값을 따른다. 소프트 키보드의 디폴트 설정 값.

stateUnchanged 

: 소프트 키보드는 마지막 상태로 유지

stateHidden 

: 사용자 액티비티를 선택할 때 소프트 키보드는 숨겨짐

stateAlwaysHidden 

: 액티비티의 메인 위도우가 입력 포커스를 가질 때 소프트 키보드는 항상 숨겨짐

stateVisible 

: 사용자가 액티비티 메인 위도우 앞으로 갈 때 소프트 키보드 보여짐

stateAlwaysVisible 

: 사용자가 액티비티를 선택할 때 소프트 키보드 보여짐

adjustUnspecified 

: 스크롤 할 수 잇는 레이아웃 뷰들을 가지고 있다면 윈도우 크기 재조정. 메인 윈도우의 디폴트 값. 시스템이 Pan, Resize등 알아서 선택. 스크롤이 가능한가?, 레이아웃에 여백이 얼마나 있는지 등을 고려해서, 알아서 조정해준다.

adjustResize 

: 스크린에 소프트 키보드 공간을 만들기 위해메인 윈도우 크기가 항상 재조정 됨. 뷰의 크기가 작아지죠, 하지만 모든 뷰가 보입니다.

adjustPan 

: 소프트 키보드 공간을 만들기 위해 메인 윈도우 크기가 재조정 되지 않음. 포커스를 받은 뷰가 보이게 할려면, 스크롤 하여 이동하여야 합니다. 입력받는 뷰는 보이지만, 다른 뷰들이 가려지는 현상이 있습니다. 다른 뷰들이 보이려면, back키로 키보드를 닫아야 합니다.

 

 

 

 

 

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

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

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

 

 

 

 

반응형

 

 

728x90

 

 

 

 

출처: http://arabiannight.tistory.com/entry/277

 

 

 

안드로이드 키보드 Window soft input mode 설정에 대한 설명 입니다.~!

해당 설정은 AndroidManifest.xml에 키보드가 실행 될 Activity에 설정해 주시면 됩니다.

ex)

 

 
 <activity android:name=".NoWeightActivity" android:windowSoftInputMode="adjustResize"/>

 

 

자 그럼 본격적으로 windowSoftInputMode 옵션에 대해 알아 보겠습니다.

 

  <예외>  : 
EditText가 키보드 올라오는 것에 영향을 받지 않으면 해당 옵션들이 적용 되지 않는다. 다시 말해 올라오는 키보드에 EditText가 영향을 받아야 아래의 옵션들이 적용 된다.

 

 

  1. 설정 X : adjustUnspecified  stateUnspecified 가 적용 된다.

 

 

  2. 
adjustPan : 키보드가 올라오면 EditText에 맞춰 화면 UI가 실종 됩니다. (위 아래로 잘림)

 

 

 

  3. adjustResize : 키보드
가 올라와도 EditText와 UI가 화면에 보이도록 Activity를 resize 한다.

 

 

 

  3. 
adjustUnspecified : 시스템이 알아서 상황에 맞는 옵션을 설정 한다. 키보드 조정에 대한 디폴트 값이다.

 

 

 

 

 

 4. stateHidden : Acitivty 실행 시 키보드가 자동으로 올라오는 것을 방지 한다.

 

 

 

 

 

 5. 
stateAlwaysHidden : Acitivty 실행 시 항상 키보드가 자동으로 올라오는 것을 방지 한다. (액티비티 이동 포함)

 

 

 

 

 

 6. 
stateVisible : Acitivty 실행 시 키보드가 자동으로 올라 온다. (EditText에 포커스 맞춰짐)

 

 

 

 7. 
stateAlwaysVisible Acitivty 실행 시 항상 키보드가 자동으로 올라 온다. (EditText에 포커스 맞춰짐) (액티비티 이동 포함)

 

 

 

 8. 
stateUnchanged 키보드를 마지막 설정 상태로 유지 한다.

 

 

 

 

 9. 
stateUnspecified 키보드의 상태가 설정이 안된 상태이다. 시스템이 적절한 키보드를 상태를 설정해 주거나 테마에 따라 설정 해준다. 키보드 상태의 디폴트 값이다. 

 

 


 

[Android Developer 키보드 설정 확인 하기]

 

 

 

안드로이드 키보드 옵션은 키보드가 올라 올 때 EditText를 가려야 만 적용이 됩니다. 왜냐하면 키보드 등장 시 EditText를 덮어 버리면 사용자가 입력한 문자를 볼 수 없기 때문 입니다.

 

EditText가 키보드에 가려지지 않을 경우 : 

어떤 옵션을 선택해도 적용 되지 않는다.

 









 

 

   

 

 

 

EditText가 키보드에 가려질 경우 : 

설정한 옵션이 적용 된다.

 










 

 

 

             [기본화면]                                [adjustPan]                                  [adjustResize]

 

 

 

스크롤뷰가 적용된 화면에서 EditText가 키보드에 가려진 경우 (설정 adjustResize) 

ScrollView 사이즈 만큼 스크롤을 사용 할 수 있다.

 











              [기본화면]                          [키보드 올라 왔을 경우]         


 





[ScrollView 사이즈 만큼 스크롤을 사용 할 수 있다] 

   

 

 

 

스크롤뷰가 적용된 화면에서 EditText가 키보드에 가려진 경우 (설정 adjustPan:

ScrollView 사이즈 만큼 스크롤을 사용 할 수 없다.

 







 

[기본화면]                          [키보드 올라 왔을 경우] 

[ScrollView 사이즈 만큼 스크롤을 사용 할 수 없다.]

 

 

 

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

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

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

 

 

 

 

반응형