বাইরের স্পর্শ বন্ধ হওয়া থেকে অ্যান্ড্রয়েড ক্রিয়াকলাপের কথোপকথনটি রোধ করুন


228

আমার একটি ক্রিয়াকলাপ রয়েছে যা থিম ব্যবহার করে। তবে, আমি যখন ডায়লগ উইন্ডোটির (পটভূমির ক্রিয়াকলাপের) বাইরে ক্লিক করি তখন ডায়ালগটি বন্ধ হয়ে যায়। আমি কীভাবে এই আচরণ বন্ধ করতে পারি?


1
আপনি কেন এই বিটিডব্লিউ করবেন? আপনি যদি চান এমন আচরণ যদি কোনও ডায়ালগের হয় তবে ডায়লগটি ব্যবহার করবেন না কেন? আপনার প্রশ্নে আসছে, আমি মনে করি না যে এর কোনও সমাধান আছে।
কুমার বিবেক

লেআউট কাস্টমাইজেশনের ক্ষেত্রে কুমারবিবেকের কথোপকথনগুলি সীমাবদ্ধ রয়েছে ... এজন্য একটি ক্রিয়াকলাপ। এমনকি বিকাশকারী দস্তাবেজগুলি নমনীয় কাস্টমাইজেশনের জন্য এই পদ্ধতির প্রস্তাব দেয়
লিও

1
ওপি যা চায় তা হ'ল মডেল ডায়ালগ, অর্থাত্ একটি ডায়ালগ যা ব্যবহারকারীকে প্রতিক্রিয়া জানাতে বাধ্য করে, যেমন ঠিক আছে, বা হ্যাঁ / না। ব্যবহারকারীর শুধু ক্লিক ক্লিক করতে সক্ষম হবে না।
স্কট বিগস

উত্তর:


33

এটি আপনাকে সাহায্য করতে পারে। এটি বাইরের ইভেন্টের স্পর্শটি পরিচালনা করার একটি উপায়:

ক্রিয়াকলাপের মতো থিমযুক্ত ডায়ালগ কীভাবে বাতিল করবেন যখন উইন্ডোর বাইরে স্পর্শ করা হয়?

ইভেন্টটি ধরা এবং কিছুই না করে, আমি মনে করি আপনি বন্ধ হওয়াটি আটকাতে পারবেন। তবে যেটি আশ্চর্যজনক তা হল, আপনার কার্যকলাপের কথোপকথনের ডিফল্ট আচরণটি আপনাকে বাইরে স্পর্শ করার সময় নিজেকে বন্ধ না করা উচিত ।

(পিএস: কোডটি উইন্ডো ম্যানেজ.লয়আউটপ্যারাম ব্যবহার করে)


1
বস্তুটি যদিও কোনও ডায়ালগ নয়, এটি একটি ক্রিয়াকলাপ যা ডায়ালগ শৈলী ব্যবহার করে। ক্রিয়াকলাপে এই পদ্ধতি নেই এবং ডায়ালগে কাস্ট করা যাবে না।
ফার্গুস্মাক

আপনার পোস্টটি যা জিজ্ঞাসা করা হয়েছিল তার সম্পূর্ণ বিপরীত। তিনি জিজ্ঞাসা করলেন কীভাবে বন্ধ হওয়া বন্ধ করবেন কীভাবে এটির কারণ হয় না।
চককেলি

4
"ইভেন্টটি ধরা দিয়ে এবং কিছুই না করে," তিনি মনে করেন যে আপনি সমাপনটি আটকাতে পারবেন "দিয়ে তিনি যা ব্যাখ্যা করেছিলেন।
মেটারে

4
কোনও কারণে পুরো FLAG_NOT_MODAL, WATCH_OUTSIDE_TOUCH করার পরে, বাইরের স্পর্শে এটি কার্যকলাপগুলি বন্ধ করে দেয় না, তবে ক্রিয়াকলাপের পিছনে বোতামটি ক্লিক করা হয়। এর জন্য কোন ধারণা?
njzk2

নোট করুন যে ডায়ালগগুলির একটি ছায়া রয়েছে (কমপক্ষে এখন অবধি (8.0)): আপনি যদি ছায়ায় ক্লিক করেন তবে অ্যান্ড্রয়েড সেই ক্লিকটির ব্যাখ্যা করবে ঠিক যেমন ডায়ালগের অভ্যন্তরে ছিল। এটি কেবল বিশ্বের সাথে ভাগ করে নিতে চেয়েছিলেন, এটি পেতে আমার 10 মিনিট সময় লেগেছে।
লোরেঞ্জো ভন ম্যাটারহর্ন

458

ডায়লগ বক্সটি পিছনে কী চাপলে তা খারিজ করা থেকে বিরত রাখতে এটি ব্যবহার করুন

dialog.setCancelable(false);

এবং ডায়ালগ বাক্সটি বাইরের স্পর্শে বরখাস্ত হওয়া থেকে বিরত রাখতে এটি ব্যবহার করুন

 dialog.setCanceledOnTouchOutside(false);

4
এই উত্তরটি সহায়ক তবে এই প্রশ্নটি থিম.ডায়ালগ বৈশিষ্ট্যটি ব্যবহার করে ক্রিয়াকলাপ সম্পর্কে।
পরেশ মায়ানী

15
আমি জানি যখন আমি বুঝতে পারি যে এটি অনেক দেরি হয়ে গেছে যেহেতু এটি অনেক লোককে সহায়তা করে তাই এটি মুছে ফেলেনি।
সিংহক

12
আমি জানি এটি আসলে প্রশ্নের সাথে সম্পর্কিত নয়, তবে এটি আমাকে সাহায্য করেছিল। ধন্যবাদ!
ডেনিসড্রু

5
এটি সেরা উত্তর। আমার সন্দেহ হয় যে এই প্রশ্নটি খুঁজে পাওয়া বেশিরভাগ লোকেরা এই স্ট্যান্ডার্ডটি AlertDialogবাইরের স্পর্শে বন্ধ হওয়া থেকে বাঁচার জন্য একটি উপায় সন্ধান করছেন এবং এটিই এই উত্তরটি সরবরাহ করে।
আরথ

20
সতর্কতা ডায়ালগের নতুন সংস্করণগুলিতে, আপনাকে কেবল ব্যবহার করতে হবেsetCancelable(false)
কোবি টেট

120

আপনার আসলে যা আছে তা হ'ল একটি ক্রিয়াকলাপ (এটি ডায়ালগের মতো দেখায়) তবে অতএব setFinishOnTouchOutside(false)ব্যাকগ্রাউন্ড ক্রিয়াকলাপটি ক্লিক করার সময় আপনি যদি এটি খোলার রাখতে চান তবে আপনার কার্যকলাপ থেকে কল করা উচিত call

সম্পাদনা: এটি কেবল অ্যান্ড্রয়েড এপিআই স্তর 11 বা ততোধিকের সাথে কাজ করে


4
এটি আপনাকে আপনার ক্রিয়াকলাপের "পিছনে" বোতাম টিপতে বাধা দেয় না। সুতরাং আপনার onBackPressed()নিজের দেহে কিছু না করাও ওভাররাইড করতে হবে
অ্যালেক্স বোনেল

এটি অনব্যাকপ্রেসড () ব্যতীত ক্রিয়াকলাপের ক্রিয়াকলাপের "পিছনে" বোতামটি আটকাচ্ছে না। This.setFinishOnTouchOutside (মিথ্যা) দিয়ে নিখুঁত কাজ করে।
কুনালজিগস্যাগ্যাগ

68

আমার জন্য যা কাজ করেছিল তা ছিল এটি বাতিল হওয়ার জন্য DialogFragmentএকটি সেট তৈরি করা:

dialog.setCancelable(false);

1
সহায়ক নয়. এই প্রশ্নটি ডায়ালগ নয়, ক্রিয়াকলাপ সম্পর্কে।
স্কট বিগস

20

অনক্রিটে ক্রিয়াকলাপ হিসাবে ডায়ালগটি ব্যবহার করার সময় এটি যুক্ত করুন

setFinishOnTouchOutside(false);

17

উচ্চতর এপিআই 10 এর জন্য, বাইরে স্পর্শ করার সময় ডায়ালগটি অদৃশ্য হয়ে যায়, যখন এপিআই 11 এর চেয়ে কম ডায়ালগটি অদৃশ্য হয় না। এটি প্রতিরোধের জন্য, আপনার এটি করা দরকার:

ইন styles.xml:<item name="android:windowCloseOnTouchOutside">false</item>

অথবা

ইন onCreate()পদ্ধতি, ব্যবহার করুন:this.setFinishOnTouchOutside(false);

দ্রষ্টব্য: এপিআই 10 এবং নিম্নের জন্য, এই পদ্ধতির কোনও প্রভাব নেই এবং এটি প্রয়োজনও নয়।


14

কথোপকথনটিকে বাতিল হতে বাতিল হিসাবে সেট করা যথেষ্ট, এবং হয় আপনি সতর্কতা ডায়ালগের বাইরে স্পর্শ করেন বা পিছনে বোতামটি ক্লিক করলে সতর্কতা ডায়ালগটি অদৃশ্য হয়ে যাবে। সুতরাং এটি ব্যবহার করুন:

setCancelable(false)

এবং অন্যান্য ফাংশন আর প্রয়োজন হয় না: dialog.setCanceledOnTouchOutside(false);

আপনি যদি একটি অস্থায়ী ডায়লগ তৈরি করে থাকেন এবং কোডের এই লাইনটি রাখার জন্য সেখানে ভাবছেন, এখানে একটি উদাহরণ রয়েছে:

new AlertDialog.Builder(this)
                        .setTitle("Trial Version")
                        .setCancelable(false)
                        .setMessage("You are using trial version!")
                        .setIcon(R.drawable.time_left)
                        .setPositiveButton(android.R.string.yes, null).show();

12

এটি আমার জন্য কার্যকর এই কোডটি ব্যবহার করুন

 AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
 alertDialog.setCancelable(false);


এটি সঠিক উত্তর হওয়া উচিত, তিনি যদি সঠিক প্রশ্নটি করতে পারতেন!
অ্যালিজুনিয়ার

2
এই সঠিক উত্তর হবে যদি ওপি সম্পর্কে জিজ্ঞাসা ছিল ডায়ালগ ! তবে প্রশ্নটি ক্রিয়াকলাপ সম্পর্কে - বেশ অন্যরকম একটি মামলা।
স্কট বিগস

11
Dialog dialog = new Dialog(context)
dialog.setCanceledOnTouchOutside(true); 
//use this to dismiss the dialog on outside click of dialog

dialog.setCanceledOnTouchOutside(false);
//use this for not to dismiss the dialog on outside click of dialog.

সংলাপ সম্পর্কে আরও তথ্যের জন্য এই লিঙ্কটি দেখুন

dialog.setCancelable(false);
//used to prevent the dismiss of dialog on backpress of that activity

dialog.setCancelable(true);
//used to dismiss the dialog on onbackpressed of that activity

দয়া করে নোট করুন যে প্রশ্নটি ডায়ালগ ক্লাস নয়, ডায়ালগ হিসাবে ব্যবহৃত ক্রিয়াকলাপ সম্পর্কিত।
স্কট বিগস

8

কেবল,

alertDialog.setCancelable(false);

ডায়ালগ বক্সের বাইরের ক্লিক থেকে ব্যবহারকারীদের বাধা দিন।


6

সতর্কতা ডায়ালগ হ্রাস করা হয়েছে তাই ডায়ালগ ডায়ালগটি = নতুন ডায়ালগ (এটি) ব্যবহার করুন;

বাইরের স্পর্শ বন্ধ রোধ করার জন্য

dialog.setCanceledOnTouchOutside(false);

5

setFinishOnTouchOutside(false)API> 11 এর জন্য ব্যবহার করুন এবং চিন্তা করবেন না কারণ তার অ্যান্ড্রয়েডের ডিফল্ট আচরণ যা ক্রিয়াকলাপযুক্ত থিমযুক্ত ডায়ালগ এপিআই <11 :) এর জন্য বাইরের স্পর্শে শেষ হবে না! চিয়ার্স !!


5

আমি এটি অনক্রিয়েটে () ব্যবহার করি, মনে হয় অ্যান্ড্রয়েডের যে কোনও সংস্করণে কাজ করে; 5.0 এবং 4.4.x এ পরীক্ষা করা হয়েছে, জিঞ্জারব্রেডে পরীক্ষা করতে পারবেন না, স্যামসাং ডিভাইসগুলি (নোট 1 চলমান জিবি) ডিফল্টরূপে এটি রয়েছে:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
    {
        setFinishOnTouchOutside(false);
    }
    else
    {
        getWindow().clearFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
    }

    super.onCreate(savedInstanceState);

4
        alert.setCancelable(false);
        alert.setCanceledOnTouchOutside(false);

আমার ধারণা এটি আপনাকে সাহায্য করবে t এটি আমার জন্য কাজ করেছে


1
কেন এটি কাজ করবে তা বোঝানোর চেষ্টা করুন ... কেবল একটি কোড ডাম্প একটি ভাল উত্তর নয়।
কোডবেন্ডার


2

ক্যান্সেললিস্টনার প্রয়োগকারীকে বিভিন্ন ক্রিয়া বরাদ্দ করাও সম্ভব:

alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){                   
    @Override
    public void onCancel(DialogInterface dialogInterface) {
        //Your custom logic
    } 
});

সতর্কতা ডায়ালগের বাইরে আলতো চাপার কারণে বাতিলটিকে ডেকে আনা হলে কীভাবে চিহ্নিত করব?
শেগপ্রকাশ

একটি সতর্কতা ডায়ালগের বাইরে আলতো চাপতে কাস্টম ক্রিয়া তৈরি করতে খুব সহায়ক!
অ্যাডাম এস

1

আমিও একই সমস্যায় পড়ছিলাম। এটি পরিচালনা করতে আমি OntouchListenerডায়ালগটিতে একটি সেট করেছিলাম এবং ভিতরে কিছুই করি না। স্ক্রিনটি খুব ঘোরার সময় ডায়ালগ বরখাস্ত। এটি ঠিক করার জন্য আমি ডায়ালগটি সাধারণত খারিজ হয়ে যায় কিনা তা বলার জন্য আমি একটি ভেরিয়েবল সেট করেছিলাম। তারপরে আমি OnDismissListenerআমার ডায়ালগটিতে একটি সেট করেছিলাম এবং এর ভিতরে আমি ভেরিয়েবলটি পরীক্ষা করি। ডায়ালগটি যদি স্বাভাবিকভাবে বিচ্ছিন্ন হয়ে থাকে তবে আমি কিছুই করি না, না হলে আমি আবার ডায়ালগটি চালাচ্ছি (এবং তার অবস্থার বিষয়টি আমার ক্ষেত্রে বরখাস্ত করার সময় নির্ধারণ করছি)।


1

builder.setCancelable (মিথ্যা);


পাবলিক অকার্যকর মেনাজে (দেখুন ভি) {

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("¿Quieres ir a el Menú principal?");
    builder.setMessage("Al presionar SI iras a el menú y saldras de la materia.");
    builder.setPositiveButton("SI", null);
    builder.setNegativeButton("NO", null);
    builder.setCancelable(false);
    builder.show();
}

1
হাই অ্যালেক্স. স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম এবং আপনার উত্তরের জন্য আপনাকে ধন্যবাদ। আপনার কোডটি কী করে এবং এটি কীভাবে ওপিটির সমস্যা সমাধান করে তা বর্ণনা করতে আপনি দয়া করে নিজের উত্তরটি সম্পাদনা করতে পারেন? কোডগুলি কেবল উত্তরগুলি হতাশ করে কারণ তারা কেন এটি শেখায় না বা ব্যাখ্যা দেয় না । ধন্যবাদ!
টিম ম্যালোন

-1

এটি আপনার সমস্ত প্রশ্নের সঠিক উত্তর .... আশা করি আপনি অ্যান্ড্রয়েডে কোডিং উপভোগ করবেন

new AlertDialog.Builder(this)
            .setTitle("Akshat Rastogi Is Great")
            .setCancelable(false)
            .setMessage("I am the best Android Programmer")
            .setPositiveButton("I agree", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();

                }
            })
            .create().show();

এই কোড স্নিপেটের জন্য আপনাকে ধন্যবাদ, যা কিছু সীমিত, তাত্ক্ষণিক সহায়তা সরবরাহ করতে পারে। একটি সঠিক ব্যাখ্যা কেন এটি সমস্যার একটি ভাল সমাধান এবং এটি ভবিষ্যতে পাঠকদের আরও অন্যান্য অনুরূপ প্রশ্নের সাথে আরও দরকারী করে তুলে ধরে তার দীর্ঘমেয়াদী মানকে ব্যাপকভাবে উন্নত করবে। আপনার অনুমানগুলি সহ কিছু ব্যাখ্যা যুক্ত করতে দয়া করে আপনার উত্তরটি সম্পাদনা করুন।
ম্যাক্সিমিলিয়ান পিটারস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.