onKeyListener 和 onScrollListener

onKeyListener with onScrollListener

真的不确定我是否理解这个或者可能是错误的。我有一个 gridlayout(单元格是文本视图)包裹在垂直滚动条内的水平滚动条内。我正在使用方向键在网格中导航。这很有效,当我按下右箭头键时,网格单元会按预期从左向右移动,并在按下左箭头键时从右向左移动。我在网格的每个 textView 上添加了一个 onKeylistener,当我在网格上滚动时,我正在改变颜色背景。问题是 onKeyListener 显然接管了网格的控制。向右滚动用于更改颜色,但单元格不再在网格上移动。一旦我到达最后一个可见的列,焦点就会继续离开屏幕,但单元格会离开屏幕。有没有办法在 onkey 事件中实现滚动,以便单元格移动并且我可以控制单元格的属性?还是有完全不同的方法来完成这项工作?

主要成分是

textViewD.setOnKeyListener(new View.OnKeyListener() {
                    @Override
                    public boolean onKey(View view, int i, KeyEvent keyEvent) {

                       if(keyEvent.getAction()==KeyEvent.ACTION_DOWN && i == KeyEvent.KEYCODE_DPAD_RIGHT) {

                           gridLayoutE.getChildAt(childIndex[0]).setBackgroundColor(Color.BLACK);
                           gridLayoutE.getChildAt(childIndex[0] + 1).setBackgroundColor(Color.GREEN);
                           childIndex[0] = childIndex[0] + 1;
                           gridLayoutE.requestFocus();


                           return true;
     }
     return false;
     }

滚动监听器,我有一个 class 扩展水平滚动,以便让我的 header table 与我的网格一起滚动。这行得通。

 @Override
public void onScrollChanged (ObservableScrollView scrollView,int x, int y, int oldx, int oldy){
    if (scrollView == hsvHeader) {
        hsvBody.scrollTo(x, y);
    } else if (scrollView == hsvBody) {

        hsvHeader.scrollTo(x, y);
    }
}

我能够通过使用 dispatchKeyEvent(KeyEvent event) 找到解决我的问题的方法。我最终得到了类似

的东西
 public boolean dispatchKeyEvent(KeyEvent event) {
     mcols= mcols + 1;
     if(event.getAction()==KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_DPAD_RIGHT) {
     gridLayoutE.getFocusedChild().setBackgroundColor(Color.BLACK);
     gridLayoutE.findViewById(mcol).setBackgroundColor(Color.GREEN);
     }
        return super.dispatchKeyEvent(event);
    }

这与我的 scrolllistener 一起,允许我滚动网格并像我一样更改每个单元格。