【问题标题】:view disappears on dragging it over framelayout android视图在将其拖动到 framelayout android 时消失
【发布时间】:2014-10-30 08:16:06
【问题描述】:

我正在应用程序中实现拖放视图。我有一个 frameLayout 和一个里面的视图。我想水平拖动该视图。我可以拖动该视图,但是当我释放它时,该视图会消失。这是我的xml文件

<FrameLayout
android:layout_width="match_parent"
android:layout_height="250dip"
android:id="@+id/chart"
android:orientation="vertical"
android:background="#ffffff"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
<View
    android:id="@+id/drag_line"
    android:layout_width="3dp"
    android:visibility="invisible"
    android:layout_gravity="bottom|center"
    android:layout_height="wrap_content"
    android:layout_marginBottom="50dp"
    android:layout_marginLeft="10dp"
    android:background="#FF0000FF" />

这是我的拖放事件处理程序

layout = (FrameLayout) findViewById(R.id.chart);
line = (View) findViewById(R.id.drag_line);
  activity.line.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
                ClipData data = ClipData.newPlainText("", "");
                View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
                activity.line.startDrag(data, shadowBuilder, null, 0);
                activity.line.setVisibility(View.INVISIBLE);
                return true;
            } else {
                return true;
            }
        }
    });
    activity.layout.setOnDragListener(new View.OnDragListener() {
        @Override
        public boolean onDrag(View view, DragEvent event) {

            int currentX = (int) event.getX();

            //FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams();
            if(event.getAction() == DragEvent.ACTION_DRAG_STARTED){
                Log.d(TAG, "STARTED");
                y = (int) event.getY();
                return true;
            }
            if(event.getAction() == DragEvent.ACTION_DROP){
                FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT);
                Log.d(TAG, "Drop");
                int x_cord = (int) event.getX();
                Log.d(TAG, "Drop X"+x_cord);
                Log.d(TAG, "Drop Y"+y);
                params.leftMargin = x_cord;
                params.topMargin = y;

                // line.setY(x_cord);
                //layout.removeAllViews();
                activity.line.setLayoutParams(params);
                activity.line.invalidate();
                return true;
            }
            return true;
        }
    });

我可以在我的日志中看到我有 x 和 y 坐标,但线 get 消失而不是在那个坐标上。谢谢

【问题讨论】:

    标签: android android-layout drag-and-drop views


    【解决方案1】:

    你必须像这样设置你的拖动事件 -

    findViewById(R.id.topHalf).setOnDragListener(new ColonyHutDrag());
    

    其中 R.id.topHalf 是我的 Framelayout 的 id,而 ColonyHutDrag 是实现 onTouchListener 的类

    public class ColonyHutClick implements OnTouchListener 
    

    当一个没有设置 OnDragListener 的拖动对象被释放时,没有任何东西可以处理 ACTION_DROP,因此您没有机会将拖动的 View 重置为 VISIBLE。

    希望对你有所帮助。

    【讨论】:

    • 对不起,你能详细解释一下吗,这里的 R.id.topHalf 和 ColonyHutDrag 是什么...
    • 谢谢,让我试试...如果可行,我接受答案
    • 当我这样做时,它会在 drop java.lang.ClassCastException 上抛出异常:android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多