0

4列を表示するGoogleTVアプリでアクティビティがあります。レイアウトの最上位ウィジェットは水平LinearLayoutであり、列を構成するウィジェットが含まれています。4つの列ウィジェット(左から右へ)は、Vertical LinearLayout(ボタンを含む)、ListFragment、ListFragment、Vertical LinearLayout(TextViewsを含む)です。

データが入力されると、2つのListFragmentsは画面の表示されている高さよりもはるかに高くなり、独立してスクロールしてリストを上下に移動できます。これはすべて非常にうまく機能しますが、列間でフォーカスを移動するときにListFragmentsで不要な自動スクロールが発生する場合を除きます。

たとえば、2番目の列の上部(左端のListFragment)に焦点を合わせ、d-padを使用してフォーカスを表示されている画面の中央に移動し、dの右キーを押した場合-パッド(他のListFragmentに水平に移動するため)1番目のListFragmentでフォーカスされたアイテムの横にあったリ​​ストアイテム(2番目のListFragment内)はフォーカスを受け取ります(これは良いことです)が、同時に2番目のListFragmentは垂直方向に自動スクロールします、新しくフォーカスされたアイテムを表示されている画面の上部にプッシュします(これは悪いことです)。代わりに、それがあった場所(リストの中央)にとどまるようにします。

2番目のListFragmentの中央から左に移動して、1番目のListFragmentに戻すと、同じ問題が発生します。また、1列目のボタンの1つから、1番目のListFragmentの中央に移動した場合にも発生します。

この自動スクロール動作は一部のアプリケーションにとって望ましい場合があることを理解していますが、私のアプリでは実際には適切ではなく、ユーザーの混乱を引き起こします。

4

1 に答える 1

1

平行な垂直フラグメント間のListViewd-padナビゲーションのバグのようです。タブレットで再現して、Androidの課題追跡システムにバグを報告してください。

一方、次の回避策を使用できます。

  @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // workaround to handle keyevent dpad-right from left list to right list, to 
        // to prevent default behavior of focused item on right list snapping to top.             
        if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
            if (left_list != null && right_list != null && left_list.isFocused()){
                right_list.setSelection(right_list_selected_index);
                right_list.requestFocus();
                return true;
            }
        } 
        return super.onKeyDown(keyCode, event);
    }
于 2012-05-10T19:05:28.287 に答える