2016-08-11 3 views
0

Ich habe einen Edittext, den ich von einem Layout in ein anderes kopieren wollte. Ich habe OnTouchListener implementiert. Die Probleme, auf die ich gestoßen bin, sind folgende;Android OnTouchListener verhindert die Rückrufmethode OnFocusChangeListener

  1. Die Callback-Methode OnFucusChangeListener wurde nicht ausgelöst.
  2. Der Editiertext wird nicht kopiert, sondern gezogen.

-Code

private final class MyTouchListener implements View.OnTouchListener { 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
      ClipData data = ClipData.newPlainText("", ""); 
      View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
       view.startDragAndDrop(data, shadowBuilder, view, 0); 
      }else{ 
       view.startDrag(data, shadowBuilder, view, 0); 
      } 
      view.setVisibility(View.VISIBLE); 
      return true; 
     }else{ 
      return false; 
     } 
    } 
} 

class MyDragListener implements View.OnDragListener { 
    @Override 
    public boolean onDrag(View v, DragEvent event) { 
     int action = event.getAction(); 
     switch (event.getAction()) { 
      case DragEvent.ACTION_DRAG_STARTED: 
       // do nothing 
       break; 
      case DragEvent.ACTION_DRAG_ENTERED: 
       break; 
      case DragEvent.ACTION_DRAG_EXITED: 
       break; 
      case DragEvent.ACTION_DROP: 
       // Dropped, reassign View to ViewGroup 
       View view = (View) event.getLocalState(); 
       ViewGroup owner = (ViewGroup) view.getParent(); 
       owner.removeView(view); 
       LinearLayout container = (LinearLayout) v; 
       container.addView(view); 
       view.setVisibility(View.VISIBLE); 
       break; 
      case DragEvent.ACTION_DRAG_ENDED: 
       //View vi = (View) event.getLocalState(); 
       //vi.setOnTouchListener(new MyTouchListener()); 
      default: 
       break; 
     } 
     return true; 
    } 
} 

Layout-

<?xml version="1.0" encoding="utf-8"?> 
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:columnCount="2" 
    android:columnWidth="320dp" 
    android:orientation="horizontal" 
    android:rowCount="1" 
    android:stretchMode="columnWidth" > 

    <LinearLayout 
     android:id="@+id/topleft" 
     android:orientation="vertical" 
     android:layout_width="100dp" 
     android:layout_height="320dp" 
     android:layout_row="0" 
     android:background="@drawable/drop_target" > 

     <EditText 
      android:id="@+id/etUserText" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:hint="@string/enter_text" 
      android:inputType="textMultiLine" 
      android:clickable="true" 
      android:focusableInTouchMode="true" 
      android:focusable="true"/> 
     <Button 
      android:id="@+id/bAddImage" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/add_image"/> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/topright" 
     android:orientation="vertical" 
     android:layout_width="280dp" 
     android:layout_height="200dp" 
     android:background="@drawable/drop_target" > 

     <ImageView 
      android:id="@+id/iUserPicture" 
      android:layout_width="60dp" 
      android:layout_height="60dp" 
      android:src="@drawable/picture_holder" 
      android:scaleType="fitXY" /> 

    </LinearLayout> 

</GridLayout> 

So kann ich die EditText ziehen, aber wenn ich es berühren, wird die Tastatur nicht angezeigt. Die Tastatur wird angezeigt, wenn ich sie unter Verwendung eines Emulators mit Lollipop teste. Ist das der richtige Ansatz?

Antwort

0

Android unterstützt im Allgemeinen nur einen registrierten Listener.

So kann ich die EditText ziehen, aber wenn ich es berühren, ist die Tastatur nicht angezeigt.

Dies geschieht, weil die DragListener die Touchoverrided.

Sie können jedoch eine Problemumgehung verwenden, die darin besteht, einen Listener zu erstellen, der die Ereignisse mithilfe des zusammengesetzten Musters einfach an andere Listener weiterleitet.

Sie können es auf diese Weise tun:

private class CustomCompositeOnClickListener implements View.OnClickListener { 

    List<View.OnClickListener> listeners; 

    public CustomCompositeOnClickListener(){ 
     listeners = new ArrayList<View.OnClickListener>(); 
    } 

    public void addOnClickListener(View.OnClickListener listener){ 
     listeners.add(listener); 
    } 

    @Override 
    public void onClick(View v){ 
     for(View.OnClickListener listener : listeners){ 
      listener.onClick(v); 
     } 
    } 
} 

Legen Sie Ihre Tasten (oder anklickbare Ansichten) wie folgt aus:

CustomCompositeOnClickListener groupListener = new CustomCompositeOnClickListener(); 
Button button = (Butto) findViewById(R.id.button); 
button.setOnClickListener(groupListener); 

Jedes Mal, wenn Sie einen anderen Zuhörer hinzufügen möchten, fügen Sie es dem groupListener

groupListener.addOnClickListener(new View.OnClickListener(){ 
    @Override 
    public void onClick(View v){ 
     // implement your behaviour here 
    } 
}); 

Grüße,

+0

Ich schätze Ihre Bemühungen sehr zu helfen. Leider hat deine Lösung bei mir nicht funktioniert. –

Verwandte Themen