2017-04-05 101 views
-2

私は、ウィジェットのいくつかの並べ替えがその場で作成され、ドラッグアンドドロップで並べ替えることができるアプリケーションを作っています。ドラッグを開始し、 postDelayed()の実行をキャンセルする方法

  • 短いプレスをドロップ(またはクリック)いくつかの設定を変更するには、メニューを開くためにする

    1. 長押し:私は2つのことを実現しようとしています。

    しかし、ハンドラのpostdelayed()関数でコードをキャンセルできない問題があります。私はそれを実現させるために次のコードを使用しています。

     _sliders_item[_sliders_counter].setOnTouchListener(new View.OnTouchListener() { 
          @Override 
          public boolean onTouch(final View v, MotionEvent event) { 
           Handler hndlr = new Handler(); 
           Runnable _run = new Runnable() { 
            @Override 
            public void run() { 
             ClipData data = ClipData.newPlainText("", ""); 
             View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v); 
             v.startDrag(data, shadowBuilder, v, 0); 
             v.setVisibility(View.INVISIBLE); 
             _t1.setText("executed"); 
             _t1.show(); 
            } 
           }; 
           if (_enable_editor) { 
            if (event.getAction() == MotionEvent.ACTION_DOWN) { 
             hndlr.postDelayed(_run,1000); 
             //return true; 
            } 
            if (event.getAction() == MotionEvent.ACTION_UP){ 
             _t1.setText("menu"); 
             _t1.show(); 
             hndlr.removeCallbacks(_run); 
             //return true; 
            } 
           } 
           return _enable_editor; 
          } 
         }); 
    

    しかし、問題は、オブジェクトを長押しするとうまくいきます。私はドラッグアンドドロップを開始することができます。しかし、私はそれを短く押すと、ACTION_UPイベントのコードは実行されますが、実行可能ファイル内のコードはまだ実行されます。オブジェクトを短く押すと、実行可能コードを取り消すことはできますか?

  • 答えて

    0

    RunnableonTouch以外の場合は、クラス内の別のメソッドのように宣言してください。実際にrunnableを実行する場合は、メソッドを呼び出します。

    Quick'n'Dirty例:

    onTouch(..) { 
        if (eventDown) { 
        // start Runnable 
        } 
    
        if (eventUp) { 
        // Do not call runnable 
        } 
    
    } 
    
    private void executeMyRunnable(/* Any arguments you need in Runnable */) { 
        // Your runnable code here 
    } 
    
    +0

    私はそれを行うことはできません。私のアプリは動的に追加される複数の同一のオブジェクトを作成します。実行可能ファイル内のコードは特定のオブジェクトに固有のものでなければなりません。 –

    +0

    しかしあなたのダイナミックなオブジェクトは、何らかの識別情報を持っていなければなりません。だからあなたは実行可能メソッドにそのパラメータを渡すことはできません?そうすれば、現在実行中のオブジェクトを知ることができます。 –

    +0

    実行可能ファイルの場合、TouchListenerから必要なものは、VIEWオブジェクトへの参照です。そのオブジェクトを実行するときに、そのオブジェクトをRunnableメソッドに渡すことができます。 –

    0

    あなたはaction.upでaction.downとシステム時刻にシステム時刻との時間差をとることにより、長押しを確認することができます。その差が5000ミリ秒よりも大きい場合は、実行可能なコードを実行し、それ以外の場合はダイアログコードを実行します。

    3

    RunnablesHandlerへの参照を保持し、Handler#removeCallbacks()を使用する必要があります。

    だから、基本的には:

    Handler h = new Handler(); 
    Runnable r = new Runnable() { /* does something */ 
    h.postDelayed(r, 1000); 
    
    // When you want to cancel. 
    h.removeCallbacks(r); 
    
    +1

    それは私がやったことです。もう一度質問を読む...それは動作していません。 –

    +0

    新しいHandlerと新しいRunnableを毎回作成しています。あなたは両方の参照を保持する必要があります。私の答えをもう一度読んでください。 – DeeV

    関連する問題