TextView, Button 등등 Focus 주기
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();
를 써주자!
'안드로이드(android) > 위젯(Widget)' 카테고리의 다른 글
EditText Keyboard show/hide 이벤트 잡기 (3) | 2016.11.25 |
---|---|
EditText Keyboard 내리기 (0) | 2016.11.24 |
Switch(스위치) 커스텀해서 사용하기 (2) | 2016.10.27 |
TextView 특정문자열 색깔넣기(setSpan, html) (1) | 2016.10.23 |
EditText 키보드 다음, 완료버튼 등등 만들기(ImeOptions) (1) | 2016.06.13 |