2

私の画像にはサイドバーとリストビューがあり、D-PAD を使用してすべてのボタンにアクセスします。サイドバーの検索ボタンにフォーカスがあり、右 D-PAD ボタンを押すと、フォーカスが ListView の最初の項目に移動するようにします。しかし、私の場合は2番目の項目に行きます。下矢印にフォーカスがあり、右ボタンを押すと、4 番目のリスト項目に移動します。したがって、これも防止する必要があります。フォーカスを最初の項目に移動するにはどうすればよいですか?

if (Search != null && Search.hasFocus()) {
            // Search.setNextFocusRightId(R.id.listView);
//          listView.smoothScrollToPosition(0);
            listView.setChoiceMode(1);
            listView.setItemChecked(0, true);
        }

ここに画像の説明を入力

4

2 に答える 2

2

背景なしのダミー ビューを作成し、リストビューと同じレイアウトに配置します。フォーカス可能にし、検索ビューの nextFocusRight を id/dummy に設定します。

<ListView
    android:id="@+id/listview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:choiceMode="singleChoice"
    android:listSelector="@null"
    android:background="@null"
    ></ListView>
<View
    android:id="@+id/dummy"
    android:layout_width="1dp"
    android:layout_height="1dp"
    android:focusable="true"
    />

あなたの検索ビュー:

<YourSearchView
 android:nextFocusItemRight=@+id/dummy/>

次に、コードで OnFocusChangedListener をダミー ビューに設定します。これは、ListView がフォーカスを取得することになっていることを示します。リスナー内で、リストビューのフォーカスをリクエストし、次のように選択を 0 に設定します。

View dummy = rootView.findViewById(R.id.dummy);
        dummy.setOnFocusChangeListener(new View.OnFocusChangeListener()
        {
            @Override public void onFocusChange(View v, boolean hasFocus)
            {
                if (hasFocus)
                {
                    listView.post(new Runnable() {
                        @Override
                        public void run() {
                            listView.requestFocus();
                            listView.setSelection(0);
                        }
                    });
                }
            }
        });

@id の代わりに nextFocusItemRight に @+id を使用してください。それ以外の場合は、コメントを投稿してください。

于 2014-10-09T10:05:19.440 に答える
2

最善の方法は、 Activity クラスで dispatchKeyevent をオーバーライドしてから、 Listview の好きな場所にフォーカス/選択を設定することです。

    @Override
public boolean dispatchKeyEvent(KeyEvent event) {




    boolean handled  =  super.dispatchKeyEvent(event);

    if(!handled  &&  event.getAction() ==  KeyEvent.ACTION_UP)
    {
        if(yourParentViewGroup.getFocusedChild() is  your SearchView &&  event.getKeyCode() ==  KeyEvent.KEYCODE_DPAD_RIGHT )
        {

            yourListvIew.setSelction(0);
            handled = true;
        }

    }

    return handled;

ただし、フォーカスまたは選択ロジックを処理する場合は、「true」を返すことを忘れないでください。それ以外の場合は、Android focusfinder アルゴリズムが呼び出され、フォーカス/選択が最も近いビューに移動します。

于 2014-10-16T14:54:23.793 に答える