만족
[Android Studio] Focus 본문
[Android Studio] Focus
FrontEnd/Android Satisfaction 2017. 6. 30. 03:50Focusable이 true로 되어 있는 뷰가 사용자와 Interaction하기 시작할 때, 그 뷰는 Focus를 가졌다 라고 한다.
대표적 예로는 EditText가 있으며, EditText를 누르면 키보드가 보여지면서 EditText와 상호작용할 수 있게 되는데,
이 때 EditText는 Focus를 갖게 된다.
Focus를 갖기 위해, Focusable의 속성이 true이어야 하는데, EditText의 경우 별도의 작업이 필요 없이 true를 값으로 갖지만
TextView와 같은 태그들은 임의로 속성값을 바꾸어 주어야 한다.
Focusable 속성값 변경하기
1. xml에서 변경하기
해당 태그에
android:focusable="true"
android:focusableInTouchMode="true"
속성을 추가해주면 된다.
예시)
<LinearLayout
android:id="@+id/linearLayout_focus"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0px"
android:layout_height="0px"/>
2. java에서 변경하기
해당 태그를 findViewById를 이용하여 찾은 다음
setFocusable(true), setFocusableInTouchMode(true)메소드를 이용한다.
예시)
b.setFocusable(true);
b.setFocusableInTouchMode(true);
Focusable과 FocusableInTouchMode의 차이점
Focusable은 단순히 해당 뷰가 Focus를 가질 수 있는지 없는지의 여부를 결정한다.
FocusableInTouchMode는 터치 모드에서, 즉 사용자의 터치에 의해서 포커스를 가질 수 있는지를 결정한다.
setFocusable Method (ref API)
Set whether this view can receive the focus. Setting this to false will also ensure that this view is not focusable in touch mode.
이 뷰가 포커스를 가질 수 있는지 없는지를 설정한다. 이것을 false로 설정하는 것은 터치 모드에서도 focus를 가질수 없음을 보장한다.
setFocusableInTouchMode (ref API)
Set whether this view can receive focus while in touch mode. Setting this to true will also ensure that this view is focusable.
이 뷰가 터치 모드에서 포커스를 받을 수 있는지를 설정한다. 이것을 true로 설정하는 것은 그 뷰가 focus를 가질 수 있음을 보장한다.
조금 더 자세한 설명은 Android Developers Blog를 참조하라.
https://android-developers.googleblog.com/2008/12/touch-mode.html
자동 포커싱
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.windows10.selectortag.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TEXT"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Input"
android:id="@+id/editText"
android:layout_centerInParent="true"
android:background="@drawable/ex_selector"
android:focusable="true"
android:focusableInTouchMode="true"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/editText"
android:id="@+id/btn"/>
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.windows10.selectortag.MainActivity">
<LinearLayout
android:id="@+id/linearLayout_focus"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0px"
android:layout_height="0px"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TEXT"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Input"
android:id="@+id/editText"
android:layout_centerInParent="true"
android:background="@drawable/ex_selector"
android:focusable="true"
android:focusableInTouchMode="true"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/editText"
android:id="@+id/btn"/>
</RelativeLayout>
textView.setOnFocusChangeListener(new View.OnFocusChangeListener(){
@Override
public void onFocusChange(View view, boolean b) {
//Variable 'b' represent whether this view has focus.
//If b is true, that means "This view is having focus"
textView.append("\nFocus: "+b);
}
});
'FrontEnd > Android' 카테고리의 다른 글
[Android Studio] Activity Title Label 없애기 (0) | 2017.06.30 |
---|---|
[Android Studio] Seletor Tag (0) | 2017.06.30 |
[Android Studio] Event Listener의 이해 (0) | 2017.06.30 |
[Android Studio] java.lang.IllegalStateException: commit already called java.lang.IllegalStateException: commit already called (0) | 2017.06.30 |
[Android Studio] 프래그먼트(Fragment) (0) | 2017.06.30 |