14

アンドロイドドキュメントによると、あなたはあなたの親を取得し、他のものが干渉するのを防ぐためにそれをViewGroup呼び出すことができます。requestDisallowInterceptTouchEvent(true)これにより、直接の親だけでなく、タッチをインターセプトする可能性のある他の親オブジェクトが、特定のイベントの期間中、タッチを無視するようになります。

これは素晴らしいサウンドで、新しいデバイス(私の場合はandroid 4.1)で正常に動作するようですが、古いデバイス(つまり、2.3.3)では、最初にスクロールビューをクリックしてからスクロールしない限り、動作しません。干渉。

View.OnTouchListenerスクロール可能な子のリクエストを送信しています。

モーションイベントなどのヒットレクをチェックするためにカスタムサブクラスを作成せずに、これを自動的に機能させる方法はありますか?

4

2 に答える 2

18

2.3 でも、disallow が断続的に機能するという問題がありました。

event.getAction() に関係なく、view.requestDisallowInterceptTouchEvent(true) を呼び出していました。

次に、善良な市民になろうとして、onTouch() メソッドのコードを次のように変更しました。

switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            v.requestDisallowInterceptTouchEvent(true);
            break;
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            v.requestDisallowInterceptTouchEvent(false);
            break;
        default:
            break;
        }

このメソッド (または参照されたビューの下にある他のビュー) は、親が許可しない要求に従うために true を返さなければならないことに注意してください。

これで問題が解決するかどうかはわかりませんが、試してみる価値があります。

于 2013-02-07T19:35:27.087 に答える
9

これを試すことができます:

m_parentScrollView.setOnTouchListener(new View.OnTouchListener() 
{
       public boolean onTouch(View p_v, MotionEvent p_event) 
        {
               m_childScrollView.getParent().requestDisallowInterceptTouchEvent(false);
           //  We will have to follow above for all scrollable contents
           return false;
        }
});

                                        **OR**

m_childScrollView.setOnTouchListener(new View.OnTouchListener() 
{
      public boolean onTouch(View p_v, MotionEvent p_event)
       {
          // this will disallow the touch request for parent scroll on touch of child view
           p_v.getParent().requestDisallowInterceptTouchEvent(true);
           return false;
       }
});
于 2014-11-27T11:03:54.963 に答える