2016-08-11 5 views
0

У меня есть edittext, который я хотел скопировать из одного макета в другой. Я реализовал OnTouchListener. Проблемы, с которыми я сталкиваюсь, следующие;Android OnTouchListener предотвращает метод обратного вызова OnFocusChangeListener

  1. Метод обратного вызова OnFucusChangeListener не запускается.
  2. Редактировать текст не перетаскивается.

Код

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> 

Так что я могу перетащить EditText, но когда я касаюсь его, не отображается клавиатура. Клавиатура отображается, когда я тестирую ее, используя эмулятор, работающий с Lollipop. Правильно ли это?

ответ

0

Android поддерживает только один зарегистрированный слушатель в целом.

Так что я могу перетащить EditText, но когда я касаюсь его, клавиатура не отображается .

Это происходит потому, что DragListener перекрытая в TouchListener.

Возможно, у вас есть обходное решение, которое состоит в создании слушателя, который просто пересылает события другим слушателям с использованием составного шаблона.

Вы можете сделать это следующим образом:

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

Установите ваши кнопки (или интерактивные просмотры), как это:

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

Всякий раз, когда вы хотите добавить еще один слушатель, добавить его в groupListener

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

С уважением,

+0

Я очень ценю ваши усилия, чтобы помочь. К сожалению, ваше решение не сработало для меня. –

Смежные вопросы