بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

نمایش دیالوگ بنا به نظر کاربر ( حل شد )

مدیریت گفتگو
RojaDev 11 سال پیش
آخرین تغییر: 11 سال پیش

سلام مجدد

چطوری میتونم کاری کنم که یه دیالوگ فقط یکبار نشون داده بشه؟

( وقتی اکتیوتی که مد نظر هست اومد بالا این پیغام نشون داده بشه یه گزینه هم داشته باشه که اگر کاربر نخواست در دفعات بعد نشون داده نشه...نکته مبهمش فقط این هست چطوری در خودش ذخیره کنه که کاربر تیک گزینه رو زده یا نه؟!)

نظرات

hosseinAmini 11 سال پیش
از SharedPrefernce می تونید استفاده کنید. یه SharedPrefernce از جنس boolean می سازید و مقداره اولیه رو true میزارید و شرط می زارید که تا زمانیکه true بود پیغام نمایش داده شه. وقتی هم که کاربر تیک رو زد مقدار SharedPrefernce رو false می کنید
learnpro 11 سال پیش
خیلی ساده میتونید از SharedPreferences استفاده کنید. وقتی چک باکس تیک خورد یه مقدار مثلا boolean توی SharedPreferences ذخیره بشه و هر وقت اومدی توی Activity اگه اون مقدار true بود دیالوگ رو نشون بدی در غیر این صورت نشون ندید.
RojaDev 11 سال پیش
این SharedPreferences چیه؟ کلن آشنا نیستم باهاش...:| تو ویدیو های استاد میشه لطفا بگین کدوم بخشه؟!

پاسخ‌ها 9

Hossein Kurd 11 سال پیش

در واقع SharePreferences خیلی آسونه ، من چند روز پیش برای اولین بار ازش استفاده کردم ، 17-01 Using Preferences از 0037:00 به بعد رو با دقت نگاه کنید چون آموزش کار با SharedPereferences رو به صورت کد نویسی توضیح می ده

همچنین شما نیازی به Create کردن اون ندارید و با متد putBoolean می تونید مقدارتون رو دخیره کنید و دفعه بعد فراخوانی کنید

blnRunner = true;
SharedPreferences preferences;
preferences = PreferenceManager.getDefaultSharedPreferences(context);
boolean blnFuture = G.appPreferences.preferences.getBoolean("RUN_ME", blnRunner);
if(
blnFuture){
// Call Method
}

در اینجا blnRunner مقدار پیشفرض هست که اگر پیش از این پیزی ثبت نشده ، به ما بازگردانده می شه و "RUN_ME" نام کلید شما

حالا برای ثبت تغییرات وقتی کاربر Button یا چکباکس رو تاچ کرد این رو بزنید:


SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("RUN_ME", blnRunner);
editor.commit();

البته با رعایت OOP خیلی زیباتر هم می شه نوشت که به دلیل پیچیده شدن فعلا همین رو می نویسم

نظرات

RojaDev 11 سال پیش
ممنون ، آموزش استاد رو دیدم...به کل گیج شدم :|...چه تو آموزش استادو چه آموزش های سطح نت...صفحه تنظمیات یه صفحه جداست...اما چیزی که میخوام بنویسم فقط یه دیالوگه که توی اکتیویتی اصلی قرار بیاد...همون جا true و false بشه...با استفاده از دستوراتی که گذاشتین یه پروژه سمپل ایجاد کردم اما خطا میده...کد هاشو توی پاسخ پایین میزارم..منون میشم راهنماییم کنید...
hosseinAmini 11 سال پیش
اگر آموزش استاد رو تا آخر ببینید متوجه می شید.
Hossein Kurd 11 سال پیش
من هم اولش گیج شدم اما همون عصر که این پست رو گذاشتم مجدد توی پروژ ازش استفاده کردم، تا پیاده سازیش نکنی نمی تونی بهش مسلط بشی
RojaDev 11 سال پیش
@Hoseein.Kurd: موقع کلیک کردن چک باکس مقدار این متغیر رو blnRunner رو false کردم...اما اینکار هیجا ذخیره نمیشه؟! و دوباره بعد از اجرا میاد؟! شما این مشکلو نداشتی؟!
Hossein Kurd 11 سال پیش
blnRunner در واقع مقدار ثابت و اولیه ای هست که می تونید مستقیما true رو جایگزینش کنید ، متغیر مهم blnFuture هست ، لطفا در هر بار اجرا مقدار این دو متغیر رو توی LogCat نمایش بدید تا متوجه بشید
RojaDev 11 سال پیش

appPreferences رو نمیشناسه!

     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final boolean blnRunner;

        blnRunner = true;
        final SharedPreferences preferences;
        preferences = PreferenceManager.getDefaultSharedPreferences(this);
        boolean blnFuture = this.appPreferences.preferences.getBoolean("RUN_ME", blnRunner);
        if (blnFuture) {
            final Dialog d = new Dialog(StartupActivity.this);
            d.requestWindowFeature(Window.FEATURE_NO_TITLE);
            d.setContentView(R.layout.help);
            d.show();
        }
        
        CheckBox ck =(CheckBox) findViewById(R.id.checkBox1);
        ck.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                SharedPreferences.Editor editor = preferences.edit();
                editor.putBoolean("RUN_ME", blnRunner);                
            }
        });

    }

نظرات

محسن 11 سال پیش
به this.appPreferences نیازی نیست، برش داری درست میشه
RojaDev 11 سال پیش
بله...:) مگه کلیک کردن روی چک باکس با >> ck.setOnClickListener(new OnClickListener() {
miladint 11 سال پیش
حتما میخوای با چک باکس باشه؟ روش دیگه معرفی کنم اشکالی نداره؟
RojaDev 11 سال پیش
نه مشکلی نیست...فقط میخوام موقع استارت اکتیوتی یه چیزی مث هلپ بیاد که کاربر خواست دیگه نیاد...!
محسن 11 سال پیش
این خطم بش اضافه کن editor.commit();
محسن 11 سال پیش
بعد از editor.putBoolean("RUN_ME", blnRunner);
محسن 11 سال پیش
چک باکس مال اکتویتیه اصلییه یا مربوطه به دیالوگ نمایش داده شده؟
RojaDev 11 سال پیش
ممنون...گذاشتم...اون خطی که گفتم همچنان ارور میده !! :\ لینک
RojaDev 11 سال پیش
واسه لایوت دیالوگه که داره نمایش میده... >> layout.help
محسن 11 سال پیش
چون طولانیه توی یک پاسخ جداگونه جوابو مینویسم
RojaDev 11 سال پیش
مرسی خیلی زیاد...
Hossein Kurd 11 سال پیش
من متغیر preference رو در کلاس AppPreference تعیین کردم نیازی نیست شما از AppPreference استفاده کنید
RojaDev 11 سال پیش
بله...برش داشتم از پروژه...
miladint 11 سال پیش

خدمت شما

 readPreference();
        //Dialog Starts
        if ( !isDialogDismiss) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("پیغام مورد نظر")
                    .setCancelable(false)
                    .setPositiveButton("رد کردن", new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int id) {
                            isDialogDismiss = true;
                            writePreference();
                            dialog.cancel();
                        }

						private void writePreference() {
							// TODO Auto-generated method stub
							
						}
                    })
                    .setNegativeButton("قبول", new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                        }
                    });
            AlertDialog alert = builder.create();
            alert.setTitle("توجه");
            alert.show();

        }
        //Dialog Ends

نظرات

miladint 11 سال پیش
این هر دفعه میاد یکم فکر کنین و ببینین چجوری میشه فقط یه بار نمایش داده بشه :) موفق باشی
RojaDev 11 سال پیش
این جور راهنمایی های چلنج پذیر رو دوست میداریم :دی مرسی... بررسیش میکنم...
RojaDev 11 سال پیش
یه سوال فنی فقط...تابع readPreference(); تعریف میشه؟! نمیشه؟!
RojaDev 11 سال پیش
isDialogDismiss این رو هم نمیشناسه؟! :\
miladint 11 سال پیش
همه رو create کن همه رو میشناسه تست کردم و فرستادم برات
RojaDev 11 سال پیش
الانه اکلیپسم هنگ کنه... جفت کد هارو باهم دارم تست میکنم... ممنون
RojaDev 11 سال پیش
الانه اکلیپسم هنگ کنه... جفت کد هارو باهم دارم تست میکنم... ممنون
محسن 11 سال پیش

نباس چک باکس رو اونطوری تعریف کرد، چون مربروط به دیالوگ هست باید همونجا تعریف بشه واسه همینم nullpointerException میده (احتمال زیاد)

چک باکس رو اینطوری تعریف کن بعد براش کلیک لیسنر تعریف کن:

 CheckBox ck =(CheckBox) d.findViewById(R.id.checkBox1);

نظرات

RojaDev 11 سال پیش
:\ بی دقتم...:\ ممنون حل شد... اما حالا کلن چه تیک باشه چه نباشه دیالوگ میاد :)))))
Hajhosseini 11 سال پیش
onClickListener نباید استفاده بشه، باید از onCheckedChangeListener استفاده بشه!
Hajhosseini 11 سال پیش

از onCheckedChangeListener استفاده کن نه از onClickListener

  chechBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            
            @Override
            public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
                
            }
        });

اولین کدی که استفاده میکنی کدی هست که آقای حسین کرد در اولین پاسخ گفتن : 

 blnRunner =true;
SharedPreferences preferences;
preferences =PreferenceManager.getDefaultSharedPreferences(context);
boolean blnFuture = G.appPreferences.preferences.getBoolean("RUN_ME", blnRunner);
if(
blnFuture){
// Call Method
}

توی if بالا لیستنر رو تعریف کن،درصورتی که متغیرت True بود دیالوگ باکس باز میشه، توی لیستنر باید کد تغییر متغیرت توی SharedPreferences رو بدی  

نظرات

RojaDev 11 سال پیش

مجددا ویرایش : :|

نخیر!!! :| همچنان کار نمیکنه... الان دیگه فقط یه بار اجرا میشه!!!! چه تیک بخوره ...چه تیک نخوره!!!!

این هم کد :

     boolean blnRunner = true;


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final Dialog dd = new Dialog(StartupActivity.this);
        final SharedPreferences preferences;
        preferences = PreferenceManager.getDefaultSharedPreferences(this);
        boolean blnFuture = preferences.getBoolean("RUN_ME", blnRunner);
        if (blnFuture) {
            dd.requestWindowFeature(Window.FEATURE_NO_TITLE);
            dd.setContentView(R.layout.help);
            dd.show();
            CheckBox ck = (CheckBox) dd.findViewById(R.id.checkBox1);
            ck.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
                    SharedPreferences.Editor editor = preferences.edit();
                    blnRunner = false;
                    editor.putBoolean("RUN_ME", blnRunner);
                    editor.commit();
                }
            });
            Button btn = (Button) dd.findViewById(R.id.button1);
            btn.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    dd.dismiss();
                }
            });
        }
    }

نظرات

Hajhosseini 11 سال پیش

تمیز شده کدتون!

    public Dialog dialog;    
    public SharedPreferences preferences;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        dialog = new Dialog(StartupActivity.this);

        preferences = PreferenceManager.getDefaultSharedPreferences(this);
        boolean blnFuture = preferences.getBoolean("RUN_ME", false);
        if (!blnFuture) {
           dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            dialog.setContentView(R.layout.help);
            dialog.show();
            CheckBox checkBox = (CheckBox) dialog.findViewById(R.id.checkBox1);
            checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
                    SharedPreferences.Editor editor = preferences.edit();
                    editor.putBoolean("RUN_ME", true);
                    editor.commit();
                }
            });
            Button btnClose = (Button) dialog.findViewById(R.id.button1);
            btnClose.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    dialog.dismiss();
                }
            });
        }
    }

نظرات

RojaDev 11 سال پیش
کاملا درست...دیشب اینو جایگزین کد های خودم کردم و. بدون مشکل کار کرد...میشه لطفا خطای و اشتباه کد من رو بگین؟!
Hajhosseini 11 سال پیش
چند روزی نبودم، حقیقتش من این کد رو توی اکلیپس ننوشتم، فقط همینجا کدتون رو دیدم و تمیزش کردم.
Hossein Kurd 11 سال پیش

می دونی اشتباه شما چیه ؟ اینه که سعی می کنی کد اصلی رو همون اول پیاده کنی

ابتدا از کارکرد SharedPReferences اطمینان پیدا کن بعد توی کد اصلی پیادش کن

ایتدا یه سمپل بساز تا مقادیر رو در SharedPreference دخیره کنه سپس اون رو له کد اصلی انتقال بده

نظرات

RojaDev 11 سال پیش
مرسی از راهنماییتون :) چشم...
sadra 11 سال پیش

سلام. آموزشش رو بنده قبلا دادم. دقیقا فکر کنم شما هم برای همین مورد بخوایید، یه نگاه به این بندازید بد نیست:

 آموزش ساخت دیالوگِ "به من رای میدی؟" در هنگام خروج از اپلیکیشن

 

نظرات


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .