কোনও বোতাম ক্লিক করা হলে কীভাবে ডায়ালগ বন্ধ হতে বাধা দেওয়া যায়


730

EditTextইনপুট জন্য আমার একটি সংলাপ আছে । আমি যখন ডায়লগের "হ্যাঁ" বোতামটি ক্লিক করি, এটি ইনপুটটিকে বৈধতা দেবে এবং তারপরে ডায়ালগটি বন্ধ করে দেবে। তবে ইনপুটটি ভুল হলে আমি একই সংলাপে থাকতে চাই। প্রতিবার ইনপুট কী তা বিবেচনা না করেই, "আমি" বোতামটি টিপলে ডায়ালগটি স্বয়ংক্রিয়ভাবে বন্ধ হওয়া উচিত। আমি কীভাবে এটি অক্ষম করতে পারি? যাইহোক, আমি ডায়ালগের বোতামের জন্য পজিটিভ বাটন এবং নেতিবাচক বাটন ব্যবহার করেছি।

উত্তর:


915

সম্পাদনা: এটি কয়েকটি মন্তব্য দ্বারা উল্লিখিত হিসাবে শুধুমাত্র 8++ এ কাজ করে।

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

final AlertDialog dialog = new AlertDialog.Builder(context)
        .setView(v)
        .setTitle(R.string.my_title)
        .setPositiveButton(android.R.string.ok, null) //Set to null. We override the onclick
        .setNegativeButton(android.R.string.cancel, null)
        .create();

dialog.setOnShowListener(new DialogInterface.OnShowListener() {

    @Override
    public void onShow(DialogInterface dialogInterface) {

        Button button = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                // TODO Do something

                //Dismiss once everything is OK.
                dialog.dismiss();
            }
        });
    }
});
dialog.show();

7
আরে, আগের চেয়ে আরও দেরি করে আমি ঠিক এটির সন্ধান করছিলাম, ধন্যবাদ, +1 :) আপনার ডায়ালগটিতে বৈধতা যুক্ত করার এটি একটি দুর্দান্ত উপায়, বিশেষত যখন সতর্কতা মোকাবেলার জন্য আপনার কাছে ইতিমধ্যে কোনও সহায়ক মোড়কের ক্লাস থাকে
গুইলিউম

11
কাজ না। সতর্কতা ডায়ালগ.বিল্ডার.সেটঅনশোলিস্টনার উপস্থিত নেই। বিকাশকারী.অ্যান্ড্রয়েড.
com

4
এপিআই প্রাক 8 এর সাথে, আপনি d.getButton (সতর্কতা ডায়ালগ। BUTTON_POSITIVE) কল করতে পারেন; এটি সর্বজনীন পদ্ধতি হিসাবে, তবে আপনাকে এটিকে শো () বলতে হবে; জারি করা হয়েছে, অন্যথায় zou কেবল এ থেকে বাতিল হবে
হুরদা

13
আপনি ডায়ালগ নির্মাতাকে শূন্য অনক্লিকলিস্টিনার সেট করে এটি খাঁটি ক্লিনারও তৈরি করতে পারেন (খালি "সংরক্ষণ করুন" এটি "শ্রোতাকে ওভাররাইড করা হবে")।
স্টিভ হ্যালি

1
সতর্কতা ডায়ালগ অনক্রিটডায়ালগ (বান্ডেল সেভড ইনস্ট্যান্সস্টেট) পদ্ধতিতে তৈরি করা হয় তখন ডায়ালগফ্রেগমেন্টগুলির সাথেও সূক্ষ্ম কাজ করে।
খ্রিস্টান লিসনিগ

654

সতর্কতা ডায়ালগের জন্য সমাধান সহ সমস্ত ধরণের কথোপকথনের জন্য এখানে কিছু সমাধান রয়েছে u AlertDialog.Builder, ডায়ালগফ্রেগমেন্ট এবং ডায়ালগপ্রিফারেন্স ব্যবহার করে সতর্কতা ডায়ালগগুলির জন্য সমাধান রয়েছে।

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

দ্রষ্টব্য: বেস অ্যান্ড্রয়েড ক্লাসগুলির ডুডের নীচে ডায়লগ বন্ধ হওয়া কীভাবে কাজ করে এবং নীচের পদ্ধতিগুলি কেন বেছে নেওয়া হয় তার একটি উদাহরণ উদাহরণগুলির পরে অনুসরণ করে, যারা আরও বিশদ চান তাদের জন্য


সতর্কতা ডায়ালগ.বিল্ডার - শোয়ের পরে অবিলম্বে ডিফল্ট বোতাম হ্যান্ডলারটি পরিবর্তন করুন ()

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage("Test for preventing dialog close");
builder.setPositiveButton("Test", 
        new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                //Do nothing here because we override this button later to change the close behaviour. 
                //However, we still need this because on older versions of Android unless we 
                //pass a handler the button doesn't get instantiated
            }
        });
final AlertDialog dialog = builder.create();
dialog.show();
//Overriding the handler immediately after show is probably a better approach than OnShowListener as described below
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener()
      {            
          @Override
          public void onClick(View v)
          {
              Boolean wantToCloseDialog = false;
              //Do stuff, possibly set wantToCloseDialog to true then...
              if(wantToCloseDialog)
                  dialog.dismiss();
              //else dialog stays open. Make sure you have an obvious way to close the dialog especially if you set cancellable to false.
          }
      });

ডায়ালগফ্রেগমেন্ট - ওপেনরাইড অন রিসুম ()

@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setMessage("Test for preventing dialog close");
    builder.setPositiveButton("Test", 
        new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                //Do nothing here because we override this button later to change the close behaviour. 
                //However, we still need this because on older versions of Android unless we 
                //pass a handler the button doesn't get instantiated
            }
        });
    return builder.create();
}

//onStart() is where dialog.show() is actually called on 
//the underlying dialog, so we have to do it there or 
//later in the lifecycle.
//Doing it in onResume() makes sure that even if there is a config change 
//environment that skips onStart then the dialog will still be functioning
//properly after a rotation.
@Override
public void onResume()
{
    super.onResume();    
    final AlertDialog d = (AlertDialog)getDialog();
    if(d != null)
    {
        Button positiveButton = (Button) d.getButton(Dialog.BUTTON_POSITIVE);
        positiveButton.setOnClickListener(new View.OnClickListener()
                {
                    @Override
                    public void onClick(View v)
                    {
                        Boolean wantToCloseDialog = false;
                        //Do stuff, possibly set wantToCloseDialog to true then...
                        if(wantToCloseDialog)
                            d.dismiss();
                        //else dialog stays open. Make sure you have an obvious way to close the dialog especially if you set cancellable to false.
                    }
                });
    }
}

ডায়ালগপ্রিফারেন্স - ওভাররাইড শো ডায়ালগ ()

@Override
protected void onPrepareDialogBuilder(Builder builder)
{
    super.onPrepareDialogBuilder(builder);
    builder.setPositiveButton("Test", this);   //Set the button here so it gets created
}

@Override
protected void showDialog(Bundle state)
{       
    super.showDialog(state);    //Call show on default first so we can override the handlers

    final AlertDialog d = (AlertDialog) getDialog();
    d.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener()
            {            
                @Override
                public void onClick(View v)
                {
                    Boolean wantToCloseDialog = false;
                    //Do stuff, possibly set wantToCloseDialog to true then...
                    if(wantToCloseDialog)
                        d.dismiss();
                    //else dialog stays open. Make sure you have an obvious way to close the dialog especially if you set cancellable to false.
                }
            });
}

পদ্ধতির ব্যাখ্যা:

অ্যান্ড্রয়েড উত্স কোডের মাধ্যমে সন্ধান করে সতর্কতা ডায়ালগ ডিফল্ট বাস্তবায়ন অনক্রিয়েট () এর সমস্ত আসল বোতামে একটি সাধারণ বোতাম হ্যান্ডলার নিবন্ধিত করে কাজ করে। যখন একটি বোতামে ক্লিক করা হয় সাধারণ বোতাম হ্যান্ডলার ক্লিক ইভেন্টটিকে সেটবটনে () পাস করে যা কিছু হ্যান্ডলারের কাছে পৌঁছে দেয় তারপরে কলগুলি ডায়ালগটিকে বাতিল করে দেয়।

আপনি যদি এই ডায়ালগ বক্সটি বন্ধ করতে বাধা দিতে চান তবে এই বোতামগুলির মধ্যে একটি টিপলে আপনাকে অবশ্যই বোতামটির আসল দৃশ্যের জন্য সাধারণ বোতাম হ্যান্ডলারটি প্রতিস্থাপন করতে হবে। এটি অনক্রিয়েট () এ নিয়োগের কারণে, আপনাকে ডিফল্ট অনক্রিয়েট () বাস্তবায়ন বলার পরে অবশ্যই এটি প্রতিস্থাপন করতে হবে। শো () পদ্ধতির প্রক্রিয়াতে অনক্রিয়েটকে ডাকা হয়। আপনি একটি কাস্টম ডায়ালগ ক্লাস তৈরি করতে পারেন এবং সুপারকে কল করতে ওনক্রিট () কে ওভাররাইড করতে পারেন O ?

সুতরাং, ডায়ালগটি যেভাবে ডিজাইন করা হয়েছে তা ব্যবহার করার সাথে সাথে এটি বরখাস্ত করার সময় নিয়ন্ত্রণের সাথে একটি পদ্ধতির ডায়লগ কল করতে হবে h দেখান () প্রথমে, তারপর ক্লিক হ্যান্ডলারের ওভাররাইডের জন্য ডায়ালগ.জেটবাটন () ব্যবহার করে বোতামটির একটি রেফারেন্স পান। আর একটি পন্থা হ'ল setOnShowListener () ব্যবহার করুন এবং বোতাম ভিউটি সন্ধান করা এবং হ্যান্ডলারেরটিকে OnShLLtentener প্রতিস্থাপনের প্রয়োগ করা। মূলত যে থ্রেডটি মূলত সংলাপের উদাহরণ তৈরি করে তার উপর নির্ভর করে উভয়ের মধ্যে কার্যকরী পার্থক্যটি 'প্রায়' নিল। উত্স কোডটি দেখে, onSowListener থ্রেডে চলমান একজন হ্যান্ডলারের কাছে পোস্ট করা বার্তা দ্বারা কল হয়ে যায় যা সেই ডায়ালগটি তৈরি করে। সুতরাং, যেহেতু আপনার অনশোলিস্টনারকে বার্তা কাতারে পোস্ট করা একটি বার্তা দ্বারা কল করা হয়েছে এটি প্রযুক্তিগতভাবে সম্ভব যে আপনার শ্রোতাদের ফোন করা শো শেষ হওয়ার পরে কিছুক্ষণ বিলম্বিত হয়।

অতএব, আমি বিশ্বাস করি নিরাপদ পদ্ধতিটিই প্রথম: শো কল call যেহেতু আপনার কোড যা শোতে () শো করে তা মূল জিইউআই থ্রেডে পরিচালিত হবে, এর অর্থ আপনি যে শো কোডটি অনুসরণ করেন) তার থ্রেডের অন্য কোনও কোডের আগেই কার্যকর করা হবে, অন্যদিকে অনশোলিস্টনার পদ্ধতির সময়সীমার দিকেই রয়েছে বার্তা সারি।


12
এটি এখন পর্যন্ত সবচেয়ে সহজ বাস্তবায়ন এবং পুরোপুরি কার্যকরভাবে কাজ করে। আমি সতর্কতা ডায়ালগ.বিল্ডার ব্যবহার করেছি - প্রদর্শন () এর পরে অবিলম্বে ডিফল্ট বোতাম হ্যান্ডলারটি পরিবর্তন করুন এবং এটি কবজির মতো কাজ করছে।
পুনরায়হার্ড

1
@ সরস বন্ধু, আমি সম্পূর্ণ সাহসের সাথে আপনার আশ্চর্যজনক উত্তরটি সম্পাদনা করেছি কারণ বিভাগ 1 এ আপনি () বাতিল করে দিয়েছিলেন; পরিবর্তে আমি কথোপকথন বিশ্বাস করি d খারিজ (); দুর্দান্ত উত্তরটির জন্য অনেক ধন্যবাদ!
ফ্যাটি

কোনও ProgressDialogবোতামটি ক্লিক করা হলে এটি বন্ধ করার কোনও উপায় আছে কি ?
জোশুয়া পিন্টার

1
পবিত্র গাভী, অ্যান্ড্রয়েড সম্পর্কে আমি যত বেশি জানি ততই আমি বিরক্ত বোধ করি ... কেবলমাত্র একটি ডায়ালগ সঠিকভাবে কাজ করার জন্য এই সব। কীভাবে একটি ডায়ালগ প্রদর্শন করবেন তা
নির্ণয়

1
@Hars_v পরবর্তী ব্যক্তির জন্য onResume () ব্যবহারের উত্তর আপডেট করেছে, ধন্যবাদ!
সোগার

37

একটি বিকল্প সমাধান

আমি ইউএক্স দৃষ্টিকোণ থেকে একটি বিকল্প উত্তর উপস্থাপন করতে চাই।

আপনি যখন কোনও বোতামটি ক্লিক করবেন তখন কেন আপনি কোনও সংলাপ বন্ধ হতে বাধা দিতে চান? সম্ভবত এটি কারণ আপনার একটি কাস্টম ডায়লগ রয়েছে যাতে ব্যবহারকারী কোনও পছন্দ করেননি বা এখনও পুরোপুরি পূরণ করেন নি। এবং যদি এটি সমাপ্ত না হয়, তবে আপনার এগুলি একেবারে ইতিবাচক বোতামটি ক্লিক করার অনুমতি দেওয়া উচিত নয়। সবকিছু প্রস্তুত না হওয়া পর্যন্ত কেবল এটি অক্ষম করুন।

এখানে অন্যান্য উত্তরগুলি ইতিবাচক বোতাম ক্লিককে ওভাররাইড করার জন্য প্রচুর কৌশল দেয়। যদি তা করা গুরুত্বপূর্ণ ছিল, তবে অ্যান্ড্রয়েড কি এটি করার জন্য কোনও সুবিধাজনক পদ্ধতি তৈরি করত না? তারা না।

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

এখানে চিত্র বর্ণনা লিখুন

ইতিবাচক বোতামটি কীভাবে অক্ষম করবেন

একটি কাস্টম ডায়ালগ বিন্যাস তৈরি করার জন্য অ্যান্ড্রয়েড ডকুমেন্টেশন দেখুন । এটি আপনাকে নিজের AlertDialogভিতরে একটি রাখার পরামর্শ দেয় DialogFragment। তারপরে আপনাকে কী করতে হবে তা ইতিবাচক বোতামটি সক্ষম বা অক্ষম করার জন্য লেআউট উপাদানগুলিতে শ্রোতাদের সেট করতে হবে।

ইতিবাচক বোতামটি এইভাবে অক্ষম করা যেতে পারে:

AlertDialog dialog = (AlertDialog) getDialog();
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);

এখানে DialogFragmentঅক্ষম ইতিবাচক বোতামের সাথে সম্পূর্ণ কাজ করা যেমন উপরের চিত্রটিতে ব্যবহার করা যেতে পারে।

import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;

public class MyDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        // inflate the custom dialog layout
        LayoutInflater inflater = getActivity().getLayoutInflater();
        View view = inflater.inflate(R.layout.my_dialog_layout, null);

        // add a listener to the radio buttons
        RadioGroup radioGroup = (RadioGroup) view.findViewById(R.id.radio_group);
        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                // enable the positive button after a choice has been made
                AlertDialog dialog = (AlertDialog) getDialog();
                dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
            }
        });

        // build the alert dialog
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setView(view)
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        // TODO: use an interface to pass the user choice back to the activity
                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        MyDialogFragment.this.getDialog().cancel();
                    }
                });
        return builder.create();
    }

    @Override
    public void onResume() {
        super.onResume();

        // disable positive button by default
        AlertDialog dialog = (AlertDialog) getDialog();
        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
    }
}

কাস্টম ডায়ালগ এই জাতীয় কার্যকলাপ থেকে চালানো যেতে পারে:

MyDialogFragment dialog = new MyDialogFragment();
dialog.show(getFragmentManager(), "MyTag");

মন্তব্য

  • বংশবৃদ্ধির স্বার্থে, ব্যবহারকারীর পছন্দ সম্পর্কিত তথ্যটি ক্রিয়াকলাপে ফেরত দেওয়ার জন্য আমি যোগাযোগ ইন্টারফেস বাদ দিয়েছি। ডকুমেন্টেশন শো কীভাবে সম্পন্ন করা হয়, যদিও।
  • বোতামটি এখনও nullআছে onCreateDialogতাই আমি এটিকে অক্ষম করে দিয়েছি onResume। এটি আবার অক্ষম করার অনাকাঙ্ক্ষিত প্রভাব রয়েছে যদি ব্যবহারকারী কোনও অ্যাপ্লিকেশনটিতে স্যুইচ করে এবং ডায়ালগটি খারিজ না করে ফিরে আসে back এটাও কোনো ব্যবহারকারীর পছন্দ unselecting দ্বারা বা কল করে সমাধান করা যেতে পারে Runnableথেকে onCreateDialogপরবর্তী রান লুপ নিষ্ক্রিয় বাটন।

    view.post(new Runnable() {
        @Override
        public void run() {
            AlertDialog dialog = (AlertDialog) getDialog();
            dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
        }
    });
    

সম্পর্কিত


33

আমি একটি সাধারণ ক্লাস লিখেছি (একটি সতর্কতা ডায়ালগবিল্ডার) যা আপনি ডায়ালগের বোতামগুলি টিপানোর সময় স্বয়ংক্রিয়ভাবে বরখাস্ত বৈশিষ্ট্যটি অক্ষম করতে ব্যবহার করতে পারেন।

এটি অ্যান্ড্রয়েড 1.6 এর সাথেও সামঞ্জস্যপূর্ণ, সুতরাং এটি অনশোললিস্টার ব্যবহার করে না (যা কেবলমাত্র API> = 8 উপলভ্য)।

সুতরাং, সতর্কতা ডায়ালগ.বিল্ডার ব্যবহার না করে আপনি এই কাস্টমএলার্টডায়ালগবিল্ডারটি ব্যবহার করতে পারেন। সর্বাধিক গুরুত্বপূর্ণ অংশটি হ'ল আপনাকে ক্রিয়েট () না বলে কেবল শো () পদ্ধতিতে কল করা উচিত । আমি setCanceledOnTouchOutside () এবং setOnDismissListener এর মতো পদ্ধতি যুক্ত করেছি যাতে আপনি সেগুলি এখনও নির্মাতাকে সরাসরি সেট করতে পারেন।

আমি এটিকে অ্যান্ড্রয়েড 1.6, 2.x, 3.x এবং 4.x এ পরীক্ষা করেছি যাতে এটি খুব ভালভাবে কাজ করা উচিত। কিছু সমস্যা মনে হলে এখানে মন্তব্য করুন।

package com.droidahead.lib.utils;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.View;
import android.view.View.OnClickListener;

public class CustomAlertDialogBuilder extends AlertDialog.Builder {
    /**
     * Click listeners
     */
    private DialogInterface.OnClickListener mPositiveButtonListener = null;
    private DialogInterface.OnClickListener mNegativeButtonListener = null;
    private DialogInterface.OnClickListener mNeutralButtonListener = null;

    /**
     * Buttons text
     */
    private CharSequence mPositiveButtonText = null;
    private CharSequence mNegativeButtonText = null;
    private CharSequence mNeutralButtonText = null;

    private DialogInterface.OnDismissListener mOnDismissListener = null;

    private Boolean mCancelOnTouchOutside = null;

    public CustomAlertDialogBuilder(Context context) {
        super(context);
    }

    public CustomAlertDialogBuilder setOnDismissListener (DialogInterface.OnDismissListener listener) {
        mOnDismissListener = listener;
        return this;
    }

    @Override
    public CustomAlertDialogBuilder setNegativeButton(CharSequence text, DialogInterface.OnClickListener listener) {
        mNegativeButtonListener = listener;
        mNegativeButtonText = text;
        return this;
    }

    @Override
    public CustomAlertDialogBuilder setNeutralButton(CharSequence text, DialogInterface.OnClickListener listener) {
        mNeutralButtonListener = listener;
        mNeutralButtonText = text;
        return this;
    }

    @Override
    public CustomAlertDialogBuilder setPositiveButton(CharSequence text, DialogInterface.OnClickListener listener) {
        mPositiveButtonListener = listener;
        mPositiveButtonText = text;
        return this;
    }

    @Override
    public CustomAlertDialogBuilder setNegativeButton(int textId, DialogInterface.OnClickListener listener) {
        setNegativeButton(getContext().getString(textId), listener);
        return this;
    }

    @Override
    public CustomAlertDialogBuilder setNeutralButton(int textId, DialogInterface.OnClickListener listener) {
        setNeutralButton(getContext().getString(textId), listener);
        return this;
    }

    @Override
    public CustomAlertDialogBuilder setPositiveButton(int textId, DialogInterface.OnClickListener listener) {
        setPositiveButton(getContext().getString(textId), listener);
        return this;
    }

    public CustomAlertDialogBuilder setCanceledOnTouchOutside (boolean cancelOnTouchOutside) {
        mCancelOnTouchOutside = cancelOnTouchOutside;
        return this;
    }



    @Override
    public AlertDialog create() {
        throw new UnsupportedOperationException("CustomAlertDialogBuilder.create(): use show() instead..");
    }

    @Override
    public AlertDialog show() {
        final AlertDialog alertDialog = super.create();

        DialogInterface.OnClickListener emptyOnClickListener = new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) { }
        };


        // Enable buttons (needed for Android 1.6) - otherwise later getButton() returns null
        if (mPositiveButtonText != null) {
            alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, mPositiveButtonText, emptyOnClickListener);
        }

        if (mNegativeButtonText != null) {
            alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, mNegativeButtonText, emptyOnClickListener);
        }

        if (mNeutralButtonText != null) {
            alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, mNeutralButtonText, emptyOnClickListener);
        }

        // Set OnDismissListener if available
        if (mOnDismissListener != null) {
            alertDialog.setOnDismissListener(mOnDismissListener);
        }

        if (mCancelOnTouchOutside != null) {
            alertDialog.setCanceledOnTouchOutside(mCancelOnTouchOutside);
        }

        alertDialog.show();

        // Set the OnClickListener directly on the Button object, avoiding the auto-dismiss feature
        // IMPORTANT: this must be after alert.show(), otherwise the button doesn't exist..
        // If the listeners are null don't do anything so that they will still dismiss the dialog when clicked
        if (mPositiveButtonListener != null) {
            alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    mPositiveButtonListener.onClick(alertDialog, AlertDialog.BUTTON_POSITIVE);
                }
            });
        }

        if (mNegativeButtonListener != null) {
            alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    mNegativeButtonListener.onClick(alertDialog, AlertDialog.BUTTON_NEGATIVE);
                }
            });
        }

        if (mNeutralButtonListener != null) {
            alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    mNeutralButtonListener.onClick(alertDialog, AlertDialog.BUTTON_NEUTRAL);
                }
            });
        }

        return alertDialog;
    }   
}

সম্পাদনা এখানে কাস্টমএলার্টডায়ালগবিল্ডার কীভাবে ব্যবহার করবেন তার একটি ছোট উদাহরণ:

// Create the CustomAlertDialogBuilder
CustomAlertDialogBuilder dialogBuilder = new CustomAlertDialogBuilder(context);

// Set the usual data, as you would do with AlertDialog.Builder
dialogBuilder.setIcon(R.drawable.icon);
dialogBuilder.setTitle("Dialog title");
dialogBuilder.setMessage("Some text..");

// Set your buttons OnClickListeners
dialogBuilder.setPositiveButton ("Button 1", new DialogInterface.OnClickListener() {
    public void onClick (DialogInterface dialog, int which) {
        // Do something...

        // Dialog will not dismiss when the button is clicked
        // call dialog.dismiss() to actually dismiss it.
    }
});

// By passing null as the OnClickListener the dialog will dismiss when the button is clicked.               
dialogBuilder.setNegativeButton ("Close", null);

// Set the OnDismissListener (if you need it)       
dialogBuilder.setOnDismissListener(new DialogInterface.OnDismissListener() {
    public void onDismiss(DialogInterface dialog) {
        // dialog was just dismissed..
    }
});

// (optional) set whether to dismiss dialog when touching outside
dialogBuilder.setCanceledOnTouchOutside(false);

// Show the dialog
dialogBuilder.show();

চিয়ার্স,

যুবরাজের


খুশী হলাম। তবে আমার পক্ষে কাজ হয়নি। ডায়লগ তবুও বরখাস্ত করা।
লিয়ান্ড্রোস

মিম যে অদ্ভুত লাগছে। আমি এটি আমার অ্যাপটিতে ব্যবহার করছি এবং কেবলমাত্র বোতামগুলি যেখানে আমি স্পষ্টভাবে ডায়লগ কল করি d খারিজ () ডায়ালগটি খারিজ করবে। আপনি কোন অ্যান্ড্রয়েড সংস্করণে পরীক্ষা করছেন? আপনি কাস্টমএলার্টডায়ালগবিল্ডারটি কোথায় ব্যবহার করেছেন তা আপনার কোডটি প্রদর্শন করতে পারেন?
যুভিড্রয়েড

আমি এটা এই কারণে সৃষ্টি হয় মনে: (কল dialog.show () onClickListener পরে) pastebin.com/uLnSu5v7 যদি আমি positiveButton ক্লিক তারা বরখাস্ত পেতে যদি বুলিয়ান সত্য ...
Leandros

আমি Activity.onCreateDialog () ব্যবহার করে এটি পরীক্ষা করিনি। সম্ভবত এটি সেভাবে কাজ করতে পারে না। আমি কীভাবে এটি ব্যবহার করি তার একটি ছোট উদাহরণ অন্তর্ভুক্ত করতে আমি 'উত্তর' সম্পাদনা করব।
যুভিড্রয়েড

4
এটি বর্তমান সম্পাদনা নিয়ে আমার পক্ষে কাজ করে! তবে: আরও একটি সতর্কতা। বিল্ডার.জেটকন্টেক্সট () কেবলমাত্র এপিআই 11+ এ উপলব্ধ। একটি ক্ষেত্র যুক্ত করুন Context mContextএবং এটির পরিবর্তে কনস্ট্রাক্টরে সেট করুন।
ওলেগ ভাস্কেভিচ

28

আপনি যদি ব্যবহার করছেন তবে এখানে কিছু's DialogFragmentযা কোনওভাবেই ডায়ালগগুলি পরিচালনা করার প্রস্তাবিত উপায়।

কি AlertDialog এর সঙ্গে ঘটে setButton()পদ্ধতি (এবং আমি সঙ্গে একই কল্পনা AlertDialogBuilder'র setPositiveButton()এবং setNegativeButton()) যে বাটন সেট (যেমন হয় AlertDialog.BUTTON_POSITIVEএটি দিয়ে) প্রকৃতপক্ষে দুটি ভিন্ন আরম্ভ হবে OnClickListenerবস্তু যখন চাপা।

প্রথম হচ্ছে DialogInterface.OnClickListener , যা একটি প্যারামিটার হয় setButton(), setPositiveButton()এবং setNegativeButton()

অন্যটি ভিউ.অনিক্লিকলিস্টনার , যা আপনার AlertDialogকোনও বোতাম চাপলে স্বয়ংক্রিয়ভাবে বরখাস্ত হয়ে যাবে - এবং AlertDialogনিজেই সেট হয়ে গেছে।

আপনি যা করতে পারেন তা হ'ল হিসাবে ব্যবহার setButton()করা , বোতামটি তৈরি করা এবং তারপরে আপনার কাস্টম অ্যাকশন পদ্ধতিটি কল করুন । উদাহরণ স্বরূপ,nullDialogInterface.OnClickListenerView.OnClickListener

@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
    AlertDialog alertDialog = new AlertDialog(getActivity());
    // set more items...
    alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "OK", null);

    return alertDialog;
}

তারপরে, আপনি এর পদ্ধতিতে ডিফল্ট AlertDialog'বাটনগুলি' View.OnClickListener(যা অন্যথায় ডায়ালগটি বাতিল করে দেবে) ওভাররাইড করতে পারেন :DialogFragmentonResume()

@Override
public void onResume()
{
    super.onResume();
    AlertDialog alertDialog = (AlertDialog) getDialog();
    Button okButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
    okButton.setOnClickListener(new View.OnClickListener() { 
        @Override
        public void onClick(View v)
        {
            performOkButtonAction();
        }
    });
}

private void performOkButtonAction() {
    // Do your stuff here
}

আপনাকে এই onResume()পদ্ধতিতে সেট করতে getButton()হবে কারণ nullডায়ালগটি প্রদর্শিত না হওয়া পর্যন্ত ফিরে আসবে!

এটির ফলে আপনার কাস্টম অ্যাকশন পদ্ধতিটি কেবল একবার কল করা উচিত এবং ডায়ালগটি ডিফল্টরূপে খারিজ করা হবে না।


21

টমের উত্তরে অনুপ্রাণিত হয়ে আমি বিশ্বাস করি যে এখানে ধারণাটি হ'ল:

  • onClickListenerডায়ালগ তৈরির সময় সেট করুনnull
  • onClickListenerডায়ালগটি দেখানোর পরে একটি সেট করুন ।

আপনি onShowListenerটমের মতো ওভাররাইড করতে পারেন। বিকল্পভাবে, আপনি পারেন

  1. সতর্কতা ডায়ালগের কল করার পরে বোতামটি পান show()
  2. বোতামগুলি ' onClickListenerনিম্নলিখিত হিসাবে সেট করুন (আমি মনে করি কিছুটা আরও পঠনযোগ্য)।

কোড:

AlertDialog.Builder builder = new AlertDialog.Builder(context);
// ...
final AlertDialog dialog = builder.create();
dialog.show();
// now you can override the default onClickListener
Button b = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
b.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Log.i(TAG, "ok button is clicked");
        handleClick(dialog);
    }
});

8

প্রাক 8 এপিআইয়ের জন্য আমি বুলিয়ান পতাকা ব্যবহার করে সমস্যার সমাধান করেছি, একটি শ্রোতাকে বরখাস্ত করুন এবং ডায়লগ ডেকে আনবেন the যদি সম্পাদনা পাঠের বিষয়বস্তু সঠিক না হয় তবে আবার শো করুন। এটার মত:

case ADD_CLIENT:
        LayoutInflater factoryClient = LayoutInflater.from(this);
        final View EntryViewClient = factoryClient.inflate(
                R.layout.alert_dialog_add_client, null);

        EditText ClientText = (EditText) EntryViewClient
                .findViewById(R.id.client_edit);

        AlertDialog.Builder builderClient = new AlertDialog.Builder(this);
        builderClient
                .setTitle(R.string.alert_dialog_client)
                .setCancelable(false)
                .setView(EntryViewClient)
                .setPositiveButton("Save",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int whichButton) {
                                EditText newClient = (EditText) EntryViewClient
                                        .findViewById(R.id.client_edit);
                                String newClientString = newClient
                                        .getText().toString();
                                if (checkForEmptyFields(newClientString)) {
                                    //If field is empty show toast and set error flag to true;
                                    Toast.makeText(getApplicationContext(),
                                            "Fields cant be empty",
                                            Toast.LENGTH_SHORT).show();
                                    add_client_error = true;
                                } else {
                                    //Here save the info and set the error flag to false
                                    add_client_error = false;
                                }
                            }
                        })
                .setNegativeButton("Cancel",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int id) {
                                add_client_error = false;
                                dialog.cancel();
                            }
                        });
        final AlertDialog alertClient = builderClient.create();
        alertClient.show();

        alertClient
                .setOnDismissListener(new DialogInterface.OnDismissListener() {

                    @Override
                    public void onDismiss(DialogInterface dialog) {
                        //If the error flag was set to true then show the dialog again
                        if (add_client_error == true) {
                            alertClient.show();
                        } else {
                            return;
                        }

                    }
                });
        return true;

অদ্ভুত অন ডাকা হবে না, আমার এপি স্তর 21
duckduckgo

7

এই লিঙ্কটির উত্তরটি একটি সহজ সমাধান এবং এটি এপিআই 3 এর সাথে সামঞ্জস্যপূর্ণ Tom এটি টম বোলউইটের সমাধানের সাথে খুব সামঞ্জস্যপূর্ণ, তবে কম সামঞ্জস্যপূর্ণ অনশোলিস্টনার ব্যবহার না করেই।

হ্যা, তুমি পারো. আপনার মূলত:

  1. ডায়ালগবিল্ডার দিয়ে ডায়ালগ তৈরি করুন
  2. () ডায়ালগটি দেখান
  3. প্রদর্শিত ডায়লগের বোতামগুলি সন্ধান করুন এবং তাদের অন ক্লিকলিস্টনারকে ওভাররাইড করুন

আমি যখন এডিটেক্সটপ্রেসিফারেন্স প্রসারিত করছিলাম তখন থেকে আমি কামেনের কোডটিতে ছোটখাটো মানিয়ে নিয়েছি।

@Override
protected void showDialog(Bundle state) {
  super.showDialog(state);

  class mocl implements OnClickListener{
    private final AlertDialog dialog;
    public mocl(AlertDialog dialog) {
          this.dialog = dialog;
      }
    @Override
    public void onClick(View v) {

        //checks if EditText is empty, and if so tells the user via Toast
        //otherwise it closes dialog and calls the EditTextPreference's onClick
        //method to let it know that the button has been pressed

        if (!IntPreference.this.getEditText().getText().toString().equals("")){
        dialog.dismiss();
        IntPreference.this.onClick(dialog,DialogInterface.BUTTON_POSITIVE);
        }
        else {
            Toast t = Toast.makeText(getContext(), "Enter a number!", Toast.LENGTH_SHORT);
            t.show();
        }

    }
  }

  AlertDialog d = (AlertDialog) getDialog();
  Button b = d.getButton(DialogInterface.BUTTON_POSITIVE);
  b.setOnClickListener(new mocl((d)));
}

এমন মজা!


4

এই কোডটি আপনার পক্ষে কাজ করবে, কারণ আমার একটি সিমিলার সমস্যা ছিল এবং এটি আমার জন্য কাজ করেছিল। :)

1- আপনার খণ্ড-কথোপকথন শ্রেণিতে অনার্ট () পদ্ধতি ওভাররাইড করুন।

@Override
public void onStart() {
    super.onStart();
    final AlertDialog D = (AlertDialog) getDialog();
    if (D != null) {
        Button positive = (Button) D.getButton(Dialog.BUTTON_POSITIVE);
        positive.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                if (edittext.equals("")) {
   Toast.makeText(getActivity(), "EditText empty",Toast.LENGTH_SHORT).show();
                } else {
                D.dismiss(); //dissmiss dialog
                }
            }
        });
    }
}

3

অগ্রগতি ডায়ালগগুলির জন্য

কথোপকথনটি স্বয়ংক্রিয়ভাবে বরখাস্ত হওয়া থেকে বিরত রাখতে আপনাকে এর OnClickListenerপরে ProgressDialogযেমনটি দেখানোর পরে সেট করতে হবে :

connectingDialog = new ProgressDialog(this);

connectingDialog.setCancelable(false);
connectingDialog.setCanceledOnTouchOutside(false);

// Create the button but set the listener to a null object.
connectingDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", 
        (DialogInterface.OnClickListener) null )

// Show the dialog so we can then get the button from the view.
connectingDialog.show();

// Get the button from the view.
Button dialogButton = connectingDialog.getButton( DialogInterface.BUTTON_NEGATIVE);

// Set the onClickListener here, in the view.
dialogButton.setOnClickListener( new View.OnClickListener() {

    @Override
    public void onClick ( View v ) {

        // Dialog will not get dismissed until you call dismiss() explicitly.

    }

});

3
public class ComentarDialog extends DialogFragment{
private EditText comentario;

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    LayoutInflater inflater = LayoutInflater.from(getActivity());
    View v = inflater.inflate(R.layout.dialog_comentar, null);
    comentario = (EditText)v.findViewById(R.id.etxt_comentar_dialog);

    builder.setTitle("Comentar")
           .setView(v)
           .setPositiveButton("OK", null)
           .setNegativeButton("CANCELAR", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {

               }
           });

    return builder.create();
}

@Override
public void onStart() {
    super.onStart();

    //Obtenemos el AlertDialog
    AlertDialog dialog = (AlertDialog)getDialog();

    dialog.setCanceledOnTouchOutside(false);
    dialog.setCancelable(false);//Al presionar atras no desaparece

    //Implementamos el listener del boton OK para mostrar el toast
    dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(TextUtils.isEmpty(comentario.getText())){
               Toast.makeText(getActivity(), "Ingrese un comentario", Toast.LENGTH_SHORT).show();
               return;
            }
            else{
                ((AlertDialog)getDialog()).dismiss();
            }
        }
    });

    //Personalizamos
    Resources res = getResources();

    //Buttons
    Button positive_button = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
    positive_button.setBackground(res.getDrawable(R.drawable.btn_selector_dialog));

    Button negative_button =  dialog.getButton(DialogInterface.BUTTON_NEGATIVE);
    negative_button.setBackground(res.getDrawable(R.drawable.btn_selector_dialog));

    int color = Color.parseColor("#304f5a");

    //Title
    int titleId = res.getIdentifier("alertTitle", "id", "android");
    View title = dialog.findViewById(titleId);
    if (title != null) {
        ((TextView) title).setTextColor(color);
    }

    //Title divider
    int titleDividerId = res.getIdentifier("titleDivider", "id", "android");
    View titleDivider = dialog.findViewById(titleDividerId);
    if (titleDivider != null) {
        titleDivider.setBackgroundColor(res.getColor(R.color.list_menu_divider));
    }
}
}

3

আপনি বিল্ডার.শো () যোগ করতে পারেন; প্রত্যাবর্তনের আগে বৈধতা বার্তা পরে;

এটার মত

    public void login()
{
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setView(R.layout.login_layout);
    builder.setTitle("Login");



    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener()
    {
        @Override
        public void onClick(DialogInterface dialog, int id)
        {
            dialog.cancel();
        }
    });// put the negative button before the positive button, so it will appear

    builder.setPositiveButton("Ok", new DialogInterface.OnClickListener()
    {
        @Override
        public void onClick(DialogInterface dialog, int id)
        {
            Dialog d = (Dialog) dialog;
            final EditText etUserName = (EditText) d.findViewById(R.id.etLoginName);
            final EditText etPassword = (EditText) d.findViewById(R.id.etLoginPassword);
            String userName = etUserName.getText().toString().trim();
            String password = etPassword.getText().toString().trim();

            if (userName.isEmpty() || password.isEmpty())
            {

                Toast.makeText(getApplicationContext(),
                        "Please Fill all fields", Toast.LENGTH_SHORT).show();
                builder.show();// here after validation message before retrun
                               //  it will reopen the dialog
                              // till the user enter the right condition
                return;
            }

            user = Manager.get(getApplicationContext()).getUserByName(userName);

            if (user == null)
            {
                Toast.makeText(getApplicationContext(),
                        "Error ethier username or password are wrong", Toast.LENGTH_SHORT).show();
                builder.show();
                return;
            }
            if (password.equals(user.getPassword()))
            {
                etPassword.setText("");
                etUserName.setText("");
                setLogged(1);
                setLoggedId(user.getUserId());
                Toast.makeText(getApplicationContext(),
                        "Successfully logged in", Toast.LENGTH_SHORT).show();
               dialog.dismiss();// if every thing is ok then dismiss the dialog
            }
            else
            {
                Toast.makeText(getApplicationContext(),
                        "Error ethier username or password are wrong", Toast.LENGTH_SHORT).show();
                builder.show();
                return;
            }

        }
    });

    builder.show();

}

3

ক্লিক করার সময় ডায়ালগ বাক্সটি বন্ধ হওয়া থেকে রোধ করতে এবং ইন্টারনেট উপলব্ধ হলে এটি বন্ধ হওয়া উচিত

আমি একই জিনিসটি করার চেষ্টা করছি, যেহেতু আমি চাই না যে ডায়ালগ বক্সটি ইন্টারনেট সংযুক্ত না হওয়া অবধি এবং বন্ধ থাকবে।

আমার কোডটি এখানে:

AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this); builder.setTitle("Internet Not Connected");
    if(ifConnected()){

        Toast.makeText(this, "Connected or not", Toast.LENGTH_LONG).show();
    }
    else{
        builder.setPositiveButton("Retry", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
               if(!ifConnected())
               {
                   builder.show();
               }
            }
        }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                finish();
            }
        });
        builder.show();

    }

এবং এখানে আমার সংযোগ ব্যবস্থাপনার কোড:

 private boolean ifConnected()
{
    ConnectivityManager connectivityManager= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();
   return networkInfo!=null && networkInfo.isConnected();
}

এটি বুদ্ধিমান, তবে আমি এই ত্রুটি বার্তাটি The specified child already has a parent. You must call removeView() on the child's parent first
পেয়েছি

2

আপনি যদি ব্যবহার করেন তবে material designআমি উপাদান-সংলাপগুলি পরীক্ষা করে দেখার পরামর্শ দেব । এটি আমার জন্য বর্তমানে ওপেন অ্যান্ড্রয়েড বাগ সম্পর্কিত 7 টি সমস্যা সমাধান করেছে (দেখুন 78088 ), তবে সবচেয়ে গুরুত্বপূর্ণ বিষয় এই টিকিটের জন্য এটিতে একটি autoDismissপতাকা রয়েছে যা ব্যবহার করার সময় সেট করা যেতে পারে Builder


1

আপনার জন্য একটি কাস্টম লেআউট ব্যবহার করুন DialogFragmentএবং LinearLayoutআপনার সামগ্রীর অধীনে একটি যুক্ত করুন যা গুগল ম্যাটেরিয়াল ডিজাইনের সাথে মেলে সীমানার মতো স্টাইলযুক্ত হতে পারে। তারপরে নতুন তৈরি বোতামগুলি সন্ধান করুন এবং সেগুলি ওভাররাইড করুন OnClickListener

উদাহরণ:

public class AddTopicFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        // Get the layout inflater
        LayoutInflater inflater = getActivity().getLayoutInflater();
        final View dialogView = inflater.inflate(R.layout.dialog_add_topic, null);

        Button saveTopicDialogButton = (Button) dialogView.findViewById(R.id.saveTopicDialogButton);
        Button cancelSaveTopicDialogButton = (Button) dialogView.findViewById(R.id.cancelSaveTopicDialogButton);

        final AppCompatEditText addTopicNameET = (AppCompatEditText) dialogView.findViewById(R.id.addTopicNameET);
        final AppCompatEditText addTopicCreatedByET = (AppCompatEditText) dialogView.findViewById(R.id.addTopicCreatedByET);

        saveTopicDialogButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // validate inputs
                if(addTopicNameET.getText().toString().trim().isEmpty()){
                    addTopicNameET.setError("Topic name can't be empty");
                    addTopicNameET.requestFocus();
                }else if(addTopicCreatedByET.getText().toString().trim().isEmpty()){
                    addTopicCreatedByET.setError("Topic created by can't be empty");
                    addTopicCreatedByET.requestFocus();
                }else {
                    // save topic to database
                    Topic topic = new Topic();
                    topic.name = addTopicNameET.getText().toString().trim();
                    topic.createdBy = addTopicCreatedByET.getText().toString().trim();
                    topic.createdDate = new Date().getTime();
                    topic.save();
                    AddTopicFragment.this.dismiss();
                }
            }
        });

        cancelSaveTopicDialogButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AddTopicFragment.this.dismiss();
            }
        });

        // Inflate and set the layout for the dialog
        // Pass null as the parent view because its going in the dialog layout
        builder.setView(dialogView)
               .setMessage(getString(R.string.add_topic_message));

        return builder.create();
    }

}

কথোপকথন_ড্যাড_টপিক.এক্সএমএল :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:padding="@dimen/activity_horizontal_margin"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:errorEnabled="true">

        <android.support.v7.widget.AppCompatEditText
            android:id="@+id/addTopicNameET"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Topic Name"
            android:inputType="textPersonName"
            android:maxLines="1" />

    </android.support.design.widget.TextInputLayout>

    <android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:errorEnabled="true">

        <android.support.v7.widget.AppCompatEditText
            android:id="@+id/addTopicCreatedByET"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Created By"
            android:inputType="textPersonName"
            android:maxLines="1" />

    </android.support.design.widget.TextInputLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:text="@string/cancel"
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/cancelSaveTopicDialogButton"
            style="@style/Widget.AppCompat.Button.ButtonBar.AlertDialog" />

        <Button
            android:text="@string/save"
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/saveTopicDialogButton"
            style="@style/Widget.AppCompat.Button.ButtonBar.AlertDialog" />

    </LinearLayout>


</LinearLayout>

এই চূড়ান্ত ফলাফল।


0

এটি সবচেয়ে সহজ উপায়ে নির্মিত হতে পারে:

কাস্টম ভিউ এবং দুটি বোতাম (ধনাত্মক ও নেতিবাচক) সহ সতর্কতা ডায়ালগ ।

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()).setTitle(getString(R.string.select_period));
builder.setPositiveButton(getString(R.string.ok), null);

 builder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {

    // Click of Cancel Button

   }
 });

  LayoutInflater li = LayoutInflater.from(getActivity());
  View promptsView = li.inflate(R.layout.dialog_date_picker, null, false);
  builder.setView(promptsView);

  DatePicker startDatePicker = (DatePicker)promptsView.findViewById(R.id.startDatePicker);
  DatePicker endDatePicker = (DatePicker)promptsView.findViewById(R.id.endDatePicker);

  final AlertDialog alertDialog = builder.create();
  alertDialog.show();

  Button theButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
  theButton.setOnClickListener(new CustomListener(alertDialog, startDatePicker, endDatePicker));

CustomClickLister এর ইতিবাচক বাটন এর সতর্কতা Dailog :

private class CustomListener implements View.OnClickListener {
        private final Dialog dialog;
        private DatePicker mStartDp, mEndDp;
    public CustomListener(Dialog dialog, DatePicker dS, DatePicker dE) {
        this.dialog = dialog;
        mStartDp = dS;
        mEndDp = dE;
    }

    @Override
    public void onClick(View v) {

        int day1  = mStartDp.getDayOfMonth();
        int month1= mStartDp.getMonth();
        int year1 = mStartDp.getYear();
        Calendar cal1 = Calendar.getInstance();
        cal1.set(Calendar.YEAR, year1);
        cal1.set(Calendar.MONTH, month1);
        cal1.set(Calendar.DAY_OF_MONTH, day1);


        int day2  = mEndDp.getDayOfMonth();
        int month2= mEndDp.getMonth();
        int year2 = mEndDp.getYear();
        Calendar cal2 = Calendar.getInstance();
        cal2.set(Calendar.YEAR, year2);
        cal2.set(Calendar.MONTH, month2);
        cal2.set(Calendar.DAY_OF_MONTH, day2);

        if(cal2.getTimeInMillis()>=cal1.getTimeInMillis()){
            dialog.dismiss();
            Log.i("Dialog", "Dismiss");
            // Condition is satisfied so do dialog dismiss
            }else {
            Log.i("Dialog", "Do not Dismiss");
            // Condition is not satisfied so do not dialog dismiss
        }

    }
}

সম্পন্ন


-1

এটি সম্ভবত খুব দেরি করা উত্তর, কিন্তু সেটক্যান্সেবল ব্যবহারটি কৌশলটি করবে।

alertDial.setCancelable(false);

10
দস্তাবেজগুলি থেকে: "এই ডায়ালগটি BACK কী দিয়ে বাতিল করতে হবে কিনা তা সেট করে।" ডায়ালগটি খারিজ করে ইতিবাচক বোতামটির সাথে এর
কোনও যোগসূত্র নেই

3
আমার পক্ষে কাজ করে না, ইতিবাচক বোতামটি ক্লিক করার পরে এখনও বরখাস্ত হয়
হুগো


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