2016-05-15 7 views
4
public class MatchingGame extends AppCompatActivity implements TextToSpeech.OnInitListener, View.OnDragListener { 

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    rLayout = new RelativeLayout(this); 
    rLayout= (RelativeLayout) findViewById(R.id.relative_layout); 
     rLayout.setBackgroundColor(Color.YELLOW); 
} 

@Override 
    public void onInit(int status) { 
     Log.d(TAG, "matching game oninit"); 

     if (status == TextToSpeech.SUCCESS) { 

    tts.setLanguage(Locale.getDefault()); 

setupForGame(); 

}} 

void setupForGame(){ 

     if(tts.isSpeaking()){ 
      tts.stop(); 

     } 

     if(isAnimationStarted) { 
      isAnimationStarted = false; 
      MatchingGame.this.imageAnswer.clearAnimation(); 
      MatchingGame.this.correctImage[0].clearAnimation(); 
     } 



rLayParams = new RelativeLayout.LayoutParams(140,140); 

     rLayParams.addRule(RelativeLayout.CENTER_IN_PARENT);//ortaya gelecek 
     rLayParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);//ortaya gelecek 

imgBytes = objectResponse.getObjectImageBlob(); 
     bmp = BitmapFactory.decodeByteArray(imgBytes, 0, imgBytes.length); 

     imageAnswer = new ImageView(this); 
     imageAnswer.setImageBitmap(bmp); 
     imageAnswer.setTag(trainingObject.getTrainingobjectAnswer()); 
     imageAnswer.setId(R.id.imgAnswer); 

     imageAnswer.setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       Log.d(TAG,"imageanswer setontouchlistener"); 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 


        Log.d(TAG,"imageanswer setontouchlistener actiondown"); 
        ClipData data = ClipData.newPlainText("", ""); 
        View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v); 
        v.startDrag(data, shadowBuilder, v, 0); 
        v.setVisibility(View.INVISIBLE); 
        return true; 
       } else { 
        Log.d(TAG,"imageanswer setontouchlistener else"); 
        return false; 
       } 
      } 
     }); 

     imageAnswer.setOnDragListener(this); 

     rLayout.removeAllViews(); 
     rLayout.addView(imageAnswer,rLayParams); 

} 

Override 
    public boolean onDrag(View receivingLayoutView, DragEvent dragEvent) { 
     Log.d(TAG, "ondrag start"); 

     switch (dragEvent.getAction()) { 

      case DragEvent.ACTION_DRAG_STARTED: 

.  case DragEvent.ACTION_DRAG_ENTERED: 
    case DragEvent.ACTION_DRAG_LOCATION: 
     case DragEvent.ACTION_DRAG_EXITED: 
    case DragEvent.ACTION_DROP: 

case DragEvent.ACTION_DRAG_ENDED: 

. 
. 
. 



} 

}//class end 

ここに私のコードの短いバージョンがあります。Android、動的に作成された画像はドラッグドロップできません

私は実行のみ秒間ImageViewのをタッチすると、ログは以下のとおりです。

imageanswer setontouchlistener 
imageanswer setontouchlistener actiondown 
imageanswer setontouchlistener 
imageanswer setontouchlistener else 

それもドラッグを呼び出しdoesnot。それはドラッグに行くことはできません。

このクラスをアクティビティに拡張しようとしましたが、何も変更されませんでした。

私は別のクラスを作成し、テストしています。違いは、画像ビューの場所は静的で、私はすべて作成中です。

これは、1つに取り組んでいる:違いです

public class MainActivity extends Activity implements View.OnDragListener { 


    private ImageView img1, img2, img3; 
    String TAG = "Chic"; 
    private Button btn,item; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     Log.d(TAG, "oncreate start"); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_lands); 

     img1 = (ImageView) findViewById(R.id.img1); 
     //img1.setOnLongClickListener(this); 
     img2 = (ImageView) findViewById(R.id.img2); 
     // img2.setOnLongClickListener(this); 
     img3 = (ImageView) findViewById(R.id.img3); 
     // img3.setOnLongClickListener(this); 

     img1.setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        ClipData data = ClipData.newPlainText("", ""); 
        View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v); 
        v.startDrag(data, shadowBuilder, v, 0); 
        v.setVisibility(View.INVISIBLE); 
        return true; 
       } else { 
        return false; 
       } 
      } 
     }); 

     img2.setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        ClipData data = ClipData.newPlainText("", ""); 
        View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v); 
        v.startDrag(data, shadowBuilder, v, 0); 
        v.setVisibility(View.INVISIBLE); 
        return true; 
       } else { 
        return false; 
       } 
      } 
     }); 

     img3.setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        ClipData data = ClipData.newPlainText("", ""); 
        View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v); 
        v.startDrag(data, shadowBuilder, v, 0); 
        v.setVisibility(View.INVISIBLE); 
        return true; 
       } else { 
        return false; 
       } 
      } 
     }); 




     img1.setOnDragListener(this); 
     img2.setOnDragListener(this); 
     img3.setOnDragListener(this); 



public boolean onTouch(View view, MotionEvent motionEvent) { 
     Log.d(TAG, "ontouch never"); 
     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
      ClipData data = ClipData.newPlainText("", ""); 
      View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); 
      view.startDrag(data, shadowBuilder, view, 0); 
      view.setVisibility(View.INVISIBLE); 
      return true; 
     } else { 
      return false; 
     } 
    } 


public boolean onDrag(View receivingLayoutView, DragEvent dragEvent) { 
     Log.d(TAG, "ondrag start"); 
//and so on 
. 
. 

何、なぜこの作品と私はdoesnotのでしょうか?

私は、スレッド内でそれを実行したときも、私のクラスは、OnCreateの内部で、動作します。それはスレッドであるため、

Thread t = new Thread() { 
      @Override 
      public void run() { 

imageAnswer.setOnTouchListener(new View.OnTouchListener() { 
       @Override 
       public boolean onTouch(View v, MotionEvent event) { Log.d(TAG,"6isanswered : "+isAnswered); 
        Log.d(TAG,"matchinggame setontouch"); 
        if (event.getAction() == MotionEvent.ACTION_DOWN) { 
         Log.d(TAG,"matchinggame setontouch if yes"); 
         ClipData data = ClipData.newPlainText("", ""); 
         View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v); 
         v.startDrag(data, shadowBuilder, v, 0); 
         v.setVisibility(View.INVISIBLE); Log.d(TAG,"7isanswered : "+isAnswered); 
         return true; 
        } else { Log.d(TAG,"8isanswered : "+isAnswered); 
         return false; 
        } 
       } 
      }); 

      imageAnswer.setOnDragListener(MatchingGame.this); 
      Log.d(TAG,"*"); 

違いは、私はカントmatchingame.this

を使用し、私はthisを使用してNIT午前、あります見つけ出す。

これが私のレイアウトです:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:id="@+id/relative_layout" 
    tools:context=".games.MatchingGame"> 



</RelativeLayout> 

iは、イベントをクリックするために同じ方法と建設を使用して、それは素晴らしい作品。しかし、なぜドラッグしないのですか?

私は画像に触れ、それを残すと、それは永遠に消えます。例えば、ダイナミックで

私はどこかにドロップし、ログにそれは言う:私のタグで

"Drag is in progress but there is no drag window handle." 

ではなくを、警告、ワットとして。

同じコードで、空の場所に落とすと、もう一度見えるようになっていましたが、ここではドロップするとすぐに消えます。

私はこれらすべての https://www.google.com.tr/search?q=%22%22Drag+is+in+progress+but+there+is+no+drag+window+handle.%22%22&oq=%22%22Drag+is+in+progress+but+there+is+no+drag+window+handle.%22%22&aqs=chrome..69i57.1353j0j9&sourceid=chrome&ie=UTF-8

に見えたが、彼らは異なっており、動作しませんでした。

私は理由を知りません、私は動的な画像を使用しているので、私は推測しています。

これは、私はまた、これらを試してみましたが、私はすべてを試してみました

imageAnswer = new ImageView(this); 
    imageAnswer.setImageBitmap(bmp); 
    imageAnswer.setTag(trainingObject.getTrainingobjectAnswer()); 
    //imageAnswer.findViewById(R.id.imgAnswer); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
     rLayout.generateViewId(); 
     imageAnswer.setId(R.id.imgAnswer); 
    } 


    rLayout.removeAllViews(); 
    rLayout.addView(imageAnswer,rLayParams); 


    View.generateViewId(); 
      imageAnswer.setId(R.id.imgAnswer); 



View.generateViewId(); 
     rLayout.setId(R.id.imgAnswer); 

動作しませんでしたIDS

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <item name="refresh" type="id"/> 
    <item name="settings" type="id"/> 
    <item name="imgAnswer" type="id"/> 

です。

編集

私はshandoの提案をしようとすると、私のログは、次のとおりです。

imageanswer setontouchlistener 
imageanswer setontouchlistener actiondown 
parent android.widget.RelativeLayout{bcd0e74 V.E...... ........ 0,0-320,186 #7f0c0058 app:id/relative_layout} 
view android.widget.ImageView{26eaf9d V.ED..... ........ 12,86-26,100 #1} 
imageanswer setontouchlistener 
ontouch else 
android.widget.RelativeLayout{bcd0e74 V.E...... ......ID 0,0-320,186 #7f0c0058 app:id/relative_layout} 
imageanswer setontouchlistener else: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=16.044922, y[0]=149.61914, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=1104235, downTime=1104203, deviceId=0, source=0x1002 } 
view android.widget.ImageView{26eaf9d I.ED..... ........ 12,86-26,100 #1} 

、私のコードは次のようですが、私はAPIの23エミュレータ午前:

/* imageAnswer = new ImageView(this); 
     imageAnswer.setImageBitmap(bmp); 
     imageAnswer.setTag(trainingObject.getTrainingobjectAnswer()); 
     imageAnswer.findViewById(R.id.imgAnswer);*/ 

     int idThatCanBeUsedLater = R.id.imgAnswer; 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) { Log.d(TAG,"if"); 
      idThatCanBeUsedLater = View.generateViewId();} 
     imageAnswer = new ImageView(this); 
      imageAnswer.setId(idThatCanBeUsedLater); 
     imageAnswer.setTag(trainingObject.getTrainingobjectAnswer()); 
     imageAnswer.setImageBitmap(bmp); 

     rLayout.removeAllViews(); 
     rLayout.addView(imageAnswer,rLayParams); 


     imageAnswer.setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       imageAnswer.getParent().requestDisallowInterceptTouchEvent(true); 
       Log.d(TAG,"imageanswer setontouchlistener"); 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        Log.d(TAG,"imageanswer setontouchlistener actiondown"); 
        Log.d(TAG,"parent "+ String.valueOf(imageAnswer.getParent())); 
        Log.d(TAG, "view "+String.valueOf(v)); 
        ClipData data = ClipData.newPlainText("", ""); 
       // Log.d(TAG,"data: "+data.toString()); 
        View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v); 
        v.startDrag(data, shadowBuilder, v, 0); 
        v.setVisibility(View.INVISIBLE); 
        return true; 
       } else { 

        Log.d(TAG, "ontouch else"); 
        Log.d(TAG, String.valueOf(imageAnswer.getParent())); 
        Log.d(TAG,"imageanswer setontouchlistener else: "+event.toString()); 

        Log.d(TAG,"view "+ String.valueOf(v)); 
        if (event.getAction() == MotionEvent.ACTION_CANCEL) { 
         ClipData data = ClipData.newPlainText("", ""); 
         View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v); 
         v.startDrag(data, shadowBuilder, v, 0); 
         v.setVisibility(View.INVISIBLE); 
         return true;} 
        return false; 
       } 
      } 
     }); 

     imageAnswer.setOnDragListener(this); 

これがいっぱいですコード

https://gist.github.com/anonymous/7206470ffcee91e6e9d096d0e5756025

答えて

0

コードでビューIDを設定します。 imageAnswer.setId(R.id.imgAnswer)を削除できますか?または使用しているmin SDK 17がgenerateViewIdに置き換えられている場合潜在的な重複ID内の問題かもしれません。

一方で
ClipData data = ClipData.newPlainText("", ""); 
        View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v); 
        v.startDrag(data, shadowBuilder, v, 0); 
        v.setVisibility(View.INVISIBLE); Log.d(TAG,"7isanswered : "+isAnswered); 
        return true; 

:¿なぜsetOnTouchListener代わりのsetOnClickListenerを使用している

+0

動作しない imageAnswer = new ImageView(this); imageAnswer.setImageBitmap(bmp); imageAnswer.setTag(trainingObject.getTrainingobjectAnswer()); if(Build.VERSION.SDK_INT> = Build.VERSION_CODES.JELLY_BEAN_MR1){ rLayout.generateViewId(); imageAnswer.setId(R.id.imgAnswer); } rLayout.removeAllViews(); rLayout.addView(imageAnswer、rLayParams); View.generateViewId(); imageAnswer.setId(R.id.imgAnswer); View.generateViewId(); rLayout.setId(R.id.imgAnswer); 私はすべてを試しました。 –

+0

これを試して、Android 4.3以降のデバイスで実行してください。 'int idThatCanBeUsedLater = R.id.imgAnswer; if(android.os.Build.VERSION.SDK_INT> = android.os.Build.VERSION_CODES.JELLY_BEAN_MR1){ idThatCanBeUsedLater = View.generateViewId(); } ImageView imageAnswer = new ImageView(this); imageAnswer.setId(idThatCanBeUsedLater); rLayout.removeAllViews(); rLayout.addView(imageAnswer、rLayParams); ' – Shadwork

+0

は機能しませんでした。私のログにも答えがあります。私のコードが変更されました –

1

私はあなたの問題は、あなたのonDragを初期化するときに、INVISIBLEあなたのビューに設定されていることであると思いますか?この場合、私はそれが最良のアイデアではないと思います。

最後に、すべてのコードをonDrag内に表示しないと、完全に空のように見えます。しかし、あなたは

次のいずれかに継続(およびACTION_DRAG_ENDEDでfalseを返す)するスイッチ内部のすべてのケースの内側にtrueを返さなければなりませんので、あなたのonDragは、のようなものにする必要があります:私もそれらを試してみましたが、やった

//Your code 
    imageAnswer.setOnDragListener(this); 
    imageAnswer.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      ClipData data = ClipData.newPlainText("", ""); 
      View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v); 
      v.startDrag(data, shadowBuilder, v, 0); 
      v.setVisibility(View.INVISIBLE); Log.d(TAG,"7isanswered : "+isAnswered); 
      return true; 
     } 
    }); 

    rLayout.removeAllViews(); 
    rLayout.addView(imageAnswer,rLayParams); 

} 

Override 
public boolean onDrag(View receivingLayoutView, DragEvent dragEvent) { 
    Log.d(TAG, "ondrag start"); 

    switch (dragEvent.getAction()) { 

     case DragEvent.ACTION_DRAG_STARTED: 
      //Do something 
      return true; 
     case DragEvent.ACTION_DRAG_ENTERED: 
      //Do something 
      return true; 
     case DragEvent.ACTION_DRAG_LOCATION: 
      //Do something 
      return true; 
     case DragEvent.ACTION_DRAG_EXITED: 
      //Do something 
      return true; 
     case DragEvent.ACTION_DROP: 
      //Do something 
      return true; 

     case DragEvent.ACTION_DRAG_ENDED: 
      //Do something 
      return false; 



    } 
+0

http://stackoverflow.com/questions/9122679/difference-between-ontouch-and-onclick-androidタッチがより良いtheysayですので。私のondragでは、私はそれらのケースイベントを持っていますが、ondragの中には入っていません。私はondrag Logのbegininngでこのログを見ることができません。d(TAG、 "ondrag start"); –

+0

ドラッグの完全なコードを投稿できる場合は、 –

+0

こちらをご覧ください。https://gist.github.com/anonymous/7206470ffcee91e6e9d096d0e5756025 –

関連する問題