ডায়ালগের বাইরে ক্লিক করে কীভাবে ডায়ালগটি খারিজ করবেন?


156

আমি আমার অ্যাপ্লিকেশনটির জন্য একটি কাস্টম সংলাপ প্রয়োগ করেছি। আমি এটি প্রয়োগ করতে চাই যখন ব্যবহারকারী ডায়ালগের বাইরে ক্লিক করেন, ডায়ালগটি বাতিল হয়ে যাবে। এর জন্য আমার কী করতে হবে?

উত্তর:


356

আপনি dialog.setCanceledOnTouchOutside(true);যদি ডায়ালগের বাইরে স্পর্শ করেন তবে ডায়ালগটি বন্ধ করবে এমনটি আপনি ব্যবহার করতে পারেন ।

কিছুটা এইরকম,

  Dialog dialog = new Dialog(context)
  dialog.setCanceledOnTouchOutside(true);

অথবা যদি আপনার ডায়লগটি নন-মডেল করে থাকে তবে,

1 - FLAG_NOT_TOUCH_MODALআপনার ডায়ালগের উইন্ডো বৈশিষ্ট্যের জন্য পতাকাটি সেট করুন

Window window = this.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);

2 - উইন্ডোজের বৈশিষ্ট্যে অন্য পতাকা যুক্ত করুন, FLAG_WATCH_OUTSIDE_TOUCH- - এটির দৃশ্যমান অঞ্চলের বাইরে স্পর্শ ইভেন্ট পাওয়ার জন্য এটি একটি ডায়ালগের জন্য।

3 - onTouchEvent()সংলাপের ওভাররাইড এবং ক্রিয়া প্রকারের জন্য পরীক্ষা করুন। যদি অ্যাকশন ধরণের ' MotionEvent.ACTION_OUTSIDE' এর অর্থ হয়, ব্যবহারকারী ডায়ালগ অঞ্চলের বাইরে ইন্টারঅ্যাক্ট করছে। সুতরাং এই ক্ষেত্রে, আপনি আপনার কথোপকথনটি হ্রাস করতে পারেন বা আপনি কী করতে চান তা সিদ্ধান্ত নিতে পারেন। প্লেইনপ্রিন্ট দেখুন?

public boolean onTouchEvent(MotionEvent event)  
{  

       if(event.getAction() == MotionEvent.ACTION_OUTSIDE){  
        System.out.println("TOuch outside the dialog ******************** ");  
               this.dismiss();  
       }  
       return false;  
}  

আরও তথ্যের জন্য কীভাবে টাচ পয়েন্টের উপর ভিত্তি করে একটি কাস্টম ডায়ালগ খারিজ করবেন? এবং আপনার অ-মডেল ডায়ালগটিকে কীভাবে খারিজ করবেন, যখন বাইরের ডায়ালগের অঞ্চলে স্পর্শ করা হয়


9
নীচের ক্রিয়াকলাপটি টাচ ইভেন্টেও প্রতিক্রিয়া ব্যতীত এটি দুর্দান্ত কাজ করে। এটি রোধ করার কোনও উপায় আছে?
howettl

হ্যাঁ। উইন্ডো.সেটফ্লেগস (উইন্ডো ম্যানেজ। লেআউটপ্যারামস.ফ্ল্যাজ_নোT_TOUCH_MODAL, উইন্ডো ম্যানেজ। লেআউটপ্যারামস.এফএলএজি_নোT_TOUCH_MODAL); এই সমস্যা কারণ। আমি নীচে একটি সমাধান পোস্ট করেছি :)
অজানা

একটি অন-কাস্টম ডায়ালগ ব্যবহার করে নীচের ক্রিয়াকলাপে 'অন-টাচ-বাইরের' ইভেন্টগুলি প্রচার করা কি সম্ভব?
জেসি

1
@ হোয়েটল আমি আমার সমস্যার সমাধান করেছি যা আমি নীচে পোস্ট করেছি যেখানে আমার উইন্ডোতে কোনও পতাকা লাগানোর দরকার নেই।
রোমান নাজারেভিচ

@ মুহম্মেদরাফাত - দয়া করে এই থ্রেড গ্রুপগুলি দেখুন google.com/forum/#!topic/android-developers/ ভাইআইআইএম 66 ডব্লিউ । তারা সুন্দরভাবে এটি বর্ণনা করেছেন।
ব্যবহারকারী370305


16

আপনি অন টাচ এভেন্টের এই প্রয়োগটি ব্যবহার করতে পারেন। এটি টাচ ইভেন্টে ক্রিয়াকলাপের নীচে প্রতিক্রিয়া দেওয়া থেকে বাধা দেয় (যেমন হুয়েটল উল্লিখিত হয়েছে)।

@Override
public boolean onTouchEvent ( MotionEvent event ) {
  // I only care if the event is an UP action
  if ( event.getAction () == MotionEvent.ACTION_UP ) {
    // create a rect for storing the window rect
    Rect r = new Rect ( 0, 0, 0, 0 );
    // retrieve the windows rect
    this.getWindow ().getDecorView ().getHitRect ( r );
    // check if the event position is inside the window rect
    boolean intersects = r.contains ( (int) event.getX (), (int) event.getY () );
    // if the event is not inside then we can close the activity
    if ( !intersects ) {
      // close the activity
      this.finish ();
      // notify that we consumed this event
      return true;
    }
  }
  // let the system handle the event
  return super.onTouchEvent ( event );
}

সূত্র: http://blog.twimager.com/2010/08/closing-activity-by-touching-outside.html


9

অথবা, আপনি যদি আপনার স্টাইলের এক্সএমএল সংজ্ঞায়িত কোনও থিম ব্যবহার করে কথোপকথনটি কাস্টমাইজ করছেন তবে এই থিমটিতে এই লাইনটি রাখুন:

<item name="android:windowCloseOnTouchOutside">true</item>

এটি আমার জন্য স্যামসাং গ্যালাক্সি ট্যাব 2 ওয়াইফাইতে কাজ করে না। dialog.setCanceledOnTouchOutside(true);আশ্চর্যজনকভাবে কাজ করে।
ডপলমি

7
dialog.setCanceledOnTouchOutside(true); 

বাইরে স্পর্শে ডায়ালগ বন্ধ করতে।

এবং যদি আপনি বাইরে স্পর্শ বন্ধ করতে না চান তবে নীচের কোডটি ব্যবহার করুন:

dialog.setCanceledOnTouchOutside(false);

6

এই পদ্ধতির ধূসর অঞ্চলের নীচের ক্রিয়াকলাপগুলি ক্লিক ইভেন্টগুলি পুনরুদ্ধার করা সম্পূর্ণভাবে এড়ানো উচিত।

আপনার যদি এই লাইনটি থাকে তবে এটি সরান :

window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);

আপনার তৈরি করা ক্রিয়াকলাপ এ রাখুন

getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);

তারপরে এটির সাথে স্পর্শ ইভেন্টটিকে ওভাররাইড করুন

@Override
public boolean onTouchEvent(MotionEvent ev)
{
    if(MotionEvent.ACTION_DOWN == ev.getAction())
    {
        Rect dialogBounds = new Rect();
        getWindow().getDecorView().getHitRect(dialogBounds);
        if (!dialogBounds.contains((int) ev.getX(), (int) ev.getY())) {
            // You have clicked the grey area
            displayYourDialog();
            return false; // stop activity closing
        }
    }

    // Touch events inside are fine.
    return super.onTouchEvent(ev);
}

4

আপনি এটি চেষ্টা করতে পারেন: -

AlterDialog alterdialog;
alertDialog.setCanceledOnTouchOutside(true);

অথবা

alertDialog.setCancelable(true);

এবং যদি আপনার একটি থাকে তবে আপনি AlterDialog.Builderএটি চেষ্টা করতে পারেন: -

alertDialogBuilder.setCancelable(true);

4

এই কোডটি যখন ডায়ালগবক্সে সেই সময় হাইডসফটিনপুট ক্লিক করুন এবং ব্যবহারকারীরা যখন ডায়ালগবক্সের বাইরের দিকে ক্লিক করেন তখন সফটিনপুট এবং ডায়ালগবক্স উভয়ই কাছে থাকে for

dialog = new Dialog(act) {
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Tap anywhere to close dialog.
        Rect dialogBounds = new Rect();
        getWindow().getDecorView().getHitRect(dialogBounds);
        if (!dialogBounds.contains((int) event.getX(),
                (int) event.getY())) {
            // You have clicked the grey area
            InputMethodManager inputMethodManager = (InputMethodManager) act
                    .getSystemService(act.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(dialog
                    .getCurrentFocus().getWindowToken(), 0);
            dialog.dismiss();
            // stop activity closing
        } else {
            InputMethodManager inputMethodManager = (InputMethodManager) act
                    .getSystemService(act.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(dialog
                    .getCurrentFocus().getWindowToken(), 0);
        }

        return true;
    }
};

2

আর একটি সমাধান, এই কোডটি অ্যান্ড্রয়েড উত্স কোড থেকে নেওয়া হয়েছিল Window আপনার ডায়ালগ উত্স কোডে এই দুটি পদ্ধতি যুক্ত করা উচিত।

@Override
public boolean onTouchEvent(MotionEvent event) {        
    if (isShowing() && (event.getAction() == MotionEvent.ACTION_DOWN
            && isOutOfBounds(getContext(), event) && getWindow().peekDecorView() != null)) {
        hide();
    }
    return false;
}

private boolean isOutOfBounds(Context context, MotionEvent event) {
    final int x = (int) event.getX();
    final int y = (int) event.getY();
    final int slop = ViewConfiguration.get(context).getScaledWindowTouchSlop();
    final View decorView = getWindow().getDecorView();
    return (x < -slop) || (y < -slop)
            || (x > (decorView.getWidth()+slop))
            || (y > (decorView.getHeight()+slop));
}

এই সমাধানটিতে এই সমস্যা নেই:

নীচের ক্রিয়াকলাপটি টাচ ইভেন্টেও প্রতিক্রিয়া ব্যতীত এটি দুর্দান্ত কাজ করে। এটি রোধ করার কোনও উপায় আছে? - howettl


আপনি যদি অন্য উইন্ডোজ পুনরুদ্ধার ইভেন্টগুলি না চান তবে আপনি কি কেবল আপনার ডায়লগটিকে স্পর্শ করে তুলতে পারবেন?

1

dialog.setCancelable(false);আপনার ক্রিয়াকলাপ / খণ্ড থেকে কল করুন ।



0

আপনি backgroundসমস্ত পর্দার আকার দখল করতে transparentপারেন এবং এটি onClickইভেন্টটি শুনতে পারেন dismiss


10
খুব খারাপ উত্তর! অবশ্যই এটি করা যেতে পারে, তবে দয়া করে এটি সঠিক উপায়ে করুন!
জেসি

-1

কোডটি এখানে

    dialog.getWindow().getDecorView().setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent ev) {

            if(MotionEvent.ACTION_DOWN == ev.getAction())
            {
                Rect dialogBounds = new Rect();
                dialog. getWindow().getDecorView().getHitRect(dialogBounds);
                if (!dialogBounds.contains((int) ev.getX(), (int) ev.getY())) {
                    // You have clicked the grey area
                    UiUtils.hideKeyboard2(getActivity());
                    return false; // stop activity closing
                }
            }
            getActivity().dispatchTouchEvent(ev);
            return false;
        }
    });

আর একবার চেষ্টা কর . আপনি বাইরে স্পর্শ করলে আপনি কীবোর্ডটি আড়াল করতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.