Ad

Problem With Dropping An Image From Dialog To Activity

I keep getting the NullPointerException.I Cannot get the image from my dialogfragment to my main activity. The item from the dialog drags to the main activity. But when I dropped the image the app crashes because it does not get the image that I dragged. So How to drop the image from my dialog to my main activity? Please help me solve this problem.

Main Activity

public class MainActivity extends AppCompatActivity implements View.OnDragListener, View.OnLongClickListener {

    private static final String TAG = MainActivity.class.getSimpleName();
    private ImageView imageView;
    private static final String IMAGE_VIEW_TAG = "ONION";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViews();
        implementEvents();

    }

    private void findViews() {
        imageView = findViewById(R.id.image_view);
        imageView.setTag(IMAGE_VIEW_TAG);
    }


    //Implement long click and drag listener
    private void implementEvents() {
        imageView.setOnLongClickListener(this);

        findViewById(R.id.Imgbutton10).setOnDragListener(this);
        findViewById(R.id.Imgbutton11).setOnDragListener(this);
        findViewById(R.id.Imgbutton12).setOnDragListener(this);
        findViewById(R.id.Imgbutton13).setOnDragListener(this);
        findViewById(R.id.Imgbutton14).setOnDragListener(this);
    }

    @Override
    public boolean onLongClick(View view) {
        ClipData.Item item = new ClipData.Item((CharSequence) view.getTag());
        String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};

        ClipData data = new ClipData(view.getTag().toString(), mimeTypes, item);
        View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);

        view.startDrag(data,shadowBuilder,view,0);
        view.setVisibility(View.INVISIBLE);
        return true;
    }

    @Override
    public boolean onDrag(View view, DragEvent event) {
            int action = event.getAction();

            switch (action) {
                case DragEvent.ACTION_DRAG_STARTED:

                    if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
                        return true;
                    }

                    return false;

                case DragEvent.ACTION_DRAG_ENTERED:
                    view.getBackground().setColorFilter(Color.DKGRAY, PorterDuff.Mode.SRC_IN);
                    view.invalidate();
                    return true;

                case DragEvent.ACTION_DRAG_LOCATION:
                    // Ignore the event
                    return true;

                case DragEvent.ACTION_DRAG_EXITED:
                    view.getBackground().clearColorFilter();
                    view.invalidate();
                    return true;

                case DragEvent.ACTION_DROP:
                    ClipData.Item item = event.getClipData().getItemAt(0);
                    String dragData = item.getText().toString();
                    Toast.makeText(this, "Dragged data is " + dragData, Toast.LENGTH_SHORT).show();
                    view.getBackground().clearColorFilter();
                    view.invalidate();

                    View v = (View) event.getLocalState();
                    ViewGroup owner = (ViewGroup) v.getParent();
                    owner.removeView(v);
                    LinearLayout container = (LinearLayout) view;
                    container.addView(v);
                    v.setVisibility(View.VISIBLE);

                    return true;

                case DragEvent.ACTION_DRAG_ENDED:
                    view.getBackground().clearColorFilter();
                    view.invalidate();
                    if (event.getResult())
                        Toast.makeText(this, "The drop was handled.", Toast.LENGTH_SHORT).show();

                    else
                        Toast.makeText(this, "The drop didn't work.", Toast.LENGTH_SHORT).show();

                    return true;

                default:
                    Log.e("DragDrop Example", "Unknown action type received by OnDragListener.");
                    break;
            }
            return false;
        }
}

Dialog Fragment

public class VegyFrag extends DialogFragment implements View.OnLongClickListener,View.OnDragListener {

    private static final String Tag = "VegyFrag";
    private ImageView imageView;
    private static final String IMAGE_VIEW_TAG = "ONION";

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View myView = inflater.inflate(R.layout.dialog_add, container, false);
        imageView = myView.findViewById(R.id.ic2);
        imageView.setTag(IMAGE_VIEW_TAG);
        implementEvents();
        return myView;
    }


    private void implementEvents() {
        //add or remove any view that you don't want to be dragged
        imageView.setOnLongClickListener(this);
   ((MainActivity)getActivity()).findViewById(R.id.Imgbutton10).setOnDragListener(this);
        ((MainActivity)getActivity()).findViewById(R.id.Imgbutton11).setOnDragListener(this);
        ((MainActivity)getActivity()).findViewById(R.id.Imgbutton12).setOnDragListener(this);
        ((MainActivity)getActivity()).findViewById(R.id.Imgbutton13).setOnDragListener(this);
        ((MainActivity)getActivity()).findViewById(R.id.Imgbutton14).setOnDragListener(this);

    }

    @Override
    public boolean onLongClick(View view) {
        ClipData.Item item = new ClipData.Item((CharSequence) view.getTag());
        String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};

        ClipData data = new ClipData(view.getTag().toString(), mimeTypes, item);
        View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);

        view.startDrag(data,shadowBuilder,view,0);
        view.setVisibility(View.INVISIBLE);
        getDialog().dismiss();
        return true;
    }

    @Override
    public boolean onDrag(View view, DragEvent event) {
        int action = event.getAction();

        switch (action) {
            case DragEvent.ACTION_DRAG_STARTED:

                if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
                    return true;

                }
                return false;

            case DragEvent.ACTION_DRAG_ENTERED:
                view.getBackground().setColorFilter(Color.DKGRAY, PorterDuff.Mode.SRC_IN);
                view.invalidate();
                return true;

            case DragEvent.ACTION_DRAG_LOCATION:
                return true;

            case DragEvent.ACTION_DRAG_EXITED:
                view.getBackground().clearColorFilter();
                view.invalidate();
                return true;

            case DragEvent.ACTION_DROP:
                ClipData.Item item = event.getClipData().getItemAt(0);
                String dragData = item.getText().toString();
                view.getBackground().clearColorFilter();
                view.invalidate();

                View v = (View) event.getLocalState();
                ViewGroup owner = (ViewGroup) v.getParent();
                owner.removeView(v);
                LinearLayout container = (LinearLayout) view;
                container.addView(v);
                v.setVisibility(View.VISIBLE);

                return true;

            case DragEvent.ACTION_DRAG_ENDED:
                view.getBackground().clearColorFilter();
                view.invalidate();
                return true;

            default:
                Log.e("DragDrop Example", "Unknown action type received by OnDragListener.");
                break;
        }
        return false;
    }

}

Thank you in advance

Ad

Answer

I couldn't find a way to do it with a DialogFragment either, so I found a workaround. The problem with DialogFragments is that the view is destroyed when the dialog is dismissed, hence the NPE you were experiencing. To solve this, I added a view that looks like a dialog (using CardView) to the view of the underlying fragment. When the "dialog" needs to be shown, I simply set the visibility to View.VISIBLE and when it needs to be hidden I set it to View.GONE. This enables the view that you are dragging to remain part of the same context as the fragment and it won't be destroyed when the "dialog" is hidden.

Ad
source: stackoverflow.com
Ad