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

Here is a short version of my code.

when i run and only touch the imageview for second,logs are:

imageanswer setontouchlistener
imageanswer setontouchlistener actiondown
imageanswer setontouchlistener
 imageanswer setontouchlistener else

it doesnot even call drag. It cant go into drag.

I tried to make this class extends activity but nothing changed.

PReviously, for testing i created different class and it is working. The differences are, the imageview places are static and i am doing all in oncreate.

This is working one:

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

What is the difference, why does this work and mine doesnot?

also my class works when i run it inside a thread, inside 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,"*");

difference is because it is thread, i am nıt using this, i use matchingame.this

I cant figure out.

this is my 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 use same methods and construction for clicking events and it works nice. But why not dragging?

When i touch the image, and leave it, it disappears forever.

in dynamic for example when i drop onto somewhere, in log it says:

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

but not in my tag, as w, warning.

With same codes, when i drop onto empty place, it was becoming visible again but here it disappears immediately when i drop.

i looked all those 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

but they are different and did not work.

I dont know the reason , i am guessing because i use dynamic images adding.

this is ids

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

I also tried those but did not work

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

i tried all.

edit

when i try shando's suggestions, my logs are:

 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}

and my code is like this, i am on api 23 emulator:

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

this is full code

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

2 Answers2

1

I think your problem is that you are setting to INVISIBLE your view when you initialize your onDrag:

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;

On the other hand, why you are using setOnTouchListener instead of setOnClickListener ? For this case I think that it's not the best idea.

Finally, I suppose that you didn't show all your code inside the onDrag, because it looks totally empty. But, you must return true inside every case inside the Switch to continue to the next one (and return false in ACTION_DRAG_ENDED)

So your onDrag need to be something like:

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



    }
halfer
  • 19,824
  • 17
  • 99
  • 186
Francisco Durdin Garcia
  • 12,540
  • 9
  • 53
  • 95
  • http://stackoverflow.com/questions/9122679/difference-between-ontouch-and-onclick-android because touch is better theysay. In my ondrag, i have those case events but it doesnot go inside ondrag. i cant see this log at the begininng of ondrag Log.d(TAG, "ondrag start"); –  May 26 '16 at 19:22
  • If you can post the full code of your Drag maybe we can help you more – Francisco Durdin Garcia May 29 '16 at 18:12
0

You set View ID in code. Can you remove imageAnswer.setId(R.id.imgAnswer); or if your using min SDK 17 replace it to generateViewId. May be problem inside potentiality duplicate IDs.

Shadwork
  • 97
  • 4
  • I also tried those but did not work 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); i tried all. –  May 24 '16 at 17:50
  • Try that and be sure that you run it on device with 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 May 25 '16 at 05:28
  • did not work, it is same. my logs are in the answer also my codes i changed –  May 28 '16 at 11:27