Выполните операцию перетаскивания из всплывающего окна в Android - PullRequest
3 голосов
/ 17 февраля 2012

Я хочу "перетаскивать" элементы из PopupWindow в базовый вид. Проблема сейчас в том, что когда я закрываю PopupWindow после долгого щелчка по элементу, базовое представление не получает никаких MotionEvents. Эта проблема в основном сводится к делегированию MotionEvents между представлениями, как в проблеме перетаскивания между представлениями, как обсуждалось здесь . Было предложено решение здесь , но в моем случае это не вариант. Я не могу использовать вид наложения, который находится поверх PopupWindow, могу я?

Приведенный ниже код является упрощенной версией моей проблемы. У меня в основном есть одна кнопка, которая вызывает PopupWindow. При длинном щелчке на этом всплывающем окне оно закрывается. Теперь MotionEvents следует снова отправить в базовое представление, но этого не происходит (как вы можете видеть в выводе журнала).

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.PopupWindow;

public class PopupWindowDragDropActivity extends Activity implements OnClickListener, OnTouchListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        findViewById(R.id.b1).setOnClickListener(this);
        findViewById(R.id.contents).setOnTouchListener(this);
    }

    @Override
    public void onClick(View v) {
        final PopupWindow p = new PopupWindow(this);
        p.setContentView(new Button(this));
        p.setHeight(100);
        p.setWidth(100);
        p.showAtLocation(findViewById(R.id.contents), Gravity.CENTER, 0, 0);
        p.getContentView().setOnLongClickListener(new OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                v.post(new Runnable() {
                    @Override
                    public void run() {
                        p.dismiss();
                    }
                });

                return false;
            }
        });
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.d("", "Action: " + event);
        return true;
    }
}

Вот простой макет 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:id="@+id/contents" >

    <Button
        android:id="@+id/b1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...