Android OnTouchListener ป้องกันวิธีการโทรกลับ OnFocusChangeListener

ฉันมีข้อความแก้ไขที่ต้องการคัดลอกจากเลย์เอาต์หนึ่งไปยังอีกเลย์เอาต์หนึ่ง ฉันใช้ OnTouchListener ปัญหาที่ฉันพบมีดังต่อไปนี้

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

เค้าโครง

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

ดังนั้นฉันจึงสามารถลากข้อความแก้ไขได้ แต่เมื่อแตะแล้ว แป้นพิมพ์จะไม่แสดงขึ้นมา แป้นพิมพ์ปรากฏขึ้นเมื่อฉันทดสอบโดยใช้โปรแกรมจำลองที่ใช้ Lollipop นี่เป็นแนวทางที่ถูกต้องหรือไม่?


person The_Martian    schedule 11.08.2016    source แหล่งที่มา


คำตอบ (1)


โดยทั่วไป Android รองรับผู้ฟังที่ลงทะเบียนไว้เพียงคนเดียวเท่านั้น

ดังนั้นฉันจึงสามารถลากข้อความแก้ไขได้ แต่เมื่อแตะแล้ว แป้นพิมพ์จะไม่แสดงขึ้นมา

สิ่งนี้เกิดขึ้นเนื่องจาก DragListener แทนที่ TouchListener

คุณสามารถมีวิธีแก้ไขได้ ซึ่งประกอบด้วยการสร้าง Listener ที่ส่งต่อเหตุการณ์ไปยัง Listener อื่นๆ โดยใช้รูปแบบคอมโพสิต

คุณสามารถทำได้ด้วยวิธีนี้:

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

เมื่อใดก็ตามที่คุณต้องการเพิ่ม Listener อื่น ให้เพิ่มไปยัง groupListener

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

ความนับถือ,

person Ricardo Vieira    schedule 11.08.2016
comment
ฉันขอขอบคุณความพยายามของคุณในการช่วยเหลือ น่าเสียดายที่โซลูชันของคุณไม่ได้ผลสำหรับฉัน - person The_Martian; 11.08.2016