2013-06-27 39 views
7

我已經給出了完整的代碼。如何將TextView拖動到正確的目標其他TextView

下面的代碼可以非常流暢地拖放,但它不像我需要的波紋管描述那樣工作。

  1. 拖動數據是(蘋果,ORAGE,球)
  2. 降目標位置是(一種,O表示,B爲)

所以,如果拖曳 「蘋果」 降至「A因爲「這將是正確的,並更新文本爲」蘋果A「和文本」蘋果「在拖動將隱藏...但如果我們拖動」蘋果「下降到」O for「或」B for「它將失敗因爲「O for Orange」和「B for Ball」。

基於下面的代碼,我應該添加什麼。

佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical" 
android:padding="10dp" 
android:paddingLeft="50dp" 
android:paddingRight="50dp" > 


<TextView 
    android:id="@+id/option_1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="5dp" 
    android:background="@drawable/option" 
    android:gravity="center" 
    android:text="Apple" 
    android:textStyle="bold" /> 

<TextView 
    android:id="@+id/option_2" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="5dp" 
    android:background="@drawable/option" 
    android:gravity="center" 
    android:text="Orange" 
    android:textStyle="bold" /> 

<TextView 
    android:id="@+id/option_3" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="5dp" 
    android:background="@drawable/option" 
    android:gravity="center" 
    android:text="Ball" 
    android:textStyle="bold" /> 

<TextView 
    android:id="@+id/choice_1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="5dp" 
    android:background="@drawable/choice" 
    android:gravity="center" 
    android:text="A for " /> 

<TextView 
    android:id="@+id/choice_2" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="5dp" 
    android:background="@drawable/choice" 
    android:gravity="center" 
    android:text="O for" /> 

<TextView 
    android:id="@+id/choice_3" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="5dp" 
    android:background="@drawable/choice" 
    android:gravity="center" 
    android:text="B for " /> 

</LinearLayout> 

Acvitity:

public class picture_to_word_24_color extends Activity { 

//text views being dragged and dropped onto 
private TextView option1, option2, option3, choice1, choice2, choice3; 
public CharSequence dragData; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.picture_to_word_24_color); 

    //get both sets of text views 

    //views to drag 
    option1 = (TextView)findViewById(R.id.option_1); 
    option2 = (TextView)findViewById(R.id.option_2); 
    option3 = (TextView)findViewById(R.id.option_3); 

    //views to drop onto 
    choice1 = (TextView)findViewById(R.id.choice_1); 
    choice2 = (TextView)findViewById(R.id.choice_2); 
    choice3 = (TextView)findViewById(R.id.choice_3); 

    //set touch listeners 
    option1.setOnTouchListener(new ChoiceTouchListener()); 
    option2.setOnTouchListener(new ChoiceTouchListener()); 
    option3.setOnTouchListener(new ChoiceTouchListener()); 

    //set drag listeners 
    choice1.setOnDragListener(new ChoiceDragListener()); 
    choice2.setOnDragListener(new ChoiceDragListener()); 
    choice3.setOnDragListener(new ChoiceDragListener()); 
} 

/** 
* ChoiceTouchListener will handle touch events on draggable views 
* 
*/ 
private final class ChoiceTouchListener implements OnTouchListener { 
    @SuppressLint("NewApi") 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
      /* 
      * Drag details: we only need default behavior 
      * - clip data could be set to pass data as part of drag 
      * - shadow can be tailored 
      */ 
      ClipData data = ClipData.newPlainText("", ""); 
      DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); 
      //start dragging the item touched 
      view.startDrag(data, shadowBuilder, view, 0); 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 

/** 
* DragListener will handle dragged views being dropped on the drop area 
* - only the drop action will have processing added to it as we are not 
* - amending the default behavior for other parts of the drag process 
* 
*/ 
@SuppressLint("NewApi") 
private class ChoiceDragListener implements OnDragListener { 

    @Override 
    public boolean onDrag(View v, DragEvent event) { 
     switch (event.getAction()) { 
     case DragEvent.ACTION_DRAG_STARTED: 
      //no action necessary 
      break; 
     case DragEvent.ACTION_DRAG_ENTERED: 
      //no action necessary 
      Toast.makeText(picture_to_word_24_color.this, "ACTION_DRAG_ENTERED", Toast.LENGTH_SHORT).show(); 
      break; 
     case DragEvent.ACTION_DRAG_EXITED:   
      //no action necessary 
      Toast.makeText(picture_to_word_24_color.this, "ACTION_DRAG_EXITED", Toast.LENGTH_SHORT).show(); 
      break; 
     case DragEvent.ACTION_DROP: 

      Toast.makeText(picture_to_word_24_color.this, "ACTION_DROP", Toast.LENGTH_SHORT).show(); 
      //handle the dragged view being dropped over a drop view 
      View view = (View) event.getLocalState(); 
      //stop displaying the view where it was before it was dragged 
      view.setVisibility(View.INVISIBLE); 
      //view dragged item is being dropped on 
      TextView dropTarget = (TextView) v; 
      //view being dragged and dropped 
      TextView dropped = (TextView) view; 
      //update the text in the target view to reflect the data being dropped 
      dropTarget.setText(dropped.getText()); 
      //make it bold to highlight the fact that an item has been dropped 
      dropTarget.setTypeface(Typeface.DEFAULT_BOLD); 
      //if an item has already been dropped here, there will be a tag 
      Object tag = dropTarget.getTag(); 
      //if there is already an item here, set it back visible in its original place 
      if(tag!=null) 
      { 
       //the tag is the view id already dropped here 
       int existingID = (Integer)tag; 
       //set the original view visible again 
       findViewById(existingID).setVisibility(View.VISIBLE); 
      } 
      //set the tag in the target view being dropped on - to the ID of the view being dropped 
      dropTarget.setTag(dropped.getId()); 
      break; 
     case DragEvent.ACTION_DRAG_ENDED: 
      //no action necessary 
      Toast.makeText(picture_to_word_24_color.this, "ACTION_DRAG_ENDED", Toast.LENGTH_SHORT).show(); 
      break; 
     default: 
      break; 
     } 
     return true; 
    } 
} 
} 
+0

請問您有什麼問題請詳細說明! – joecks

回答

18

嘗試下面的代碼,它應該根據問題的說明工作。 我已經添加了一個額外的東西,即重置按鈕,因爲我覺得有必要。

picture_to_word_24_color.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
android:padding="10dp" 
android:paddingLeft="50dp" 
android:paddingRight="50dp" > 


<TextView 
android:id="@+id/option_1" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_margin="5dp" 
android:background="@drawable/option" 
android:gravity="center" 
android:text="Apple" 
android:textStyle="bold" /> 

<TextView 
android:id="@+id/option_2" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_margin="5dp" 
android:background="@drawable/option" 
android:gravity="center" 
android:text="Orange" 
android:textStyle="bold" /> 

<TextView 
android:id="@+id/option_3" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_margin="5dp" 
android:background="@drawable/option" 
android:gravity="center" 
android:text="Ball" 
android:textStyle="bold" /> 

<TextView 
android:id="@+id/choice_1" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_margin="5dp" 
android:background="@drawable/choice" 
android:gravity="center" 
android:text="A for " /> 

<TextView 
android:id="@+id/choice_2" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_margin="5dp" 
android:background="@drawable/choice" 
android:gravity="center" 
android:text="O for " /> 

<TextView 
android:id="@+id/choice_3" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_margin="5dp" 
android:background="@drawable/choice" 
android:gravity="center" 
android:text="B for " /> 

<Button 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="Reset" 
android:onClick="reset"/> 

</LinearLayout> 

Picture_to_word_24_color.java

package com.example.touchanddrag; 

import android.os.Build; 
import android.os.Bundle; 
import android.annotation.SuppressLint; 
import android.annotation.TargetApi; 
import android.app.Activity; 
import android.content.ClipData; 
import android.graphics.Typeface; 
import android.view.DragEvent; 
import android.view.Menu; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.DragShadowBuilder; 
import android.view.View.OnDragListener; 
import android.view.View.OnTouchListener; 
import android.widget.TextView; 
import android.widget.Toast; 

@SuppressLint("NewApi") 
public class Picture_to_word_24_color extends Activity { 

private TextView option1, option2, option3, choice1, choice2, choice3; 
public CharSequence dragData; 

@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
@SuppressLint("NewApi") 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.picture_to_word_24_color); 

    //get both sets of text views 

    //views to drag 
    option1 = (TextView)findViewById(R.id.option_1); 
    option2 = (TextView)findViewById(R.id.option_2); 
    option3 = (TextView)findViewById(R.id.option_3); 

    //views to drop onto 
    choice1 = (TextView)findViewById(R.id.choice_1); 
    choice2 = (TextView)findViewById(R.id.choice_2); 
    choice3 = (TextView)findViewById(R.id.choice_3); 

    //set touch listeners 
    option1.setOnTouchListener(new ChoiceTouchListener()); 
    option2.setOnTouchListener(new ChoiceTouchListener()); 
    option3.setOnTouchListener(new ChoiceTouchListener()); 

    //set drag listeners 
    choice1.setOnDragListener(new ChoiceDragListener()); 
    choice2.setOnDragListener(new ChoiceDragListener()); 
    choice3.setOnDragListener(new ChoiceDragListener()); 
} 

/** 
* ChoiceTouchListener will handle touch events on draggable views 
* 
*/ 
private final class ChoiceTouchListener implements OnTouchListener { 
    @SuppressLint("NewApi") 
    @Override 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
      /* 
      * Drag details: we only need default behavior 
      * - clip data could be set to pass data as part of drag 
      * - shadow can be tailored 
      */ 
      ClipData data = ClipData.newPlainText("", ""); 
      DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); 
      //start dragging the item touched 
      view.startDrag(data, shadowBuilder, view, 0); 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 

/** 
* DragListener will handle dragged views being dropped on the drop area 
* - only the drop action will have processing added to it as we are not 
* - amending the default behavior for other parts of the drag process 
* 
*/ 
@SuppressLint("NewApi") 
private class ChoiceDragListener implements OnDragListener { 

    @Override 
    public boolean onDrag(View v, DragEvent event) { 
     switch (event.getAction()) { 
     case DragEvent.ACTION_DRAG_STARTED: 
      //no action necessary 
      break; 
     case DragEvent.ACTION_DRAG_ENTERED: 
      //no action necessary 
      break; 
     case DragEvent.ACTION_DRAG_EXITED:   
      //no action necessary 
      break; 
     case DragEvent.ACTION_DROP: 

      //handle the dragged view being dropped over a drop view 
      View view = (View) event.getLocalState(); 
      //view dragged item is being dropped on 
      TextView dropTarget = (TextView) v; 
      //view being dragged and dropped 
      TextView dropped = (TextView) view; 
      //checking whether first character of dropTarget equals first character of dropped 
      if(dropTarget.getText().toString().charAt(0) == dropped.getText().toString().charAt(0)) 
      { 
       //stop displaying the view where it was before it was dragged 
       view.setVisibility(View.INVISIBLE); 
       //update the text in the target view to reflect the data being dropped 
       dropTarget.setText(dropTarget.getText().toString() + dropped.getText().toString()); 
       //make it bold to highlight the fact that an item has been dropped 
       dropTarget.setTypeface(Typeface.DEFAULT_BOLD); 
       //if an item has already been dropped here, there will be a tag 
       Object tag = dropTarget.getTag(); 
       //if there is already an item here, set it back visible in its original place 
       if(tag!=null) 
       { 
        //the tag is the view id already dropped here 
        int existingID = (Integer)tag; 
        //set the original view visible again 
        findViewById(existingID).setVisibility(View.VISIBLE); 
       } 
       //set the tag in the target view being dropped on - to the ID of the view being dropped 
       dropTarget.setTag(dropped.getId()); 
       //remove setOnDragListener by setting OnDragListener to null, so that no further drag & dropping on this TextView can be done 
       dropTarget.setOnDragListener(null); 
      } 
      else 
       //displays message if first character of dropTarget is not equal to first character of dropped 
       Toast.makeText(Picture_to_word_24_color.this, dropTarget.getText().toString() + "is not " + dropped.getText().toString(), Toast.LENGTH_LONG).show(); 
      break; 
     case DragEvent.ACTION_DRAG_ENDED: 
      //no action necessary 
      break; 
     default: 
      break; 
     } 
     return true; 
    } 
} 

public void reset(View view) 
{ 
    option1.setVisibility(TextView.VISIBLE); 
    option2.setVisibility(TextView.VISIBLE); 
    option3.setVisibility(TextView.VISIBLE); 

    choice1.setText("A for "); 
    choice2.setText("O for "); 
    choice3.setText("B for "); 

    choice1.setTag(null); 
    choice2.setTag(null); 
    choice3.setTag(null); 

    choice1.setTypeface(Typeface.DEFAULT); 
    choice2.setTypeface(Typeface.DEFAULT); 
    choice3.setTypeface(Typeface.DEFAULT); 

    choice1.setOnDragListener(new ChoiceDragListener()); 
    choice2.setOnDragListener(new ChoiceDragListener()); 
    choice3.setOnDragListener(new ChoiceDragListener()); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.picture_to_word_24_color, menu); 
    return true; 
} 

} 

不要忘記檢查目標API級別。由於我不得不添加@SuppressLint("NewApi")

+1

尊敬的烏薩馬•穆罕默德•夏伊,我真的不知道該怎麼說謝謝......我想說一百萬謝謝您的幫助。你的代碼就像我真正需要的一樣工作。如果我可以給你幾百張支票,我會的。再次非常感謝你,烏薩馬。 – user1731690

+0

不客氣。 –

+0

嗨Osama Mahammed,基於上面的代碼,我們如何檢測所有拖動對象何時結束?我的意思是,在我們已經將所有(蘋果,奧拉格,鮑爾)拖到目標後,我需要完成這項工作。 – user1731690

相關問題