안드로이드 키보드, 키패드 기능


<안드로이드 키보드 옵션, AndroidManifest.xml >

안드로이드 키보드가 올라올시 레이아웃이 재조정되는 현상이 있었습니다. 

키보드가 올라오더라도 레이아웃이 유지되기를 원하는 경우 매니페스트 파일을 조정 필요


android:windowSoftInputMode="adjustPan"

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

액티비티 메인 윈도우에 대한 조정 : 소프트 키보드를 위한 공간을 만들기 위해 액티비티 메인 윈도우를 작게 줄일 지의 여부 또는 

메인 윈도우 일부가 소프트 키보드에 의해 가려질 때 현재 포커스를 보이도록 하기 위해 메인 윈도우의 컨텐트가 상하로 움직일 지의 여부를 설정한다.


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

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

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

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

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

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

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

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

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

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


< 키보드 보이기, 감추기 >

1. 키보드 감추기
EditText editText = (EditText) findViewById(R.id.myEdit);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

2. 키보드 보여주기
EditText editText = (EditText) findViewById(R.id.myEdit);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);

위 코드로 안보이는 경우 아래코드도 시도해보세요
- imm.showSoftInputFromInputMethod (editText .getApplicationWindowToken(),InputMethodManager.SHOW_FORCED);

onCreate등에서 제대로 동작하지 않는다면 
Handler로 post를 해서 위 코드를 실행시켜보세요.

3. 키보드 토글 - 위 두가지 방법으로 안되는 경우 다음과 같은 코드로 동작하는 경우가 있습니다.
imm.toggleSoftInputFromWindow(editText.getApplicationWindowToken(),  InputMethodManager.SHOW_FORCED, 0); 

4. 액티비티 시작시 자동으로 키보드 보여주기
AndroidManifest.xml의 activity 태그의 속성에 android:windowSoftInputMode="stateVisible" 혹은 "stateAlwaysVisible"삽입

5. 액티비티 시작시 자동으로 키보드 보여주지 않기
AndroidManifest.xml의 activity 태그의 속성에 android:windowSoftInputMode="stateHidden" 혹은 "stateAlwaysHidden" 삽입

6. 에디트 텍스트 선택해도 키보드 안뜨게 하기
EditText xml 속성에서 inputType 을 0으로 주면 안뜹니다.

7. 키보드 보여주기

	// onCreate 에서 아래 내용 추가하면, 앱 실행시 자동으로 키보드 올라옴.
	etMemo = (EditText) findViewById(R.id.etMemo);	// 임의의 EditText 
	etMemo.requestFocus();

8. 키보드 감추기

	// 키보드 종료가 필요한 곳에서 아래의 onBackPressed() 함수 호출
	InputMethodManager imm = null;
	imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);

	@Override
	public void onBackPressed() {
		imm.hideSoftInputFromWindow(etMemo.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
		super.onBackPressed();
	}

< 안드로이드 키보드 ActionDone 이벤트 받기 >

// xml 레이아웃 파일에서..

    
	android:layout_width="260px" 
	android:layout_height="55px"
	android:layout_gravity="left"
	android:layout_marginLeft="130px"
	android:layout_marginTop="25px"
	android:background="#00000000"
	android:maxLength="11"
	android:singleLine="true"
	android:gravity="center_horizontal|right"
	android:textStyle="bold"
	android:text=""
	android:textColor="#6a6a6a"
	android:textSize="24px"
	android:inputType="number"
	android:imeOptions="actionDone"
	android:cursorVisible="false">
    
	// onCreate 내에서..
	EditText et_price = (EditText) findViewById(R.id.et_price);
	et_price.setOnKeyListener(mKeyListener);

	et_price.setOnEditorActionListener(new OnEditorActionListener(){
		@Override
		public boolean onEditorAction(TextView v, int actionId,	KeyEvent event) {
                       Log.d("MiniApp", "et_price OnEditorActionListener,"+actionId+","+event);
		          if (actionId == EditorInfo.IME_ACTION_DONE) {		// et_price 입력창에서 키보드의 확인 버튼을 누를때 
						String sPrice = et_price.getText().toString();
						Log.d("MyTag", "KEYCODE_ENTER, Price="+sPrice);    
		          }	

			return false;
		}
			
	});

< 안드로이드 키보드 이벤트 받기 >
onCreate 에서..
EditText et_price = (EditText) findViewById(R.id.et_price);
et_price.setOnKeyListener(mKeyListener);
class 내에서..
	// mKeyListener
	View.OnKeyListener mKeyListener = new View.OnKeyListener() {
		
		@Override
		public boolean onKey(View v, int keyCode, KeyEvent event) {
			Log.d("MyTag", "onKey, keycode="+keyCode+", keyEvent="+event);
			switch(v.getId()){
				case R.id.et_price:
					if((keyCode == EditorInfo.IME_ACTION_DONE) || 
						(event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER 
                                                && event.getAction()==KeyEvent.ACTION_UP)) {  
					// 키패드 다음,확인,완료 버튼을 누른후 띨떼 처리 
                                        // (단 EditText의 속성중 android:imeOptions="actionDone" 이 아닐때만 처리)						

						String sPrice = et_price.getText().toString();
						Log.d("MyTag", "KEYCODE_ENTER, Price="+sPrice);				
					}					
					break;
			}

			return false;
		}
	};




end

+ Recent posts