안드로이드 개발 중

어떤어떤 상황에 키보드를 숨기자..라는 경우가 있다


예를 들어 입력창 이외에 빈 화면을 클릭해 주면 키보드가 사라진다던지,

다른 화면으로 이동하면 사라진다던지.


이런 경우에는 아래의 키보드 숨기기 코드를 알맞게 넣어주면 된다


우선 키보드를 숨길 곳에서 import 해준다

import android.view.inputmethod.InputMethodManager;


그리고 인풋매니저를 선언해준다

private InputMethodManager ipm;

꼭 프라이빗일 필요는 없다


생성자에서 객체화해준다

ipm= (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);


이제 사용하면 된다

ipm.hideSoftInputFromWindow(가져갈 화면.getWindowToken(), 0);

여기서 가져갈 화면이란, 클릭한 곳을 넣어주면 된다

만약에 온리섬이나 액티비티 스타트 지점 등 막 시작된 지점에선 위 코드가 제대로 동작하지 않을 수 있다

또는 가져갈 화면이(포커스할 지점)없는 경우도 있다

그럴때는 위 소스 대신

ipm.toggleSoftInput( 0, 0 );

라는 소스를 써줘도 된다


그러니까 키보드가 떠있는데 특정 리니어 레이아웃 구역을 누를시 키보드가 사라지게 하고 싶다면

해당 리니어 레이아웃을 선언한뒤 객체로 만들어서,

해당 객체.setOnTouchListener(new OnTouchListener() { });

이렇게 온터치리스너 따위에다가 위의 코드를 넣어주면 된다


예제

import android.view.inputmethod.InputMethodManager;


private InputMethodManager ipm;

private LinearLayout lin;


ipm= (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

lin = (LinearLayout) findViewById(R.id.lin);


lin.setOnTouchListener(new OnTouchListener() {


ipm.hideSoftInputFromWindow(lin.getWindowToken(), 0);

//또는(위 코드가 동작하지 않는 곳이나 마땅히 포커스할 lin이없는 경우에는

//ipm.toggleSoftInput( 0, 0 );

//하지만 토글소프트 인풋의 경우, 키보드를 무조건 사라지게 하는게 아니라

//현재 상태의 반대로 만든다, 그러므로 무조건 사라지게 하고 싶다면 위 코드를 쓸것


});


이렇게 했는데 안되는 경우가 있다.

바로 온 크리에이트,리섬,스톱 중에 넣어주는 경우인데, 이럴때는 약간의 딜레이를 줘야 한다

   Timer timer = new Timer();

   timer.schedule(new TimerTask() {

       @Override

       public void run() {

           ipm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

           ipm.hideSoftInputFromWindow(포커스를줄객체명.getWindowToken(), 0);

            }

       }, 100);



자마린 - fragment OncreateView내에서 사용시 (InputMethodManager는 import해줘야함)

InputMethodManager manager = (InputMethodManager)this.Activity.GetSystemService(Context.InputMethodService);


rlayout.Touch += (s, e) => { manager.HideSoftInputFromWindow(rlayout.WindowToken, 0); };


그외상황

http://stackoverflow.com/questions/14991071/hide-keyboard-programmatically-in-monodroid





자마린- 메소드로 편하게 쓰기


1. 키보드 숨기기 메소드 추가

public void HideKeyboard(View view) {

   InputMethodManager manager = (InputMethodManager)GetSystemService(Activity.InputMethodService);

   manager.HideSoftInputFromWindow(view.WindowToken, 0);

}


mainLayout.Touch += (s, e) => { HideKeyboard((LinearLayout)s); };



Posted by 안드로메다에서 온 프로그래머

댓글을 달아 주세요

커스텀 리스트뷰 (listview) 새로고침(갱신)

커스텀 리스트뷰를 새로고침,그러니까 갱신을 하려고 아래와 같은 방법을 사용했다


Adaptername.clear();

Adaptername.remove(datavo);

listviewname.clearChoices();

Adaptername.notifyDataSetChanged();

Adaptername.notifyDataSetInvalidated();

HelloActivity.this.onRestart();

HelloActivity.this.reset();

listviewname.setAdapter(Adaptername);


결과적으로 어떻게 해야 하냐면


다 안된다


어탭터를

cusorAdapter를 사용하고

notifyDataSetChanged() 대신 changeCursor()을 사용해야 한다

API11부터 사용할 수 있다고 한다


결론  : 오늘은 하루종일 삽질을 했다


커서어댑터를 사용하지 않고 해결하는 방법

1.커스텀 리스트 뷰의 아답터에 데이터리스트를 연결하는 부분을 메소드로 만든다

2.리스트 뷰를 갱신해줘야 하는 경우에 해당 메소드를 사용한다

..이렇게 단순하게 해결할 수 있다. 대체 몇시간을 삽질한건지

괜히 notifyDataSetChanged 라는게 있으니까 그걸 사용해보고 싶어서 그랬는데,

커스텀 뷰에는 안되니까 이 글을 보신 분은 위처럼 단순하게 해결하면 된다. 

(삭제 구현시에는 해당 리스트 아이템을 remove해주는 방법은 있다)

프로그래머는 단순하게 생각해야 한다는걸 다시 깨달았다.


*리플로 인해 좀 더 간단하게 정리

리스트를 첫 초기화 시키는 부분을 메소드로 만들어

데이터가 들어오면 초기화를 다시 시킴.


Posted by 안드로메다에서 온 프로그래머

댓글을 달아 주세요

  1. 학생 2014.10.18 19:28  댓글주소  수정/삭제  댓글쓰기

    안녕하세요! 질문있습니다... 안드로이드 공부중인 학생인데요,

    1.커스텀 리스트 뷰에 아답터에 데이터리스트를 연결하는 부분을 메소드로 만든다

    이 부분이 잘 이해가 되지않습니다..

    adapter 를 정의할 때 어떠한 조치를 취하라는 말인가요??

    독학으로 공부중인데..힘드네요 ㅠㅠ 답변 부탁드립니다!

자바에서 String을 Int로 바꿔보고, 반대로도 바꿔봅시다.


//int To String
int i = 100;
String stringCase1 = String.valueOf(i); //방법 1, i가 null 일 시 null 리턴
String stringCase2 = Integer.toString(i); //방법 2, i가 null 일 시 NullPointerException발생

//String to int
String str = "100";
int intCase1 = Integer.parseInt(str); //방법1, 양수와 음수 모두 인식 가능
int intCase2 = Integer.valueOf(str); //방법2, 양수만 변환 가능(내부에 parseInt가 있음.)



Posted by 안드로메다에서 온 프로그래머

댓글을 달아 주세요