Android OnTouchListener mencegah metode panggilan balik OnFocusChangeListener

Saya memiliki teks edit yang ingin saya salin dari satu tata letak ke tata letak lainnya. Saya menerapkan OnTouchListener. Masalah yang saya hadapi adalah sebagai berikut;

  1. Metode panggilan balik OnFucusChangeListener tidak diaktifkan.
  2. Teks edit diseret bukan disalin.

Kode

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

Tata Letak

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

Jadi saya bisa menyeret teks editnya tetapi ketika saya menyentuhnya, keyboard tidak ditampilkan. Keyboard ditampilkan saat saya mengujinya menggunakan emulator yang menjalankan Lollipop. Apakah ini pendekatan yang tepat?


person The_Martian    schedule 11.08.2016    source sumber


Jawaban (1)


Android secara umum hanya mendukung satu pendengar terdaftar.

Jadi saya bisa menyeret teks editnya tetapi ketika saya menyentuhnya, keyboard tidak ditampilkan.

Hal ini terjadi karena DragListener menggantikan TouchListener.

Namun Anda dapat memiliki solusinya, yaitu dengan membuat pendengar yang meneruskan peristiwa ke pendengar lain menggunakan pola gabungan.

Anda dapat melakukannya dengan cara ini:

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

Atur tombol Anda (atau tampilan yang dapat diklik) seperti ini:

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

Kapan pun Anda ingin menambahkan pendengar lain, tambahkan ke groupListener

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

Salam,

person Ricardo Vieira    schedule 11.08.2016
comment
Saya sangat menghargai upaya Anda untuk membantu. Sayangnya, solusi Anda tidak berhasil untuk saya. - person The_Martian; 11.08.2016