ডায়লগটিতে কীভাবে ব্যাক হ্যান্ডেল করবেন?


96

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

এটা ভাল কাজ করে।

যখন ব্যবহারকারী পিছনের বোতামটি টিপায়, আমি নীচে এটি পরিচালনা করছি

public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if ((keyCode == KeyEvent.KEYCODE_BACK)) 
    {

    }
 return super.onKeyDown(keyCode, event);
}

তবে উপরের পদ্ধতিটি বলা হয় না। আমি কীভাবে এটি পরিচালনা করতে পারি?


4
আপনি কি চান যে ব্যবহারকারী ডায়ালগটি বাতিল করতে সক্ষম হন? বা আপনার অনকিডাউন অংশটি কী করে?
ক্রুয়েজার

@ কিরান :: আপনি কি আরও কিছুটা পরিষ্কার হতে পারবেন ??
কেএমআই

উত্তর:


241
dialog.setOnKeyListener(new Dialog.OnKeyListener() {

            @Override
            public boolean onKey(DialogInterface arg0, int keyCode,
                    KeyEvent event) {
                // TODO Auto-generated method stub
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                    finish();
                    dialog.dismiss();
                }
                return true;
            }
        });

8
বরখাস্ত করার দরকার নেই Dialog; finish()ইতিমধ্যে এটি যত্ন নেয়। এছাড়াও, এই পদ্ধতির false
প্রবাদটি

6
আমি মনে করি নীচে অ্যালেক্সের উত্তরটি আরও ভাল বিকল্প।
সাইমন ফোরসবার্গ

23
আমি && event.getAction() == KeyEvent.ACTION_UPউত্তরে যুক্ত করেছি। এটি ছাড়া কোড কোডটি দু'বার কার্যকর করা হবে। (কী নীচে এবং কী আপ)। এই উদাহরণে এটি এত গুরুত্বপূর্ণ নয়, তবে সমাপ্তি () সমেত অন্যান্য ক্রিয়াকলাপের জন্য এটি খুব গুরুত্বপূর্ণ হতে পারে।
উদো ক্লিমাশেউস্কি

4
@ ডিএমএমএইচ না করলে আপনি dialog.dismiss()একটি মেমরি ফাঁস পাবেন।
পেড্রো লোবিটো

4
আমি নিশ্চিত যে আপনি ঠিক আছেন, তবে সেই ক্ষেত্রে finish()এবং dialog.dismiss()উপরের কোডটিতে স্যুইচ করা উচিত।
slinden77

115

আপনি ডায়লগটি তৈরি করার সময় অনক্যান্সেললিস্টনার সেট করতে চান এমন মনে হচ্ছে। দেখে মনে হচ্ছে:

dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {         
    @Override
    public void onCancel(DialogInterface dialog) {
        //do whatever you want the back key to do
    }
});

7
এটি অবশ্যই সেরা উত্তর। সুন্দর এবং সহজ। কী-আবিষ্কার সনাক্ত করার দরকার নেই। পারফেক্ট
বৃহত্তর চশমা

4
আমি জানি আমি অনেক দেরি করে ফেলেছি, তবে কিছু একটা করার জন্য ভেবেছিলাম। ব্যবহারকারী অতিরিক্তভাবে ডায়ালগের বাইরে কোথাও ক্লিক করলে এটি তাত্পর্যপূর্ণ হয়ে উঠবে। সুতরাং আপনার যদি কেবল পিছনের প্রেস বিকল্পটি ওভাররাইড করতে হয় তবে আপনি যা খুঁজছেন তা এটি নয়।
ব্যবহারকারী 2520215

5
@ ব্যবহারকারী 2520215 যদি আপনি এটিটি ট্রিগার করতে না চান যখন ব্যবহারকারী ডায়ালগের বাইরে ক্লিক করেন, আপনার ডায়ালগ সেট করা উচিত set এটি অবশ্যই ভাল উত্তর।
আলহসান আবদুলকাদির

নির্দেশ করার জন্য ধন্যবাদ। এটি অবশ্যই একটি ভাল পদ্ধতির হয়।
ব্যবহারকারী 2520215

4
কী শ্রোতা যদি সেই ক্ষেত্রে কাজ করে তবে কোনও কাস্টম ভিউ ব্যবহার করা হয় না (যেমন ডায়ালগ তৈরি না করে কেবল ডায়ালগফ্র্যাগমেন্ট থেকে উত্তরাধিকারী) ব্যবহার করা হয় বলে মনে হয়।
জুলিয়ান হনমা

19

আপনার OnCancelপদ্ধতিটি ওভাররাইড করতে হবে । এই পদ্ধতিটি ব্যাক কী প্রেসগুলিতে কল করে। এখানে কোডটি আমার পক্ষে নিখুঁতভাবে কাজ করে।

 AlertDialog alertDialog;

    alertDialog.setOnCancelListener(new OnCancelListener() 
    {                   
           @Override
            public void onCancel(DialogInterface dialog) 
             {
               // TODO Auto-generated method stub

                    dialog.dismiss();                           

            }
}); 

আশা করি এটি আপনাকে সহায়তা করবে, এবং এটি আপনার পক্ষে সহায়ক হলে এটি গ্রহণ করবে।

ধন্যবাদ ..


7

এটা চেষ্টা কর

 new AlertDialog.Builder(this).setOnKeyListener(new DialogInterface.OnKeyListener() {

                        @Override
                        public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {

                            if(keyCode == KeyEvent.KEYCODE_BACK){
                                Logger.d(TAG, "--------- Do Something -----------");
                                return true;
                            }
                            return false;


                        }
                    })

4
কেন আমি বিল্ডারে সেটঅনস্যান্সেললিস্টনার ব্যবহার করতে পারি না?
ffleandro

3

আপনি যদি কোনও ডায়ালগফ্রেগমেন্ট ব্যবহার করছেন তবে আমি যা করতে সঠিক উপায়টি বলতে পারি তা হ'ল অন্যাসেল ওভাররাইড করা

আমি লক্ষ্য করেছি setOnCancelListenerযে কাজ করে না, এবং setOnKeyListenerকাজ করে না , তবে আমার জন্য মজাদার পার্শ্ব প্রতিক্রিয়া রয়েছে যে আপনার ডায়ালগটিতে সম্পাদনার পাঠ্য থাকলে এটি সমস্ত কী গ্রাস করে।


1

কারণ আপনার ডায়ালগটি যখন খোলে তখন আপনার উইন্ডোটি ডায়ালগের দিকে দৃষ্টি নিবদ্ধ করে nav সুতরাং এখন আপনাকে keyআপনার ডায়ালগটি পরিচালনা করতে হবে ।


যদিও সঠিক, keyডায়ালগটিতে কীভাবে পরিচালনা করতে হবে সে সম্পর্কে এই উত্তরটি খুব তথ্যবহুল নয় ।
সাইমন ফারসবার্গ

1

onBackPressed()আপনার নিজের কথোপকথনে পদ্ধতিটিকে ওভাররাইড করুন এবং এটি আপনার কোডটিতে ব্যবহার করুন:

public class MyDialog extends Dialog {

    public MyDialog(@NonNull Context context) {
        super(context);
    }

    @Override
    public void onBackPressed() {
        // Do what you want
    }
}

ব্যবহার:

MyDialog dlg = new MyDialog(context);
dlg.show();

0

এই কোডটি কাজ করে:

    Dialog dlg = new Dialog(thisAct, R.style.DialogTheme);
    dlg.setContentView(view);
    dlg.setCancelable(false);
    dlg.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
    dlg.setOnKeyListener((arg0, keyCode, event) -> {
        Timber.d("onKey(%d)", keyCode);
        //{home intercepting
        if ((keyCode == KeyEvent.KEYCODE_HOME)) {
            Timber.i("HOME pressed");
            return true;
        }

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