2016-05-15 6 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 

Hier ist eine kurze Version meines Codes.Android, dynamisch erstellte Bilder können nicht Drag Drop

, wenn ich laufen und nur die Imageview für die zweite berühren, Protokolle sind:

imageanswer setontouchlistener 
imageanswer setontouchlistener actiondown 
imageanswer setontouchlistener 
imageanswer setontouchlistener else 

es doesnot sogar Drag nennen. Es kann nicht in den Zug gehen.

Ich habe versucht, diese Klasse erweitert Aktivität, aber nichts geändert.

Vorweg, zum Testen habe ich verschiedene Klassen erstellt und es funktioniert. Die Unterschiede sind, die Bildansicht Orte sind statisch und ich mache alles in oncreate.

Dies funktioniert ein:

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 
. 
. 

Was ist der Unterschied ist, warum diese Arbeit und meine doesnot?

auch meine Klasse funktioniert, wenn ich es in einem Thread ausgeführt, innen 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,"*"); 

Unterschied ist, weil es Thread ist, ich bin this NIT, verwenden Sie i matchingame.this

Ich kippe herausfinden.

das ist mein Layout:

<?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 verwenden dieselben Methoden und Konstruktion für Veranstaltungen klicken und es funktioniert gut. Aber warum nicht ziehen?

Wenn ich das Bild berühre und es lasse, verschwindet es für immer.

in dynamisch zum Beispiel, wenn ich auf irgendwo fallen lassen, es in log sagt:

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

aber nicht in meinem Tag, als w, Warnung.

Mit denselben Codes, wenn ich auf einen leeren Platz trete, wurde es wieder sichtbar, aber hier verschwindet es sofort, wenn ich falle.

i sah alle 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

aber sie sind anders und hat nicht funktioniert.

Ich weiß nicht den Grund, ich rate, weil ich dynamische Bilder hinzufügen.

dies ids

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

Ich habe versucht, auch solche, aber funktionierte nicht

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); 

ich alle ausprobiert.

bearbeiten

wenn ich Shando Vorschläge versuchen, meine Protokolle sind:

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} 

und mein Code so ist, ich bin auf Emulator 23 api:

/* 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); 

dies ist voll Code

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

Antwort

0

Sie legen die ID im Code fest. Können Sie imageAnswer.setId (R.id.imgAnswer) entfernen; oder wenn Sie min SDK 17 verwenden, ersetzen Sie es durch generateViewId. Kann ein Problem innerhalb potentieller Duplikat-IDs sein.

+0

Ich habe auch versucht, diejenigen aber tat funktioniert nicht 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); Ich habe alles versucht. –

+0

Versuchen Sie das und stellen Sie sicher, dass Sie es auf dem Gerät mit Android 4.3+ ausführen '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 = neues ImageView (this); imageAnswer.setId (idThatCanBeUsedLater); rLayout.removeAllViews(); rLayout.addView (imageAnswer, rLayParams); ' – Shadwork

+0

hat nicht funktioniert, es ist das gleiche. Meine Protokolle sind in der Antwort auch meine Codes, die ich geändert habe –

1

Ich denke, Ihr Problem ist, dass Sie INVISIBLE Ihre Ansicht setzen, wenn Sie Ihre onDrag initialisieren:

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; 

In anderen Seite: ¿Warum Sie setOnTouchListener statt setOnClickListener verwenden? Für diesen Fall denke ich, dass es nicht die beste Idee ist.

Schließlich nehme ich an, dass Sie nicht Ihren ganzen Code innerhalb des onDrags gezeigt haben, weil es wie völlig leer aussieht. Aber Sie müssen innerhalb jedem Fall innerhalb des Switch true zurück zum nächsten, um fortzufahren (und return false in ACTION_DRAG_ENDED)

so Ihre onDrag etwas sein müssen wie:

//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 weil Touch ist besser theysay. In meinem Ondrag habe ich diese Fall-Ereignisse, aber es geht nicht in Ondrag. Ich kann dieses Protokoll am Anfang von Ondrag Log nicht sehen.d (TAG, "Absprungstart"); –

+0

Wenn Sie den vollständigen Code Ihres Drag posten können, können wir Ihnen vielleicht weiter helfen –

+0

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