TextView, Button 등등 Focus 주기

Posted by ITPangPang
2016. 11. 22. 23:16 안드로이드(android)/위젯(Widget)


TextView, Button 등등

 Focus 주기


ㆍ 이번에는 TextView나 Button 또는 LinearLayout등

    EditText외에도 다른 위젯들에 focus를 주는 방법

    대해 알아보겠습니다.


ㆍ 사실 뭐 EditText 외에 다른 View에 Focus 주는 경우는

    많지 않습니다. 


ㆍ 보통 앱이 처음 시작됬을때 화면에 EditText가 있을 경우

    자동으로 키보드가 올라오는 경우가 있는데 이를 방지하기 위해

    다른 View에 focus를 줘서 키보드가 올라오지 않도록 많이들 쓰곤 합니다. 


ㆍ 그 외에도 저는 꼼수를 위해서 쓰기도 합니다.. 애매한 상황에서 강제로 View에

    focus를 준 후에 getCurrentFocus()라는 현재 Focus를 받는 View를 알려주는 메서드

    있는데 이 둘을 조합해서 사용하면 은근히 막힌 문제를 쉽게 해결할 수 있습니다.



강제로 Focus 주기

    

아주 간단합니다.

강제로 focus 주는 방법은

View.requestFocus();

이렇게 Focus를 요청하면

강제로 들어갑니다


button.requestFocus();

(Button)

tv.requestFocus();

(TextView)

ll.requestFocus();

(LinearLayout)


하지만 이 전에 한가지를

더 추가해줘야 합니다.


View.setFocusableInTouchMode(true);

이 놈을 그 전에 추가해줘야합니다


코드로 보면 이런식이 되겠죠

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn1 = (Button)findViewById(R.id.btn1);
Button btn2 = (Button)findViewById(R.id.btn2);
Button btn3 = (Button)findViewById(R.id.btn3);
TextView tv = (TextView)findViewById(R.id.tv);

btn1.setFocusableInTouchMode(true);
btn2.setFocusableInTouchMode(true);
btn3.setFocusableInTouchMode(true);
tv.setFocusableInTouchMode(true);

btn1.requestFocus();
btn2.requestFocus();
btn3.requestFocus();
tv.requestFocus();


코드는 이것으로 완성입니다.


저는 근데 직접

눈으로 확인하는것을

좋아하므로..


왜??

requestFocus만 쓰면

될 것 같은데..

setFocusableIntouchMode(true)를

써야 하는가..?


꼭 써야 하는가..?


간단한 Focus 실험 시작


일단 테스트를 위하여

버튼과 EditText를 배치해보겠습니다.


간단하게 버튼3개, TextView, EditText를

만들었습니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.tistory.itpangpang.focusex.MainActivity">

<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/btn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="이것은 텍스트뷰"
android:textSize="20dp"
/>
<EditText
android:id="@+id/et"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

</LinearLayout>


그 다음 자바코드에서

Log에 getCurrentFocus();를

넣어줍니다

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText et = (EditText)findViewById(R.id.et);
Button btn1 = (Button)findViewById(R.id.btn1);
Button btn2 = (Button)findViewById(R.id.btn2);
Button btn3 = (Button)findViewById(R.id.btn3);
TextView tv = (TextView)findViewById(R.id.tv);
Log.d("TEST","현재 포커스=>"+getCurrentFocus());
}

이제 이 상태에서

앱을 실행시켜보면


현재 포커스 받는 View가 없네요


그럼 EditText에 한번 강제포커스를

줘보겠습니다.

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText et = (EditText)findViewById(R.id.et);
Button btn1 = (Button)findViewById(R.id.btn1);
Button btn2 = (Button)findViewById(R.id.btn2);
Button btn3 = (Button)findViewById(R.id.btn3);
TextView tv = (TextView)findViewById(R.id.tv);
et.requestFocus();
Log.d("TEST","현재 포커스=>"+getCurrentFocus());

requestFocus();를

적어주니 포커스가 잘 잡히네요


그럼 역시 마찬가지로

Button이나 TextView에

requestfocus();를 넣어보겠습니다.

btn1.requestFocus();

or

tv.requestFocus();

이렇게 적어주고 한번 돌려보면

결과는

둘 다 EditText와는 다르게

null값이 떨어집니다.


이번에는 위에서 말한대로

setFocusableTouchMode(true);

를 추가 한 후에 확인해보겠습니다.

btn1.setFocusableInTouchMode(true);

btn1.requestFocus();

or

tv.setFocusableInTouchMode(true);

tv.requestFocus();

결과를 확인해보면

setFocusableTouchMode(true);

추가 해주니 Focus가 아주 잘잡히는것을

확인 할 수 있었습니다


왜 그런가

Reference를 한번 봤더니

여기도 별 것 없네요..

그냥 예상했던데로 만약 True이면

focus를 받을 수 있는 상태로

만들어 준다네요


그래서 결론은 EditText외에

다른 View에 포커스를 주기 위해서는

setFocusableTouchMode(true);

를 써준후에

requestFocus();

를 써주자!