본문 바로가기
Android

레이아웃과 포커싱

by Birthmark 2021. 1. 20.

descendantFocusability

 

itpangpang.xyz/308

 

descendantFocusability - Child View의 Focus를 제어하자

descendantFocusability Child View의 Focus를 제어하자 ㆍ 시작하기 전에 descendantfocusablility라는 이 속성은 몇몇 특별한 상황에서 필요합니다. ㆍ 물론 사용하는 방법에 따라 유용하게 쓰일수도 있습니다..

itpangpang.xyz

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
 @Override
    public boolean onKeyUp(int keyCode, KeyEvent event){
//        listView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
        if(keyCode == KeyEvent.KEYCODE_F3){
            button_ok.performClick();
        }
        else if(keyCode == KeyEvent.KEYCODE_BACK){
            finish();
        }
        return false;
    }
 
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
//        listView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
        final int firstListItemPosition = listView.getFirstVisiblePosition();
        final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;
        switch (keyCode) {
            case KeyEvent.KEYCODE_F1:    //KEYCODE_DPAD_UP
                mPosition--;
                if (mPosition < firstListItemPosition || mPosition > lastListItemPosition) {
                    if (mPosition < 0) {    //インデックスを外れた場合
                        if (firstListItemPosition != 0) {
                            mPosition = lastListItemPosition;
                        } else
                            mPosition = 0;
                    } else {
                        mPosition = lastListItemPosition;
                    }
                }
 
                int childIndex = mPosition - firstListItemPosition;
                listView.getChildAt(childIndex).requestFocusFromTouch();
                listView.setSelectionFromTop(mPosition, 340);
                firstFocus = false;
                return true;
 
            case KeyEvent.KEYCODE_F2: //KEYCODE_DPAD_DOWN
                if (firstFocus) {
                    listView.getChildAt(0).requestFocusFromTouch();
                    listView.setSelectionFromTop(010);
                    firstFocus = false;
                } else {
                    mPosition++;
                    if (mPosition < firstListItemPosition || mPosition > lastListItemPosition) {
 
                        //最大インデックスを超えると
                        if (mPosition > listView.getCount() - 1) {
 
                            //ラストアイテムがフォーカスされた状態でスクロールする場合
                            if (lastListItemPosition != listView.getCount() - 1) {
                                //画面上で一番上のアイテムを取得
                                mPosition = firstListItemPosition;
                            } else    //最大インデックス値を固定
                                mPosition = listView.getCount() - 1;
                        } else {
                            mPosition = firstListItemPosition;
 
                        }
                    }
 
                    childIndex = mPosition - firstListItemPosition;
                    listView.getChildAt(childIndex).requestFocusFromTouch();
                    listView.setSelectionFromTop(mPosition, 340);
 
                }
                return true;
            case KeyEvent.KEYCODE_BACK:
                return true;
            default:
                break;
        }
        return false;
    }
cs

댓글