জেলি বিন ডেটপিকার ডায়ালগ - বাতিল করার কোনও উপায় আছে কি?


148

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

আমার এখানে অদ্ভুত কিছু আছে

আমি মনে করি না যে সমস্যাটি আপনি কোন এসডিকে বিপরীতে তৈরি করেন তার উপর নির্ভর করে। ডিভাইস ওএস সংস্করণটি গুরুত্বপূর্ণ।

সমস্যা # 1: ডিফল্টরূপে অসঙ্গতি

DatePickerDialog জেলি বিনে (?) পরিবর্তন করা হয়েছিল এবং এখন কেবলমাত্র একটি সরবরাহ করে সম্পন্ন বোতাম সরবরাহ করে। পূর্ববর্তী সংস্করণগুলিতে একটি বাতিল বোতাম অন্তর্ভুক্ত ছিল এবং এটি ব্যবহারকারীর অভিজ্ঞতার উপর প্রভাব ফেলতে পারে (পূর্ববর্তী অ্যান্ড্রয়েড সংস্করণগুলির সাথে অসঙ্গতি, পেশী মেমরি)।

প্রতিলিপি: একটি বেসিক প্রকল্প তৈরি করুন। এটি রাখুন onCreate:

DatePickerDialog picker = new DatePickerDialog(
        this,
        new OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker v, int y, int m, int d) {
                Log.d("Picker", "Set!");
            }
        },
        2012, 6, 15);
picker.show();

প্রত্যাশিত: একটি বাতিল বোতামটি ডায়ালগটিতে উপস্থিত হতে।

বর্তমান: একটি বাতিল বোতাম প্রদর্শিত হবে না।

স্ক্রীনশট: 4.0.3 (ঠিক আছে) এবং 4.1.1 (সম্ভবত ভুল?)

সমস্যা # 2: ভুল বরখাস্ত আচরণ

কথোপকথন যাকেই শ্রোতার কাছে কল করে তা প্রকৃতপক্ষে কল করা উচিত এবং তারপরে সর্বদাOnDateSetListener শ্রোতাদের কল করে । বাতিল করা এখনও সেট পদ্ধতিতে কল করে এবং সেটিংসটি পদ্ধতিটিকে দু'বার কল করে।

প্রতিলিপি: # 1 কোড ব্যবহার করুন, তবে নীচে কোড যুক্ত করুন (আপনি এটি # 1 টি সমাধান করবেন তবে কেবল দৃষ্টি / ইউআই দেখবেন):

picker.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", 
        new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Log.d("Picker", "Cancel!");
            }
        });

প্রত্যাশিত:

  • BACK কী টিপুন বা ডায়ালগের বাইরে ক্লিক করা উচিত কিছুই করা নয়
  • "বাতিল" চাপলে মুদ্রণ করা উচিত চাপলে পিকার বাতিল !
  • "সেট" টিপে পিকার সেট মুদ্রণ করা উচিত !

বর্তমান:

  • BACK কী টিপুন বা ডায়ালগের প্রিন্টের বাইরে ক্লিক করুন পিকার সেট !
  • "বাতিল করুন" টিপুন পিকার বাতিল করুন!এবং তারপরে পিকার সেট!
  • "সেট" টিপে পিকার সেট প্রিন্ট করে ! এবং তারপর পিকার সেট!

আচরণ দেখায় লগ লাইন:

07-15 12:00:13.415: D/Picker(21000): Set!

07-15 12:00:24.860: D/Picker(21000): Cancel!
07-15 12:00:24.876: D/Picker(21000): Set!

07-15 12:00:33.696: D/Picker(21000): Set!
07-15 12:00:33.719: D/Picker(21000): Set!

অন্যান্য নোট এবং মন্তব্য

  • এটি একটি চারপাশে মোড়ানো DatePickerFragmentকোন ব্যাপার না। আমি আপনার জন্য সমস্যাটি সরল করে দিয়েছি তবে এটি পরীক্ষা করেছি।

অভিনন্দন, আপনি অ্যান্ড্রয়েডে একটি বাগ খুঁজে পেয়েছেন বলে মনে হচ্ছে। আপনি এটি এখানে রিপোর্ট করতে পারেন ।
মাইকেল হ্যাম্পটন

1
খুব ভাল লেখা বাগ রিপোর্ট। কোডটি রান করে পরীক্ষা না করেই আমি এটি পুরোপুরি বুঝতে পারি।
চেওক ইয়ান চেং

6
আমি সবাইকে এই ইস্যুটিতে ভোট দেওয়ার জন্য অনুরোধ করছি! ইস্যু 34833
ব্র্যাডলি

ডায়ালগের বাইরের স্পর্শের কারণে বরখাস্ত হওয়ার মতো কাজ করতে আপনি কী বাটন ফাংশনটি ওভাররাইড করতে পারেননি?
কার্তিক বালাকৃষ্ণন

2
বাগ এখনও 2 বছর পরে খোলা ... অবিশ্বাস্য।
এর্ডোমাস্টার

উত্তর:


115

নোট: Lollipop এর যেমন ফিক্সড , এখানে উৎসক্লায়েন্টগুলিতে ব্যবহারের জন্য অটোমেটেড ক্লাস (সমস্ত অ্যান্ড্রয়েড সংস্করণের সাথে সামঞ্জস্যপূর্ণ) আপডেট হয়েছে updated

টিএল; ডিআর: বিশ্বব্যাপী সমাধানের জন্য 1-2-3 মৃত সহজ পদক্ষেপ:

  1. এই ক্লাসটি ডাউনলোড করুন ।
  2. OnDateSetListenerআপনার ক্রিয়াকলাপে প্রয়োগ করুন (বা আপনার প্রয়োজন অনুসারে ক্লাস পরিবর্তন করুন)।
  3. এই কোড দিয়ে ডায়ালগটি ট্রিগার করুন (এই নমুনায়, আমি এটি একটি এর অভ্যন্তরে ব্যবহার করি Fragment):

    Bundle b = new Bundle();
    b.putInt(DatePickerDialogFragment.YEAR, 2012);
    b.putInt(DatePickerDialogFragment.MONTH, 6);
    b.putInt(DatePickerDialogFragment.DATE, 17);
    DialogFragment picker = new DatePickerDialogFragment();
    picker.setArguments(b);
    picker.show(getActivity().getSupportFragmentManager(), "frag_date_picker");

আর এটাই লাগে! আমি এখনও আমার উত্তরটিকে "স্বীকৃত" হিসাবে রাখার কারণ হ'ল কারণ আমি এখনও আমার সমাধানটিকে পছন্দ করি কারণ এটি ক্লায়েন্ট কোডে খুব ছোট পদচিহ্ন রয়েছে, এটি মৌলিক বিষয়টিকে সম্বোধন করে (শ্রোতাকে ফ্রেমওয়ার্ক শ্রেণিতে ডাকা হচ্ছে), কনফিগারেশনের পরিবর্তনগুলি জুড়ে কাজ করে এবং এটি এই ত্রুটি দ্বারা জর্জরিত না হয়ে পূর্ববর্তী অ্যান্ড্রয়েড সংস্করণগুলিতে ডিফল্ট বাস্তবায়নের কোড যুক্তিকে সরিয়ে দেয় (শ্রেণীর উত্স দেখুন)।

আসল উত্তর (historicalতিহাসিক এবং যুক্তিযুক্ত কারণে রাখা):

বাগ উত্স

ঠিক আছে, দেখে মনে হচ্ছে এটি অবশ্যই একটি বাগ এবং অন্য কেউ ইতিমধ্যে এটি পূরণ করেছেন। 34833 সংখ্যা

আমি খুঁজে পেয়েছি যে সমস্যাটি সম্ভবত রয়েছে DatePickerDialog.java। যেখানে এটি পড়ে:

private void tryNotifyDateSet() {
    if (mCallBack != null) {
        mDatePicker.clearFocus();
        mCallBack.onDateSet(mDatePicker, mDatePicker.getYear(),
                mDatePicker.getMonth(), mDatePicker.getDayOfMonth());
    }
}

@Override
protected void onStop() {
    tryNotifyDateSet();
    super.onStop();
}

আমি অনুমান করতে পারি যে এটি হতে পারে:

@Override
protected void onStop() {
    // instead of the full tryNotifyDateSet() call:
    if (mCallBack != null) mDatePicker.clearFocus();
    super.onStop();
}

এখন যদি কেউ আমাকে বলতে পারে যে আমি কীভাবে অ্যান্ড্রয়েডে প্যাচ / বাগ রিপোর্ট প্রস্তাব করতে পারি তবে আমি খুশি হব। এদিকে, আমি DatePickerDialog.javaসেখানে ইস্যুটির সংযুক্ত সংস্করণ হিসাবে একটি সম্ভাব্য ফিক্স (সহজ) প্রস্তাব করেছি ।

বাগ এড়াতে ধারণা

শ্রোতাকে nullকনস্ট্রাক্টরে সেট করুন এবং BUTTON_POSITIVEপরে আপনার নিজের বোতামটি তৈরি করুন । এটি, নীচে বিশদ।

সমস্যাটি ঘটে কারণ DatePickerDialog.javaআপনি উত্স হিসাবে দেখতে পাচ্ছেন, একটি বিশ্বব্যাপী ভেরিয়েবলকে কল করে ( mCallBack) যা শ্রোতাকে জমা দেয় যা কনস্ট্রাক্টরে পাস হয়েছিল:

    /**
 * @param context The context the dialog is to run in.
 * @param callBack How the parent is notified that the date is set.
 * @param year The initial year of the dialog.
 * @param monthOfYear The initial month of the dialog.
 * @param dayOfMonth The initial day of the dialog.
 */
public DatePickerDialog(Context context,
        OnDateSetListener callBack,
        int year,
        int monthOfYear,
        int dayOfMonth) {
    this(context, 0, callBack, year, monthOfYear, dayOfMonth);
}

    /**
 * @param context The context the dialog is to run in.
 * @param theme the theme to apply to this dialog
 * @param callBack How the parent is notified that the date is set.
 * @param year The initial year of the dialog.
 * @param monthOfYear The initial month of the dialog.
 * @param dayOfMonth The initial day of the dialog.
 */
public DatePickerDialog(Context context,
        int theme,
        OnDateSetListener callBack,
        int year,
        int monthOfYear,
        int dayOfMonth) {
    super(context, theme);

    mCallBack = callBack;
    // ... rest of the constructor.
}

সুতরাং, কৌশলটি হ'ল nullশ্রোতার শ্রোতারূপে সংরক্ষণের জন্য সরবরাহ করা এবং তারপরে আপনার নিজের বোতামগুলির সেট সেট করুন (নীচে # 1 থেকে আসল কোডটি আপডেট করা হয়েছে):

    DatePickerDialog picker = new DatePickerDialog(
        this,
        null, // instead of a listener
        2012, 6, 15);
    picker.setCancelable(true);
    picker.setCanceledOnTouchOutside(true);
    picker.setButton(DialogInterface.BUTTON_POSITIVE, "OK",
        new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Log.d("Picker", "Correct behavior!");
            }
        });
    picker.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", 
        new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Log.d("Picker", "Cancel!");
            }
        });
picker.show();

এখন এটি উপরে কাজ করা সম্ভব সংশোধনের কারণে কাজ করবে।

এবং যেহেতু এটি যখনই পড়ে এটি DatePickerDialog.javaপরীক্ষা করে ( এপিআই 3 / 1.5 এর দিনগুলি দেখে মনে হচ্ছে --- অবশ্যই মধুচক্র পরীক্ষা করতে পারে না), এটি ব্যতিক্রমকে ট্রিগার করবে না। nullmCallbackললিপপ বিষয়টি সমাধান করে বিবেচনা করে, আমি এটি খতিয়ে দেখব না: কেবলমাত্র ডিফল্ট বাস্তবায়নটি ব্যবহার করুন (আমার সরবরাহিত ক্লাসে আচ্ছাদিত)।

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

পূর্ববর্তী API স্তরের সাথে সামঞ্জস্যতা (সম্পাদিত)

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

আমি কয়েকটি অনুমান নিয়েছি (বোতামের নাম ইত্যাদি) যা আমার প্রয়োজনের জন্য উপযুক্ত কারণ আমি ক্লায়েন্ট ক্লাসে বয়লারপ্লেট কোডটি সর্বনিম্নে হ্রাস করতে চেয়েছিলাম। সম্পূর্ণ ব্যবহারের উদাহরণ:

class YourActivity extends SherlockFragmentActivity implements OnDateSetListener

// ...

Bundle b = new Bundle();
b.putInt(DatePickerDialogFragment.YEAR, 2012);
b.putInt(DatePickerDialogFragment.MONTH, 6);
b.putInt(DatePickerDialogFragment.DATE, 17);
DialogFragment picker = new DatePickerDialogFragment();
picker.setArguments(b);
picker.show(getActivity().getSupportFragmentManager(), "fragment_date_picker");

11
গবেষণা নিয়ে দুর্দান্ত কাজ! দুঃখিত যে এটি প্রয়োজনীয় ছিল, তবে তবুও ভয়ঙ্কর।
কমন্সওয়েয়ার

1
খুব সুন্দর! আমি এই ইস্যুতে দেয়ালের বিপরীতে আমার মাথাকে হাতুড়ি দিচ্ছি যা আমার পাঠ্যক্ষেত্রগুলি আপডেট করে এবং সঠিক কলব্যাকগুলি কল করছে না / কল করছে। ধন্যবাদ! আমি ভাবছি যে প্রস্তাবিত কর্মক্ষেত্রটি "ভবিষ্যতের প্রমাণ" বা যদি আপনি মনে করেন যে বাগটি স্থির হওয়ার পরে এটি সমস্যার সৃষ্টি করবে?
স্প্যান

1
@ রোমাইনগুইডক্স শেষের দিকে আপডেট উত্তর দেখুন। লিঙ্কের বর্গটিতে কেবল জেলি শিমটিতে সেই পদ্ধতিটি কল করার জন্য স্মার্ট রয়েছে। নীচের যে কোনওটিতে এটি বাইপাস করবে এবং ডিফল্ট সিস্টেম প্রয়োগটি ব্যবহার করবে, আপনার ক্রিয়াকলাপের অনডেটসেটের জন্য সিস্টেম কলকে রাউটিং করবে। এটি ঠিক যে জেলি শিমের মধ্যে কলব্যাক রুট করার আগে এটি অতিরিক্ত ব্যবস্থা নেয় (বাগটি এড়ানো) এবং এর মধ্যে মধুচক্র + পদ্ধতিটি কল করা জড়িত। তবে আবার, কেবল জেবিতে।
ডেভিডসিএসবি

1
এখানে দুর্দান্ত কাজ। এই বিষয়টি কতটা হাস্যকর তার জন্য আমার কাছে শব্দ নেই।
বিল ফিলিপস

5
টাইমপিকার ডায়ালগ সম্পর্কে কীভাবে? দেখে মনে হচ্ছে টাইমপিকার ডায়ালগের একটি গেটটাইম পিকার নেই ()
লোকোক

16

ডেভিড সিজারিনো পোস্ট করা সমাধানটিতে আমি আমার নিজস্ব রাইফ যুক্ত করব, আপনি যদি টুকরোটি ব্যবহার করছেন না, এবং সমস্ত সংস্করণে এটি সমাধান করার একটি সহজ উপায় চান (২.১ থেকে ৪.১):

public class FixedDatePickerDialog extends DatePickerDialog {
  //I use a Calendar object to initialize it, but you can revert to Y,M,D easily
  public FixedDatePickerDialog(Calendar dateToShow, Context context, OnDateSetListener callBack) {
    super(context, null, dateToShow.get(YEAR), dateToShow.get(MONTH), dateToShow.get(DAY_OF_MONTH));
    initializePicker(callBack);
  }

  public FixedDatePickerDialog(Calendar dateToShow, Context context, int theme,
    OnDateSetListener callBack) {
    super(context, theme, null, dateToShow.get(YEAR), dateToShow.get(MONTH), dateToShow.get(DAY_OF_MONTH));
    initializePicker(callBack);
  }

  private void initializePicker(final OnDateSetListener callback) {
    try {
      //If you're only using Honeycomb+ then you can just call getDatePicker() instead of using reflection
      Field pickerField = DatePickerDialog.class.getDeclaredField("mDatePicker");
      pickerField.setAccessible(true);
      final DatePicker picker = (DatePicker) pickerField.get(this);
      this.setCancelable(true);
      this.setButton(DialogInterface.BUTTON_NEGATIVE, getContext().getText(android.R.string.cancel), (OnClickListener) null);
      this.setButton(DialogInterface.BUTTON_POSITIVE, getContext().getText(android.R.string.ok),
          new DialogInterface.OnClickListener() {
              @Override
              public void onClick(DialogInterface dialog, int which) {
                picker.clearFocus(); //Focus must be cleared so the value change listener is called
                callback.onDateSet(picker, picker.getYear(), picker.getMonth(), picker.getDayOfMonth());
              }
          });
    } catch (Exception e) { /* Reflection probably failed*/ }
  }
}

কেবল মনে রাখবেন: আপনি যদি বোতামের নামগুলি ঠিক করতে এবং বাতিল করতে শক্ত হয়ে থাকেন তবে ব্যবহারকারীর নিজস্ব পরিবর্তে মান android.R.string.okএবং android.R.string.cancelক্ষেত্রগুলি ব্যবহার করা আরও ভাল to এবং উত্তরের জন্য ধন্যবাদ।
ডেভিডসিএসবি

আহ, দুর্দান্ত, আমি খেয়াল করি না যে তারা ঠিক আছে এবং বাতিল পাঠ্য সরবরাহ করেছে। ধন্যবাদ!
dmon

সুপার (কনটেক্সট, থিম, নাল, ডেট টোশো.জেট (ইয়ার), ডেটটোশো.জেট (মাস), ডেট টোশো.জেট (DAY_OF_MONTH)) এ নালপয়েন্টার ব্যতিক্রম পাওয়া;
কিশোর

ত্রুটি ... তুমি কি নালিশ dateToShowপারছ? অন্য নালটি আসলে "ফিক্স" রয়েছে যাতে এটি হওয়া উচিত। আপনি কোন সংস্করণে আছেন?
dmon

আপনি কি দয়া করে আমাকে জানান যে importআপনার জন্য Fieldকি ছিল ? আমার কাছে 6 টি বিকল্প রয়েছে এবং সেগুলির কোনওটিই কাজ করে নি।
আদিল মালিক

8

ত্রুটি স্থির না হওয়া পর্যন্ত আমি ডেটপিকারডায়ালগ বা টাইমপিকারডায়ালগ ব্যবহার না করার পরামর্শ দিই। টাইমপিকার / ডেটপিকার উইজেট সহ কাস্টম তৈরি অ্যালার্টডায়ালগ ব্যবহার করুন;

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

    final TimePicker timePicker = new TimePicker(this);
    timePicker.setIs24HourView(true);
    timePicker.setCurrentHour(20);
    timePicker.setCurrentMinute(15);

    new AlertDialog.Builder(this)
            .setTitle("Test")
            .setPositiveButton(android.R.string.ok, new OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Log.d("Picker", timePicker.getCurrentHour() + ":"
                            + timePicker.getCurrentMinute());
                }
            })
            .setNegativeButton(android.R.string.cancel,
                    new OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            Log.d("Picker", "Cancelled!");
                        }
                    }).setView(timePicker).show();

এর সাথে ডেটপিকারডায়ালগ পরিবর্তন করুন;

    final DatePicker datePicker = new DatePicker(this);
    datePicker.init(2012, 10, 5, null);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        datePicker.setCalendarViewShown(false);
    }

    new AlertDialog.Builder(this)
            .setTitle("Test")
            .setPositiveButton(android.R.string.ok, new OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Log.d("Picker", datePicker.getYear() + " "
                            + (datePicker.getMonth() + 1) + " "
                            + datePicker.getDayOfMonth());
                }
            })
            .setNegativeButton(android.R.string.cancel,
                    new OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            Log.d("Picker", "Cancelled!");
                        }
                    }).setView(datePicker).show();

4

ডেভিড সিজারিনো সমাধানের ভিত্তিতে টাইমপিকারের জন্য একটি , "টিএল; ডিআর: 1-2- একটি বিশ্বব্যাপী সমাধানের জন্য মৃত সহজ পদক্ষেপ"

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

কলিং এবং শ্রোতার মূল সমাধান হিসাবে একই। শুধু অন্তর্ভুক্ত

import android.app.TimePickerDialog;
import android.app.TimePickerDialog.OnTimeSetListener;

অভিভাবক শ্রেণি প্রসারিত করুন,

... implements OnDateSetListener, OnTimeSetListener

বাস্তবায়ন

 @Override
 public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
 ...
 }

উদাহরণ কলিং

    Calendar cal = Calendar.getInstance();
    int hour = cal.get(Calendar.HOUR_OF_DAY);
    int minute = cal.get(Calendar.MINUTE);


    Bundle b = new Bundle();
    b.putInt(TimePickerDialogFragment.HOUR, hour);
    b.putInt(TimePickerDialogFragment.MINUTE, minute);

    DialogFragment picker = new TimePickerDialogFragment();
    picker.setArguments(b);
    picker.show(getSupportFragmentManager(), "frag_time_picker");

(বাতিল হ্যান্ডেল আপডেট করা হয়েছে)

public class TimePickerDialogFragment extends DialogFragment {

    public static final String HOUR = "Hour";
    public static final String MINUTE = "Minute";

    private boolean isCancelled = false; //Added to handle cancel
    private TimePickerDialog.OnTimeSetListener mListener;

    //Added to handle parent listener
    private TimePickerDialog.OnTimeSetListener mTimeSetListener = new TimePickerDialog.OnTimeSetListener() {
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            if (!isCancelled)
            {
                mListener.onTimeSet(view,hourOfDay,minute);
            }
        }
    };
    //
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        this.mListener = (TimePickerDialog.OnTimeSetListener) activity;
    }

    @Override
    public void onDetach() {
        this.mListener = null;
        super.onDetach();
    }

    @TargetApi(11)
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Bundle b = getArguments();
        int h = b.getInt(HOUR);
        int m = b.getInt(MINUTE);

        final TimePickerDialog picker = new TimePickerDialog(getActivity(), getConstructorListener(), h, m,DateFormat.is24HourFormat(getActivity()));

        //final TimePicker timePicker = new TimePicker(getBaseContext());
        if (hasJellyBeanAndAbove()) {
            picker.setButton(DialogInterface.BUTTON_POSITIVE,
                    getActivity().getString(android.R.string.ok),
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            isCancelled = false; //Cancel flag, used in mTimeSetListener
                        }
                    });
            picker.setButton(DialogInterface.BUTTON_NEGATIVE,
                    getActivity().getString(android.R.string.cancel),
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            isCancelled = true; //Cancel flag, used in mTimeSetListener
                        }
                    });
        }
        return picker;
    }
    private boolean hasJellyBeanAndAbove() {
        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
    }

    private TimePickerDialog.OnTimeSetListener getConstructorListener() {
        return hasJellyBeanAndAbove() ? mTimeSetListener : mListener; //instead of null, mTimeSetListener is returned.
    }
}


3

কেউ যদি দ্রুত কাজ করতে চান তবে আমি যে কোডটি ব্যবহার করেছি তা এখানে:

public void showCustomDatePicker () {

final DatePicker mDatePicker = (DatePicker) getLayoutInflater().
        inflate(R.layout.date_picker_view, null);
//Set an initial date for the picker
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
//Set the date now
mDatePicker.updateDate(year, month, day);

//create the dialog
AlertDialog.Builder mBuilder = new Builder(this);
//set the title
mBuilder.setTitle(getString(R.string.date_picker_title))
    //set our date picker
    .setView(mDatePicker)
    //set the buttons 
.setPositiveButton(android.R.string.ok, new OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
        //whatever method you choose to handle the date changes
            //the important thing to know is how to retrieve the data from the picker
        handleOnDateSet(mDatePicker.getYear(), 
                mDatePicker.getMonth(), 
                mDatePicker.getDayOfMonth());
    }
})
.setNegativeButton(android.R.string.cancel, new OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
        dialog.dismiss();
    }
})
//create the dialog and show it.
.create().show();

}

যেখানে লেআউট.ডেট_পিকার_দর্শনটি কেবলমাত্র ডেটপিকারের সাথে একটি সরল বিন্যাস সংস্থান কারণ এটি কেবলমাত্র উপাদান:

<!xml version="1.0" encoding="utf-8">
<DatePicker xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/date_picker"
android:layout_width="fill_parent"   
android:spinnersShown="true" 
android:calendarViewShown="false"
android:layout_height="fill_parent"/>

আপনার আগ্রহী হলে পুরো টিউটোরিয়ালটি এখানে ।


এটি আমার জন্য আশ্চর্যজনকভাবে কাজ করেছিল। সহজেই বোঝা যায়, কার্যকর করা সহজ! 4.4
এর্ডোমিস্টার

3

আমার সহজ সমাধান। আপনি যখন এটি পুনরায় গুলি চালাতে চান কেবল "রিসেটফায়ার্ড" চালান (আবার ডায়ালগটি খোলার সময় বলুন)।

private class FixedDatePickerDialogListener implements DatePickerDialog.OnDateSetListener{
    private boolean fired;

    public void resetFired(){
        fired = false;
    }

    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        if (fired) {
            Log.i("DatePicker", "Double fire occurred.");
            return;//ignore and return.
        } 
        //put your code here to handle onDateSet
        fired = true;//first time fired 
    }
}

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

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

সম্পর্কিত isJellyBeanOrAbove(), জেলিবিনের চেয়ে কম সংস্করণগুলিতে বাগটি নেই যা এই পুরো প্রশ্নটি সম্পর্কে রয়েছে এবং আমরা দ্বিতীয় কলটি ধরতে চাইলে কোডটি চলবে না যতক্ষণ না আমরা এই চেক তৈরি করি না, বিশ্বাস করুন, আমি চেষ্টা করেছি আমার এমুলেটর এবং আসল ডিভাইসগুলিতে কোড (বিভিন্ন সংস্করণ সহ) বেশ কয়েকবার এবং এটি একটি
কবজির

আমি নিশ্চিত নই যে এটি ডাউন ডাউনের পক্ষে মূল্যবান কিনা। আমি এটি 2 বছর আগে পোস্ট করেছি, এটি তখন থেকে ঠিকঠাক কাজ করার পরে আমাদের বাণিজ্যিক প্রয়োগে রয়েছে। আমাদের কিউএ দল বা আমাদের হাজার হাজার ব্যবহারকারী দ্বারা কোনও বাগ রিপোর্ট করা হয়নি। এটি লোকেদের প্রসারিত করতে পারে এমন একটি সহজ উত্তর হিসাবে বোঝানো হয়। আপনি পুনরায় গুলি চালাতে চাইলে "রিসেটফায়ার্ড" কল করুন।
ড্যানিয়েল রায়ান

আমাদের অ্যাপ্লিকেশনটিতে "isJellyBeanOrAbove" দরকার নেই। আপনি যদি সঠিক অঞ্চলে "রিসেটফায়ারড" কল করেন তবে অ্যাপ্লিকেশনটি সমস্ত সংস্করণে ঠিক কাজ করবে।
ড্যানিয়েল রায়ান

3

অনুরূপ ইস্যুতে অঙ্কুর চৌধুরীর উজ্জ্বল জবাব অনুসারে TimePickerDialog, onDateSetপ্রদত্ত দৃষ্টিভঙ্গিটি যদি আমরা ভিতরে যাচাই করে থাকি তবে isShown()এটি সংক্ষিপ্ত প্রচেষ্টা দিয়ে পুরো সমস্যাটি সমাধান করবে, পিকারের সম্প্রসারণ বা কোডের আশেপাশে কিছু জঘন্য পতাকা পরীক্ষা করার প্রয়োজন নেই with অথবা এমনকি ওএস সংস্করণের জন্য যাচাই করা, কেবল নিম্নলিখিতটি করুন:

public void onDateSet(DatePicker view, int year, int month, int day) {
    if (view.isShown()) {
        // read the date here :)
    }
}

এবং অবশ্যই onTimeSetঅঙ্কুরের উত্তর অনুসারে এটি করা যেতে পারে


1
অন্য সব থেকে সেরা উত্তর!
hiew1

2

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

যখন ডায়লগ বা পিছনের বোতামের বাইরে ব্যবহারকারী স্পর্শ করে তখনই অনক্যান্সেল কল হয়। onDismiss সর্বদা ডাকা হয়

অনক্যান্সাল পদ্ধতিতে একটি পতাকা সেট করা ব্যবহারকারীর অভিপ্রায়টি অন ডিসমিস পদ্ধতিতে ফিল্টার করতে সহায়তা করে: ক্রিয়া বাতিল করুন বা সম্পাদিত ক্রিয়াটি। কিছু কোডের নীচে যা ধারণাটি দেখায়।

public class DatePickerDialogFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

    private boolean cancelDialog = false;
    private int year;
    private int month;
    private int day;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        DatePickerDialog dpd = new DatePickerDialog(getActivity(), this, year, month, day);
        return dpd;
    }

    public void setDatePickerDate(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    @Override
    public void onCancel(DialogInterface dialog) {
        super.onCancel(dialog);
        cancelDialog = true;
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
        if (!cancelDialog) {
          #put the code you want to execute if the user clicks the done button
        }
    }

    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        setDatePickerDate(year, monthOfYear, dayOfMonth);
    }
}

1

যদি আপনার অ্যাপ্লিকেশনটি অ্যাকশন বারটি ব্যবহার না করে তবে খুব সহজ কাজ রয়েছে। উপায় দ্বারা নোট করুন, কিছু অ্যাপ্লিকেশন কাজ করার জন্য এই কার্যকারিতাটির উপর নির্ভর করে, কারণ তারিখ বাছাইকারীকে বাতিল করার একটি বিশেষ অর্থ রয়েছে (উদাহরণস্বরূপ এটি খালি স্ট্রিংয়ের সাথে তারিখের ক্ষেত্রটি সাফ করে, যা কিছু অ্যাপ্লিকেশানের জন্য বৈধ এবং অর্থবহ ধরণের ইনপুট) ) এবং তারিখটি ঠিক আছে কি না তা দুইবার নির্ধারণ করা থেকে বিরত রাখতে বুুলিয়ান পতাকা ব্যবহার করা আপনাকে এই ক্ষেত্রে সহায়তা করবে না।

করছেন। আসল ফিক্স, আপনাকে নতুন বোতাম বা আপনার নিজস্ব ডায়ালগ তৈরি করতে হবে না। পয়েন্টটি উভয়ের সাথেই সামঞ্জস্যপূর্ণ হতে হবে, অ্যান্ড্রয়েডের পুরানো সংস্করণগুলি, বগিগুলি (4)। ) এবং ভবিষ্যতের যদিও পরবর্তীগুলি অবশ্যই নিশ্চিত হওয়া অসম্ভব। অ্যান্ড্রয়েড 2 এ নোট করুন। , android.app.Dialog এর জন্য অনটপ () কিছুই করে না এবং ৪. * এ এটি mActionBar.setShowHideAnimationEnabled (মিথ্যা) করে যা আপনার অ্যাপ্লিকেশনটিতে অ্যাকশন বার থাকলেই গুরুত্বপূর্ণ। ডায়ালটকের উত্তরাধিকার সূত্রে ডেটপিকারডায়ালগের অনটপ () কেবলমাত্র এমডেটপিকার.ক্রিয়ারফোকস () (অ্যান্ড্রয়েড উত্স 4.3 এর সর্বশেষতম সমাধান হিসাবে) অবদান রাখে, যা অপরিহার্য বলে মনে হয় না।

অতএব অনটপ () টি এমন একটি পদ্ধতির সাথে প্রতিস্থাপন করে যা অনেক ক্ষেত্রেই আপনার অ্যাপ্লিকেশনটি ঠিক করে না এবং এটি নিশ্চিত হয়ে যায় যে এটি ভবিষ্যতের জন্যও তাই থাকবে remain সুতরাং আপনার নিজের সাথে ডেটপিকারডায়ালগ ক্লাসটি প্রসারিত করুন এবং অনিস্টপ অনোরাইটিং () একটি ডামি পদ্ধতিতে it আপনার প্রয়োজনীয়তা অনুসারে আপনাকে এক বা দুটি কনস্ট্রাক্টর সরবরাহ করতে হবে। আরও মনে রাখবেন যে, উদাহরণস্বরূপ ক্রিয়াকলাপ বারের সাথে কিছু করার চেষ্টা করার মাধ্যমে কারও এই ফিক্সটিকে অতিরিক্ত করার চেষ্টা করার প্রলোভন করা উচিত নয়, কারণ এটি আপনার সামঞ্জস্যতা কেবল অ্যান্ড্রয়েডের সর্বশেষ সংস্করণে সীমাবদ্ধ করবে। এছাড়াও নোট করুন যে ডেটপিকারের অনটপ () ব্যবহারের জন্য সুপারটি কল করা ভাল লাগবে কারণ বাগটি কেবল ডেটপিকারডায়ালগের অনসটপে () থাকে তবে ডেটপিকারডায়ালগের সুপার ক্লাসে নয়। তবে এর জন্য আপনাকে আপনার কাস্টম ক্লাস থেকে সুপার.সুপার.অনস্টপ () কল করতে হবে, যা জাভা আপনাকে করতে দেয় না, যেমন এটি এনক্যাপসুলেশন দর্শনের বিরুদ্ধে যায় :) নীচে আমার ছোট্ট ক্লাস যা আমি ডেটপিকারডায়ালগ যাচাই করতাম used আমি আশা করি এই মন্তব্যটি কারও পক্ষে কার্যকর হবে। ওয়াজটেক জারোস

public class myDatePickerDialog extends DatePickerDialog {

public myDatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) {
    super(context, callBack, year, monthOfYear, dayOfMonth);
}

@Override
protected void onStop() {
    // Replacing tryNotifyDateSet() with nothing - this is a workaround for Android bug https://android-review.googlesource.com/#/c/61270/A

    // Would also like to clear focus, but we cannot get at the private members, so we do nothing.  It seems to do no harm...
    // mDatePicker.clearFocus();

    // Now we would like to call super on onStop(), but actually what we would mean is super.super, because
    // it is super.onStop() that we are trying NOT to run, because it is buggy.  However, doing such a thing
    // in Java is not allowed, as it goes against the philosophy of encapsulation (the Creators never thought
    // that we might have to patch parent classes from the bottom up :)
    // However, we do not lose much by doing nothing at all, because in Android 2.* onStop() in androd.app.Dialog //actually
    // does nothing and in 4.* it does:
    //      if (mActionBar != null) mActionBar.setShowHideAnimationEnabled(false); 
    // which is not essential for us here because we use no action bar... QED
    // So we do nothing and we intend to keep this workaround forever because of users with older devices, who might
    // run Android 4.1 - 4.3 for some time to come, even if the bug is fixed in later versions of Android.
}   

}


এমনকি যদি অ্যাকশনবার ব্যবহার করা হয় তবে আপনি যদি অ্যাকশনবারটি কখনও আড়াল / প্রদর্শন না করেন তবে এটি সম্ভবত একটি গ্রহণযোগ্য কাজ হতে পারে। জিনিসগুলিকে অতিরিক্ত সুরক্ষিত করার জন্য আপনি অন স্টার্টকেও কিছু না করার জন্য ওভাররাইড করতে পারেন (তারপরে অ্যানিমেশনের জন্য কলগুলি নিরাপদে অশুভ করা হবে)। এমনকি আপনি এটি লুকিয়ে / দেখিয়ে ফেললেও, এটি কেবলমাত্র অ্যানিমেশন যা অক্ষম।
ড্যানিয়েল

0


নীচের ধারণাগুলি চেষ্টা করুন।

DatePickerDialog picker = new DatePickerDialog(
        this,
        new OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker v, int y, int m, int d) {
                Log.d("Picker", "Set!");
            }
        },
        2012, 6, 15);
picker.show();


অনডেটসেট () পদ্ধতিটি দু'বার কল করে (যদি আপনি এমুলেটর.আইটি কলগুলিতে দুবার পরীক্ষা করে দেখছেন I যদি সত্য ডিভাইসটি ব্যবহার করে থাকেন তবে এটি সঠিকভাবে একক সময় কল করবে you আপনি যদি এমুলেটর ব্যবহার করছেন তবে কাউন্টারটি ব্যবহার করুন you আপনি যদি সত্যিকারের ডিভাইসে কাজ করছেন তবে কাউন্টার ভেরিয়েবলটিকে অগ্রাহ্য করুন real বাস্তব ডিভাইসের জন্য এটি আমার জন্য কাজ করছে।)
যখন ডেটপিকারডায়ালগের ব্যবহারকারী বোতামটি ক্লিক করেন।
এর জন্য আপনার পাল্টা মান বজায় রাখা উচিত এবং যখন মথড প্রথমবার কল করবে এবং যখন পদ্ধতিটি দ্বিতীয়বার কল করবে তখন অপারেশন করা উচিত।
নীচের কোডিং স্নিপেটগুলি দেখুন

   static int counter=0;       //Counter will be declared globally.

    DatePickerDialog picker = new DatePickerDialog(
            this,
            new OnDateSetListener() {
                @Override
                public void onDateSet(DatePicker v, int y, int m, int d) {

                   counter++;
                   if(counter==1) return;
                   counter=0;
                   //Do the operations here

                }
            },
            2012, 6, 15);
    picker.show();



ডেটপিকারটি বাতিল করার জন্য এটি আমার জন্য কাজ করছে em

DialogInterface.OnClickListener dialogOnClickListener=new DialogInterface.OnClickListener()
        {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub

                if(which==Dialog.BUTTON_NEGATIVE)
                {
                    Log.i(tagName, "dialog negative button clicked");
                    dialog.dismiss();
                }

            }

        };

        mDatePickerDialog.setButton(Dialog.BUTTON_NEGATIVE, "Cancel", dialogOnClickListener);


এটি আমার পক্ষে সত্যিকারের ডিভাইসের জন্য কাজ করছে em তবে এমুলেটরটি সঠিকভাবে কাজ করছে না I আমি মনে করি এটি একটি অ্যান্ড্রয়েড এমুলেটর বাগ g


0

একটি সহজ সমাধান দ্বিতীয় রান এড়াতে একটি বুলিয়ান ব্যবহার করা হবে

boolean isShow = false; // define global variable


// when showing time picker
TimePickerDialog timeDlg = new TimePickerDialog( this, new OnTimeSetListener()
            {

                @Override
                public void onTimeSet( TimePicker view, int hourOfDay, int minute )
                {
                    if ( isShow )
                    {
                        isShow = false;
                        // your code
                    }

                }
            }, 8, 30, false );

timeDlg.setButton( TimePickerDialog.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick( DialogInterface dialog, int which )
                {
                    isShow = false;
                }
            } );
timeDlg.setButton( TimePickerDialog.BUTTON_POSITIVE, "Set", new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick( DialogInterface dialog, int which )
                {
                    isShow = true;
                }
            } );

timeDlg.show();

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

যদি আমি যথেষ্ট সাফ না হয়ে থাকি তবে আমাকে থাকতে দিন: ডায়ালগ কলগুলি বাতিল করতে টিপুন onDateSet। এইভাবে, ভাঙ্গা।
ডেভিডসিএসবি

ত্রুটি দেখানোর জন্য আপনাকে ধন্যবাদ। আমি উত্তরটি সম্পাদনা করি যাতে এটি পিছনে বোতামটি দিয়ে কাজ করবে। আপনার উত্তরটি কাজ করছে তবে ডেটপিকার ডিপি = পিকার.সেটডেটপিকার (); গেটটাইমপিকার () পদ্ধতিটি যুক্ত না হওয়ায় টাইমপিকার্সের সাথে কাজ করছে না। সুতরাং এটি একটি বৈধ উত্তর হবে
চামিকাও

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

0

নেতিবাচক ব্যবহারকারীর ক্রিয়াগুলি সনাক্ত করতে আপনি onCancel () ওভাররাইড করতে পারেন এবং setOnDismissListener () ব্যবহার করতে পারেন। এবং একটি ডেটপিকারডায়ালগ.বুটোনপোসিটিসিওটি সহ আপনি জানেন যে ব্যবহারকারী একটি নতুন তারিখ নির্ধারণ করতে চায়।

 DatePickerDialog mDPD = new DatePickerDialog(
                      getActivity(), mOnDateSetListener, mYear, mMonth, mDay);
 mDPD.setOnCancelListener(new OnCancelListener() {
    @Override
    public void onCancel(DialogInterface dialog) {
        // do something onCancek
        setDate = false;
    }
 });

 mDPD.setOnDismissListener(new OnDismissListener() {
    @Override
    public void onDismiss(DialogInterface arg0) {
        // do something onDismiss
        setDate = false;
    }
});

mDPD.setButton(DatePickerDialog.BUTTON_POSITIVE, "Finish", new DatePickerDialog.OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
        // user set new date
        setDate = true;
    }
});

তারপরে সেটডেটের জন্য পরীক্ষা করুন:

public void onDateSet(DatePicker view, int year, int month, int day) {
    if(setDate){
        //do something with new date
    }
}

0

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

ব্যবহার করুন:

new FixedDatePickerDialog(this,
            new FixedOnDateSetListener() {

                @Override
                public void onDateSet(DatePicker view, int year,
                        int monthOfYear, int dayOfMonth) {
                    if (isOkSelected()) {
                        // when DONE button is clicked
                    }
                }

            }, year, month, day).show();

ক্লাস:

public class FixedDatePickerDialog extends DatePickerDialog {
private final FixedOnDateSetListener fixedCallback;
public FixedDatePickerDialog(Context context,
        FixedOnDateSetListener callBack, int year, int monthOfYear,
        int dayOfMonth) {
    super(context, callBack, year, monthOfYear, dayOfMonth);
    fixedCallback = callBack;
    this.setButton(DialogInterface.BUTTON_NEGATIVE,
            context.getString(R.string.cancel), this);
    this.setButton(DialogInterface.BUTTON_POSITIVE,
            context.getString(R.string.done), this);
}

@Override
public void onClick(DialogInterface dialog, int which) {
    if (which == BUTTON_POSITIVE) {
        fixedCallback.setOkSelected(true);
    } else {
        fixedCallback.setOkSelected(false);
    }
    super.onClick(dialog, which);
}

public abstract static class FixedOnDateSetListener implements
        OnDateSetListener {
    private boolean okSelected = false;

    @Override
    abstract public void onDateSet(DatePicker view, int year,
            int monthOfYear, int dayOfMonth);

    public void setOkSelected(boolean okSelected) {
        this.okSelected = okSelected;
    }

    public boolean isOkSelected() {
        return okSelected;
    }
}

}


0

আমি তারিখ পিকার, সময় পিকার এবং সংখ্যা পিকার ব্যবহার করছি। নম্বর পিকাররা কল করে ওয়ালিউচেন্জড যখনই ব্যবহারকারী কোনও নম্বর নির্বাচন করেন, পিকারটি বরখাস্ত হওয়ার আগে, সুতরাং পিকারকে বরখাস্ত করা হলেই মানটির সাথে কিছু করার জন্য আমার ইতিমধ্যে এর কাঠামো ছিল:

public int interimValue;
public int finalValue;

public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
    this.interimValue = newVal;
}

public void onDismiss(DialogInterface dialog) {
    super.onDismiss(dialog);
    this.finalValue = this.interimValue;
}

কোন বোতামটি ক্লিক করা হয়েছিল তা দেখার যুক্তি দিয়ে আমি আমার বাটনগুলির জন্য কাস্টম অন ক্লিক ক্লিষ্টলিস্টার সেট করতে এটি প্রসারিত করেছি। আমি আমার চূড়ান্ত মান সেট করার আগে এখন কোন বোতামটি টেপ করা হয়েছিল তা আমি পরীক্ষা করতে পারি:

public int interimValue;
public int finalValue;
public boolean saveButtonClicked;

public void setup() {
    picker.setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.BUTTON_SAVE), new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            picker.onClick(dialog, which); // added for Android 5.0
            onButtonClicked(true);
        }
    });
    picker.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.BUTTON_CANCEL), new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            picker.onClick(dialog, which); // added for Android 5.0
            onButtonClicked(false);
        }
    });
}

public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
    this.interimValue = newVal;
}

public void onButtonClicked(boolean save) {
    this.saveButtonClicked = save;
}

public void onDismiss(DialogInterface dialog) {
    super.onDismiss(dialog);
    if (this.saveButtonClicked) {
        // save
        this.finalValue = this.interimValue;
    } else {
        // cancel
    }
}

এবং তারপরে আমি প্রসারিত করেছি যে তারিখ এবং সময় বাছাইয়ের জন্য তারিখ এবং সময় ধরণের পাশাপাশি সংখ্যা বাছাইকারীদের জন্য টাইপ টাইপের সাথে কাজ করতে।

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

ললিপপের জন্য আপডেট: দৃশ্যত এই ত্রুটিটি সমস্ত অ্যান্ড্রয়েড ৪.১-৪.৪ ডিভাইসে ঘটে না, কারণ আমি এমন ব্যবহারকারীদের কাছ থেকে কয়েকটি প্রতিবেদন পেয়েছি যাদের তারিখ এবং সময় বাছাইকারীরা অনডেটসেট এবং অনটাইমসেট কলব্যাক কল করছে না। এবং বাগটি আনুষ্ঠানিকভাবে অ্যান্ড্রয়েড 5.0 এ ঠিক করা হয়েছিল। আমার পদ্ধতিটি কেবলমাত্র সেই ডিভাইসগুলিতেই কাজ করেছিল যেখানে বাগটি উপস্থিত রয়েছে, কারণ আমার কাস্টম বোতামগুলি ডায়ালগের অনক্লিক হ্যান্ডলারটি কল করে না, এটি কেবলমাত্র বাগ যেখানে উপস্থিত নেই তখন অনডেটসেট এবং অনটাইমসেট বলা হয়। ডায়লগটির অনক্লিককে কল করতে আমি আমার উপরের কোডটি আপডেট করেছি, তাই এখন বাগটি উপস্থিত কিনা তা এখন কাজ করে।


0

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

এটি এপিআই স্তরের 3 এবং উচ্চতর ক্ষেত্রে কাজ করা উচিত। সুতরাং, মূলত অ্যান্ড্রয়েডের যে কোনও সংস্করণ (আমি এটি জেলিবিন এবং ললিপপগুলিতে বিশেষভাবে পরীক্ষা করেছি)।

DatePickerDialog:

package snappy_company_name_here;

import android.content.Context;
import android.content.DialogInterface;
import android.widget.DatePicker;

/**
 * This is a modified version of DatePickerDialog that correctly handles cancellation behavior since it's broken on jellybean and
 * kitkat date pickers.
 *
 * Here is the bug: http://code.google.com/p/android/issues/detail?id=34833
 * Here is an SO post with a bunch of details: http://stackoverflow.com/questions/11444238/jelly-bean-datepickerdialog-is-there-a-way-to-cancel
 *
 * @author stuckj, created on 5/5/15.
 */
public class DatePickerDialog extends android.app.DatePickerDialog implements DialogInterface.OnClickListener
{
    final CallbackHelper callbackHelper;

    // NOTE: Must be static since we're using it in a super constructor call. Which is annoying, but necessary
    private static class CallbackHelper implements OnDateSetListener
    {
        private final OnDateSetListener callBack;
        private boolean dialogButtonPressHandled = false; // To prevent setting the date when the dialog is dismissed...

        // NOTE: Must be static since we're using it in a super constructor call. Which is annoying, but necessary
        public CallbackHelper(final OnDateSetListener callBack)
        {
            this.callBack = callBack;
        }

        @Override
        public void onDateSet(final DatePicker view, final int year, final int monthOfYear, final int dayOfMonth)
        {
            if (!dialogButtonPressHandled && (callBack != null))
            {
                callBack.onDateSet(view, year, monthOfYear, dayOfMonth);
            }
        }
    }

    /**
     * Sets the positive and negative buttons to use the dialog callbacks we define.
     */
    private void setButtons(final Context context)
    {
        setButton(DialogInterface.BUTTON_NEGATIVE, context.getString(android.R.string.cancel), this);
        setButton(DialogInterface.BUTTON_POSITIVE, context.getString(android.R.string.ok), this);
    }

    @Override
    public void onClick(final DialogInterface dialog, final int which)
    {
        // ONLY call the super method in the positive case...
        if (which == DialogInterface.BUTTON_POSITIVE)
        {
            super.onClick(dialog, which);
        }

        callbackHelper.dialogButtonPressHandled = true;
    }

    @Override
    public void onBackPressed()
    {
        getButton(DialogInterface.BUTTON_NEGATIVE).performClick();
    }

    // Need this so we can both pass callbackHelper to the super class and save it off as a variable.
    private DatePickerDialog(final Context context,
                             final OnDateSetListener callBack,
                             final int year,
                             final int monthOfYear,
                             final int dayOfMonth,
                             final CallbackHelper callbackHelper)
    {
        super(context, callbackHelper, year, monthOfYear, dayOfMonth);
        this.callbackHelper = callbackHelper;
        setButtons(context);
    }

    /**
     * @param context The context the dialog is to run in.
     * @param callBack How the parent is notified that the date is set.
     * @param year The initial year of the dialog.
     * @param monthOfYear The initial month of the dialog.
     * @param dayOfMonth The initial day of the dialog.
     */
    public DatePickerDialog(final Context context,
                            final OnDateSetListener callBack,
                            final int year,
                            final int monthOfYear,
                            final int dayOfMonth)
    {
        this(context, callBack, year, monthOfYear, dayOfMonth, new CallbackHelper(callBack));
    }

    // Need this so we can both pass callbackHelper to the super class and save it off as a variable.
    private DatePickerDialog(final Context context, final int theme, final OnDateSetListener listener, final int year,
                             final int monthOfYear, final int dayOfMonth, final CallbackHelper callbackHelper)
    {
        super(context, theme, callbackHelper, year, monthOfYear, dayOfMonth);
        this.callbackHelper = callbackHelper;
        setButtons(context);
    }

    /**
     * @param context The context the dialog is to run in.
     * @param theme the theme to apply to this dialog
     * @param listener How the parent is notified that the date is set.
     * @param year The initial year of the dialog.
     * @param monthOfYear The initial month of the dialog.
     * @param dayOfMonth The initial day of the dialog.
     */
    public DatePickerDialog(final Context context, final int theme, final OnDateSetListener listener, final int year,
                            final int monthOfYear, final int dayOfMonth)
    {
        this(context, theme, listener, year, monthOfYear, dayOfMonth, new CallbackHelper(listener));
    }
}

TimePickerDialog:

package snappy_company_name_here;

import android.content.Context;
import android.content.DialogInterface;
import android.widget.TimePicker;

/**
 * This is a modified version of TimePickerDialog that correctly handles cancellation behavior since it's broken on jellybean and
 * kitkat date pickers.
 *
 * Here is the bug: http://code.google.com/p/android/issues/detail?id=34833
 * Here is an SO post with a bunch of details: http://stackoverflow.com/questions/11444238/jelly-bean-datepickerdialog-is-there-a-way-to-cancel
 *
 * @author stuckj, created on 5/5/15.
 */
public class TimePickerDialog extends android.app.TimePickerDialog implements DialogInterface.OnClickListener
{
    final CallbackHelper callbackHelper;

    // NOTE: Must be static since we're using it in a super constructor call. Which is annoying, but necessary
    private static class CallbackHelper implements OnTimeSetListener
    {
        private final OnTimeSetListener callBack;
        private boolean dialogButtonPressHandled = false; // To prevent setting the date when the dialog is dismissed...

        // NOTE: Must be static since we're using it in a super constructor call. Which is annoying, but necessary
        public CallbackHelper(final OnTimeSetListener callBack)
        {
            this.callBack = callBack;
        }

        @Override
        public void onTimeSet(final TimePicker view, final int hourOfDay, final int minute)
        {
            if (!dialogButtonPressHandled && (callBack != null))
            {
                callBack.onTimeSet(view, hourOfDay, minute);
            }
        }
    }

    /**
     * Sets the positive and negative buttons to use the dialog callbacks we define.
     */
    private void setButtons(final Context context)
    {
        setButton(DialogInterface.BUTTON_NEGATIVE, context.getString(android.R.string.cancel), this);
        setButton(DialogInterface.BUTTON_POSITIVE, context.getString(android.R.string.ok), this);
    }

    @Override
    public void onClick(final DialogInterface dialog, final int which)
    {
        // ONLY call the super method in the positive case...
        if (which == DialogInterface.BUTTON_POSITIVE)
        {
            super.onClick(dialog, which);
        }

        callbackHelper.dialogButtonPressHandled = true;
    }

    @Override
    public void onBackPressed()
    {
        getButton(DialogInterface.BUTTON_NEGATIVE).performClick();
    }

    // Need this so we can both pass callbackHelper to the super class and save it off as a variable.
    private  TimePickerDialog(final Context context,
                              final OnTimeSetListener callBack,
                              final int hourOfDay, final int minute, final boolean is24HourView, final CallbackHelper callbackHelper)
    {
        super(context, callbackHelper, hourOfDay, minute, is24HourView);
        this.callbackHelper = callbackHelper;
        setButtons(context);
    }

    /**
     * @param context Parent.
     * @param callBack How parent is notified.
     * @param hourOfDay The initial hour.
     * @param minute The initial minute.
     * @param is24HourView Whether this is a 24 hour view, or AM/PM.
     */
    public TimePickerDialog(final Context context,
                            final OnTimeSetListener callBack,
                            final int hourOfDay, final int minute, final boolean is24HourView)
    {
        this(context, callBack, hourOfDay, minute, is24HourView, new CallbackHelper(callBack));
    }

    // Need this so we can both pass callbackHelper to the super class and save it off as a variable.
    private TimePickerDialog(final Context context, final int theme, final OnTimeSetListener callBack, final int hourOfDay,
                            final int minute, final boolean is24HourView, final CallbackHelper callbackHelper)
    {
        super(context, theme, callbackHelper, hourOfDay, minute, is24HourView);
        this.callbackHelper = callbackHelper;
        setButtons(context);
    }

    /**
     * @param context Parent.
     * @param theme the theme to apply to this dialog
     * @param callBack How parent is notified.
     * @param hourOfDay The initial hour.
     * @param minute The initial minute.
     * @param is24HourView Whether this is a 24 hour view, or AM/PM.
     */
    public TimePickerDialog(final Context context, final int theme, final OnTimeSetListener callBack, final int hourOfDay,
                            final int minute, final boolean is24HourView)
    {
        this(context, theme, callBack, hourOfDay, minute, is24HourView, new CallbackHelper(callBack));
    }
}

এটি উপরের সমুদ্রের উত্তরের সাথে বেশ মিল।
আটকে

0

ল্যাম্বদা এক্সপ্রেশনগুলি ব্যবহার করে ক্লিয়ারবটনের সাথে আমার কাজের সংস্করণ:

public class DatePickerFragment extends DialogFragment {
    private OnDateSelectListener dateSelectListener;
    private OnDateClearListener dateClearListener;

    public void setDateSelectListener(OnDateSelectListener dateSelectListener) {
        this.dateSelectListener = dateSelectListener;
    }

    public void setDateClearListener(OnDateClearListener dateClearListener) {
        this.dateClearListener = dateClearListener;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        // Create a new instance of DatePickerDialog and return it
        DatePickerDialog dialog = new DatePickerDialog(getActivity(), null, year, month, day);
        dialog.setCancelable(true);
        dialog.setCanceledOnTouchOutside(true);
        dialog.setTitle("Select Date");
        dialog.setButton(BUTTON_POSITIVE, ("Done"), (dialog1, which) -> {
            DatePicker dp = dialog.getDatePicker();
            dialog.dismiss();
            dateSelectListener.onDateSelect(dp.getYear(), dp.getMonth(), dp.getDayOfMonth());
        });
        dialog.setButton(BUTTON_NEUTRAL, ("Clear"), (dialog1, which) -> {
            dialog.dismiss();
            dateClearListener.onDateClear();
        });
        dialog.setButton(BUTTON_NEGATIVE, ("Cancel"), (dialog1, which) -> {
            if (which == DialogInterface.BUTTON_NEGATIVE) {
                dialog.cancel();
            }
        });
        dialog.getDatePicker().setCalendarViewShown(false);
        return dialog;
    }


    public interface OnDateClearListener {
        void onDateClear();
    }

    public interface OnDateSelectListener {
        void onDateSelect(int year, int monthOfYear, int dayOfMonth);
    }
}

0

টাইমপিকারডায়ালগের জন্য নিম্নোক্তভাবে কাজটি করা যেতে পারে:

TimePickerDialog createTimePickerDialog(Context context, int themeResId, TimePickerDialog.OnTimeSetListener orignalListener,
                                                         int hourOfDay, int minute, boolean is24HourView) {
        class KitKatTimeSetListener implements TimePickerDialog.OnTimeSetListener {
            private int hour;
            private int minute;

            private KitKatTimeSetListener() {
            }

            @Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                this.hour = hourOfDay;
                this.minute = minute;
            }

            private int getHour() { return hour; }
            private int getMinute() {return minute; }
        };

        KitKatTimeSetListener kitkatTimeSetListener = new KitKatTimeSetListener();
        TimePickerDialog timePickerDialog = new TimePickerDialog(context, themeResId, kitkatTimeSetListener, hourOfDay, minute, is24HourView);

        timePickerDialog.setButton(DialogInterface.BUTTON_POSITIVE, context.getString(android.R.string.ok), (dialog, which) -> {
            timePickerDialog.onClick(timePickerDialog, DialogInterface.BUTTON_POSITIVE);
            orignalListener.onTimeSet(new TimePicker(context), kitkatTimeSetListener.getHour(), kitkatTimeSetListener.getMinute());
            dialog.cancel();
        });
        timePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, context.getString(android.R.string.cancel), (dialog, which) -> {
            dialog.cancel();
        });

        return timePickerDialog;
    }

আমি সমস্ত ইভেন্টগুলি KitKatSetTimeListener মোড়ানোর জন্য প্রেরণ করি এবং BUTTON_POSITIVE ক্লিক করার ক্ষেত্রে কেবলমাত্র মূল অনটাইমসেটলিস্টারে ফায়ার করব।


0

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

datePickerDialog = new DatePickerDialog(getContext(), null, dateSearch.get(Calendar.YEAR), dateSearch.get(Calendar.MONTH), dateSearch.get(Calendar.DAY_OF_MONTH));
    datePickerDialog.setCancelable(false);
    datePickerDialog.setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.dialog_ok), new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Log.d("Debug", "Correct");
            onDateSearchSetListener.onDateSet(datePickerDialog.getDatePicker(), datePickerDialog.getDatePicker().getYear(), datePickerDialog.getDatePicker().getMonth(), datePickerDialog.getDatePicker().getDayOfMonth());
        }
    });
    datePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.dialog_cancel), new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Log.d("Debug", "Cancel");
            dialog.dismiss();
        }
    });

-1

আমি জানি এই পোস্টটি এখানে প্রায় এক বছর ধরে রয়েছে তবে আমি ভেবেছিলাম আমার অনুসন্ধানগুলি পোস্ট করা উচিত। আপনি এখনও শ্রোতাকে রাখতে পারেন (এটি স্থির করে দেওয়ার পরিবর্তে) এবং প্রত্যাশার মতো এখনও এই কাজটি করতে পারেন। কীটি হ'ল স্পষ্টত "ঠিক আছে" বা (এবং) "বাতিল" বোতামগুলি সেট করে। আমি এটি পরীক্ষা করেছি এবং এটি আমার জন্য কৃতজ্ঞতার সাথে কাজ করে। শ্রোতা দু'বার বরখাস্ত হয় না।

এই উদাহরণটি দেখুন,

private void setTime(){
final Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);

final TimePickerDialog timepicker = new TimePickerDialog(this.getActivity(),
        timePickerListener,
        hour, 
        minute, 
        DateFormat.is24HourFormat(getActivity()));

timepicker.setButton(DialogInterface.BUTTON_POSITIVE, "Print", new    
    android.content.DialogInterface.OnClickListener(){
        @Override
        public void onClick(DialogInterface dialog,int which) {
            print = true;
            timepicker.dismiss();           
        }
});

timepicker.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new 
    android.content.DialogInterface.OnClickListener(){
        @Override
        public void onClick(DialogInterface dialog,int which){
            print = false;
            timepicker.dismiss();       
        }
});

timepicker.setCancelable(false);
timepicker.show();
}

সাধারণ এবং সরল, এটি আপনার বলার মতো কাজ করে না। timePickerListenerআপনার কথোপকথনে আপনি যা করেন তা নির্বিশেষে এখনও তাকে বলা হয়। আমি এমনকি জানি পরীক্ষা করার প্রয়োজন হবে না, আপনি শুধু তাকান প্রয়োজন সূত্র আপনাকে এটা সেট না করেন: null, tryNotifyTimeSet()শ্রোতা এর ডাকব onTimeSet()তার উভয় onClick()এবং onStop()
ডেভিডসিএসবি

অন্য কথায়, নেটিভ ক্লাসটি আপনার শ্রোতার কাছে কোনও রেফারেন্স রাখতে দেয় না (অর্থাত্ এটি কনস্ট্রাক্টারে পাস করা)। আপনি কীভাবে বাটনগুলি মোকাবেলা করবেন তা অপ্রাসঙ্গিক।
ডেভিডসিএসবি

হাই ডেভিড, আপনি এটি পরীক্ষা করেন নি এবং আপনি ধরে নিয়েছেন এটি কাজ করবে না। এটি বর্তমানে আমি আমার অ্যাপ্লিকেশনটিতে ব্যবহার করছি কোডটির সঠিক অংশ এবং এটি চ্যাম্পের মতো কাজ করে।
কুমির

1) আমি কখনই বলিনি এটি কাজ করে না। আমি বলেছিলাম এটি যেভাবে বলেছিল এটি কাজ করে না। আবার পড়ুন। 2) আপনি LSP এবং SRP লঙ্ঘন করেছে, মানুষের ঘন্টা নষ্ট অযথা পরিবর্তন সব আপনার সমগ্র ক্লায়েন্ট যুক্তিবিজ্ঞান যে কোনো পরিবর্তন দিয়ে শুরু করতে প্রয়োজন ছিল না। ৩) আপনার উত্তরটি প্রশ্নের উত্তর দেয়, হ্যাঁ, অন্যথায় আমি এটিকে "উত্তর নয়" হিসাবে অপসারণের জন্য পতাকাঙ্কিত করব, তবে ৪) আপনার উত্তরটি এখনও খুব অদক্ষ (এটি সম্পর্কে দুঃখিত) এবং মৌলিক নকশার সমস্যাটি সম্বোধন করে না (শ্রোতাকে বলা হয়) ), সুতরাং কেবল ডাউনভোট। 6) আপনি অক্ষম ফিরে এবং এটা বুলিয়ান বলপূর্বক একটি মোডাল জানালা তৈরি। সুতরাং, 6 গুরুতর সমস্যা আছে!
ডেভিডসিএসবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.