0

複数の動的要素/行を含むリスト (LinearLayout) を正常に作成しました。Web サービスによって受信されたコンテンツで満たされます。行ごとの要素の 1 つは、可変量の EditText フィールドを含む Horizo​​ntalScrollView です。

これは、すべての行 (ヘッダーを含む) のすべての edittext がその horizo​​ntalScrollView でスクロールできることを意味します。

Scrollmanager は、すべての horizo​​ntalScrollviews が同時に移動することを確認します。したがって、基本的にはリスト内のスクロール可能な列です。

私が経験している問題は次のとおりです。

EditText ビューを選択すると、キーボードが表示されます。これは、私がやりたいことです。ただし、scrollManager がトリガーされるため、すべての horizo​​ntalscrollviews が最後までスクロールされます。フォーカスされた編集テキストを画面内に保持する代わりに、視界の外に移動します。

私の ScrollManager OnScrollChanged

@Override
    public void onScrollChanged(View sender, int l, int t, int oldl, int oldt) {
        // avoid notifications while scroll bars are being synchronized
        if (isSyncing)
            return;

        isSyncing = true;

        // remember scroll type
        if (l != oldl)
            scrollType = SCROLL_HORIZONTAL;
        else if (t != oldt)
            scrollType = SCROLL_VERTICAL;
        else {
            // not sure why this should happen
            isSyncing = false;
            return;
        }

        // update clients
        for (ScrollNotifier client : clients) {
            View view = (View) client;

            if (view == sender) 
                continue; // don't update sender

            // scroll relevant views only
            // TODO Add support for horizontal ListViews - currently weird things happen when ListView is being scrolled horizontally
            if ((scrollType == SCROLL_HORIZONTAL && view instanceof HorizontalScrollView)
                    || (scrollType == SCROLL_VERTICAL && view instanceof ScrollView)
                    || (scrollType == SCROLL_VERTICAL && view instanceof ListView)) {
                view.scrollTo(l, t);
            }
        }

        isSyncing = false;
    }

最後に、キーボードを表示してスクロールビューをスクロールできるようにしたいのですが、キーボードが表示されたときに水平スクロールイベントを防ぎたいです。

4

1 に答える 1

1

これはまだテストしていませんが、OnTouchListener を EditText に設定し、次のように OnTouch メソッドをオーバーライドすることで、Horizo​​ntalScrollView へのタッチ イベントの伝播を停止できるはずです。

@Override
public boolean onTouch(View v, MotionEvent event) 
{
    Log.i("OnTouch", "Fired On Touch in " + v.getId());

    // Do this on the down event too so it's not getting fired before up event
    if(event.getAction() == MotionEvent.ACTION_DOWN)
    {
       // Disallow ScrollView to intercept touch events.
       v.getParent().requestDisallowInterceptTouchEvent(true);
    }   

    //only do this on the up event so you're not doing it for down too
    if(event.getAction() == MotionEvent.ACTION_UP)
    {
       // Disallow ScrollView to intercept touch events.
       v.getParent().requestDisallowInterceptTouchEvent(true);
    }   

    //Keep going with the touch event to show the keyboard        
    v.onTouchEvent(event);
    return true;
}  
于 2015-03-05T16:10:07.587 に答える