Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用DrageEvent在线性布局中放置图像_Java_Android_Android Layout - Fatal编程技术网

Java 如何使用DrageEvent在线性布局中放置图像

Java 如何使用DrageEvent在线性布局中放置图像,java,android,android-layout,Java,Android,Android Layout,我正在尝试实现一个拖动拼图,其中我将一个图像移动到一个线性布局,以解决该拼图 当我将一个图像放置到其中一个线性布局中时,这一切都很好,但我不希望在同一个线性布局中放置任何其他图片,另一个问题是,当我将图像拖动到线性布局之外,然后将图像拖放到该线性布局中时,图像将消失 package com.example.android.myapplication; import android.content.ClipData; import android.content.Context; import

我正在尝试实现一个拖动拼图,其中我将一个图像移动到一个线性布局,以解决该拼图

当我将一个图像放置到其中一个线性布局中时,这一切都很好,但我不希望在同一个线性布局中放置任何其他图片,另一个问题是,当我将图像拖动到线性布局之外,然后将图像拖放到该线性布局中时,图像将消失

package com.example.android.myapplication;

import android.content.ClipData;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.DragEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;


public class BlankFragment extends Fragment {

    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    private String mParam1;
    private String mParam2;

    View vista;
    LinearLayout layout1, layout2, layout3, layout4, layout5, layout6;
    ImageView image1, image2, image3;

    private OnFragmentInteractionListener mListener;

    public BlankFragment() 
    {

    }

    public static BlankFragment newInstance(String param1, String param2) 
    {
        BlankFragment fragment = new BlankFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    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);
                view.startDrag(data, shadowBuilder, view, 0);
                view.setVisibility(View.INVISIBLE);
                return true;
            } else {
                return false;
            }
        }
    }

    class MyDragListener implements View.OnDragListener 
    {
        Drawable enterShape = getResources().getDrawable(
                R.drawable.shape_droptarget);
        Drawable normalShape = getResources().getDrawable(R.drawable.shape);

        @Override
        public boolean onDrag(View v, DragEvent event) 
        {
            int action = event.getAction();
            switch (event.getAction()) 
            {
                case DragEvent.ACTION_DRAG_STARTED:

                    break;
                case DragEvent.ACTION_DRAG_ENTERED:
                    v.setBackgroundDrawable(enterShape);
                    break;
                case DragEvent.ACTION_DRAG_EXITED:
                    v.setBackgroundDrawable(normalShape);
                    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:
                    v.setBackgroundDrawable(normalShape);
                default:
                    break;
            }
            return true;
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) 
    {
        // Inflate the layout for this fragment
        vista = inflater.inflate(R.layout.fragment_blank, container, false);

        image1 = vista.findViewById(R.id.image1);
        image1.setOnTouchListener(new BlankFragment.MyTouchListener());

        image2 = vista.findViewById(R.id.image2);
        image2.setOnTouchListener(new BlankFragment.MyTouchListener());

        image3 = vista.findViewById(R.id.image3);
        image3.setOnTouchListener(new BlankFragment.MyTouchListener());

        layout1 = vista.findViewById(R.id.layout1);
        layout1.setOnDragListener(new MyDragListener());

        layout2 = vista.findViewById(R.id.layout2);
        layout2.setOnDragListener(new MyDragListener());

        layout3 = vista.findViewById(R.id.layout3);
        layout3.setOnDragListener(new MyDragListener());

        layout4 = vista.findViewById(R.id.layout4);
        layout4.setOnDragListener(new MyDragListener());

        layout5 = vista.findViewById(R.id.layout5);
        layout5.setOnDragListener(new MyDragListener());

        layout6 = vista.findViewById(R.id.layout6);
        layout6.setOnDragListener(new MyDragListener());

        return vista;
    }

    // TODO: Rename method, update argument and hook method into UI event
    public void onButtonPressed(Uri uri) 
    {
        if (mListener != null) 
        {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Context context) 
    {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) 
        {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() 
    {
        super.onDetach();
        mListener = null;
    }

    public interface OnFragmentInteractionListener 
    {
        // TODO: Update argument type and name
        void onFragmentInteraction(Uri uri);
    }
}
这是我的布局

我不希望这种情况发生


每个线性布局只有一个,将图像移动到线性布局之外会使图像消失

我以前也遇到过同样的问题,这段代码可能会对您有所帮助

基本上,您需要有一个临时视图来保存您拖动的视图,并删除布局中可能已经包含的视图

 private final class MyTouchListener implements View.OnTouchListener {

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {

        for (LinearLayout layout : layouts) {

            if (layout.getChildCount() == 0) {

                layout.setOnDragListener(new MyDragListener());
            }
        }


        ClipData data = ClipData.newPlainText("", "");
        View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
        view.startDrag(data, shadowBuilder, view, 0);
        view.setVisibility(View.VISIBLE);

        return true;

    }
}


private class MyDragListener implements View.OnDragListener {

    @Override
    public boolean onDrag(View view, DragEvent dragEvent) {

        int action = dragEvent.getAction();

        switch (action) {

            case ACTION_DROP:

                View viewBeingHold = (View) dragEvent.getLocalState();
                ViewGroup owner = (ViewGroup) viewBeingHold.getParent();

                owner.removeView(viewBeingHold);
                LinearLayout containerWhereViewWillBeDropped = (LinearLayout) view;
                viewBeingHold.setVisibility(View.VISIBLE);

                View viewAlreadyOnLayout = containerWhereViewWillBeDropped.getChildAt(0);

                if (viewAlreadyOnLayout != null) {

                    containerWhereViewWillBeDropped.removeView(viewAlreadyOnLayout);

                    containerWhereViewWillBeDropped.addView(viewBeingHold);

                    owner.addView(viewAlreadyOnLayout);

                } else if (viewAlreadyOnLayout == null) {// it means we're still on the same layout
                    owner.addView(viewBeingHold);

                }

                updateDatabaseWithTeamPosition();

                break;
        }

        return true;
    }
}

我以前也遇到过同样的问题,这段代码可能会对您有所帮助

基本上,您需要有一个临时视图来保存您拖动的视图,并删除布局中可能已经包含的视图

 private final class MyTouchListener implements View.OnTouchListener {

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {

        for (LinearLayout layout : layouts) {

            if (layout.getChildCount() == 0) {

                layout.setOnDragListener(new MyDragListener());
            }
        }


        ClipData data = ClipData.newPlainText("", "");
        View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
        view.startDrag(data, shadowBuilder, view, 0);
        view.setVisibility(View.VISIBLE);

        return true;

    }
}


private class MyDragListener implements View.OnDragListener {

    @Override
    public boolean onDrag(View view, DragEvent dragEvent) {

        int action = dragEvent.getAction();

        switch (action) {

            case ACTION_DROP:

                View viewBeingHold = (View) dragEvent.getLocalState();
                ViewGroup owner = (ViewGroup) viewBeingHold.getParent();

                owner.removeView(viewBeingHold);
                LinearLayout containerWhereViewWillBeDropped = (LinearLayout) view;
                viewBeingHold.setVisibility(View.VISIBLE);

                View viewAlreadyOnLayout = containerWhereViewWillBeDropped.getChildAt(0);

                if (viewAlreadyOnLayout != null) {

                    containerWhereViewWillBeDropped.removeView(viewAlreadyOnLayout);

                    containerWhereViewWillBeDropped.addView(viewBeingHold);

                    owner.addView(viewAlreadyOnLayout);

                } else if (viewAlreadyOnLayout == null) {// it means we're still on the same layout
                    owner.addView(viewBeingHold);

                }

                updateDatabaseWithTeamPosition();

                break;
        }

        return true;
    }
}

嘿,谢谢你的回答,我正在尝试实现你给我的snipet,但遗憾的是它对我的问题不起作用,但它给了我解决问题的方法:)酷!很乐意帮忙。希望您的问题得到解决。:)嘿,谢谢你的回答,我正在尝试实现你给我的snipet,但遗憾的是它对我的问题不起作用,但它给了我解决问题的方法:)酷!很乐意帮忙。希望您的问题得到解决。:)