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.
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
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. –
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
hat nicht funktioniert, es ist das gleiche. Meine Protokolle sind in der Antwort auch meine Codes, die ich geändert habe –