Проблема с перетаскиванием изображения из диалога в действие - PullRequest
0 голосов
/ 24 февраля 2019

Я продолжаю получать NullPointerException. Я не могу получить изображение из моего диалогового фрагмента в мою основную деятельность.Элемент из диалогового окна перетаскивается в основное действие.Но когда я уронил изображение, приложение зависает, потому что оно не получает изображение, которое я перетащил.Итак, как перенести изображение из моего диалога в мою основную деятельность?Пожалуйста, помогите мне решить эту проблему.

Основная деятельность

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

Фрагмент диалога

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

}

Спасибо взаранее

1 Ответ

0 голосов
/ 25 февраля 2019

Я не смог найти способ сделать это с помощью DialogFragment, поэтому я нашел обходной путь.Проблема с DialogFragments заключается в том, что представление закрывается, когда диалоговое окно закрывается, следовательно, NPE, который вы испытывали.Чтобы решить эту проблему, я добавил представление, которое выглядит как диалог (с помощью CardView) к представлению основного фрагмента.Когда нужно показать «диалог», я просто устанавливаю видимость на View.VISIBLE, а когда его нужно скрыть, я устанавливаю его на View.GONE.Это позволяет представлению, которое вы перетаскиваете, оставаться частью того же контекста, что и фрагмент, и оно не будет уничтожено, когда «диалог» скрыт.

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