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

نوشتن کلاس سفارشی برای preferences (حل نشده)

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

راهی برای سفارشی کردن و تغییر ظاهر دیالوگ ها و آیتم های  sharedpreferences وجود داره؟ یا مثلاً از دیالوگ ها و customController هایی که  خودمون طراحی کردیم به جای عناصری که به صورت پیشفرض در نظر گرفته شده استفاده کنیم؟ ممنون

نظرات

کاشی زاده 12 سال پیش
پیشنهاد میکنم خودت یه لایه باز کنی و توش پریفرنس ها رو به کار بگیری .
override 12 سال پیش
بله میشه ولی هدفم اینه که یاد بگیرم چه طوری یه Custom Preference class بسازم

پاسخ‌ها 4

override 12 سال پیش

راهی که به نظرم میرسه اینه که یه دیالوگ با استفاده از Layout که طراحی کردیم  به این  صورت تعریف کنیم

 
 final Dialog dialog = new Dialog(Activitymain.this);

dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.custom_dialog);

و preferences رو با استفاده از کد زیر تعیین کنیم ولی خب این مدنظرم نیست.راه دیگه ای نیست؟

 
 preferences = PreferenceManager.getDefaultSharedPreferences(context);
 SharedPreferences.Editor editor = preference.edit();
editor.putString("key", value)/ or editor.putBoolean("key", true);
editor.commit();

نظرات

override 12 سال پیش

خب من قصد داشتم براساس نیازی که دارم آیتم هایی رو به ListPreference اضافه کنم و ظاهر دیالوگ باکس و طراحی اونو تا حدودی مطابق با سلیقه ی خودم تغییر بدم تا حالا هر چی سرچ کردم فقط به این نتیجه ختم شد که بهترین راه نوشتن یه کلاس اختصاصی برای preferences هست خب بهترین راهنمایی که پیدا کردم مستندات و آموزش های گوگل بود: Settings , DialogPreference و سورس های پراکنده که هر کدوم به یه روش عمل کردن ، هدف و سعی من بر اینه که یه کلاس برای انتخاب فونت بنویسم البته راه حل آسونتر استفاده از روشیه که در جواب قبلی توضیح دادم خیلی هم دردسر کمتری داره ولی نمیدونم چرا اصرار دارم از این روش استفاده نکنم :) بگذریم خب اینجا از همین اول به راهنمایی دوستان نیاز دارم اگر تونستم کارو به جایی برسونم و سوادم اجازه داد حتماً به طور کامل سورس رو همینجا میذارم

    public class PreferenceTextFont extends DialogPreference {

public PreferenceTextFont(Context context, AttributeSet attrs) {
super(context, attrs);
createDialog();

}


public PreferenceTextFont(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
createDialog();
}


private void createDialog() {
setDialogLayoutResource(R.layout.preference_font_dialog);
setPositiveButtonText(R.string.ok_buton);
setNegativeButtonText(R.string.cancel_button);
}


@Override
protected void onBindDialogView(View view) {

super.onBindDialogView(view);

RadioButton radioFontDastnevis = (RadioButton) view.findViewById(R.id.radioFontDastnevis);
RadioButton radioFontKoodak = (RadioButton) view.findViewById(R.id.radioFontKoodak);
RadioButton radioFontNazanin = (RadioButton) view.findViewById(R.id.radioFontNazanin);

}

}

}

حالا اولین مشکل اینه که چه طور RadioButton رو که برای دیالوگ باکس در layout مربوط قرار دادم اینجا استفاده کنم اینجا برای ایجاد دیالوگ باکس از متد CreateDialog استفاده کردم ولی حالا چه طوری باید این RadioButtonرو پیدا کنم استفاده از onBindDialogView روش درستیه؟ اگر نیست چه طور باید این کار رو انجام بدم؟

نظرات

override 12 سال پیش
اگه نمونه کدی هم کسی سراغ دارید ممنون میشم معرفی کنید
javac 12 سال پیش
من نمیدونم دقیقا جریان بالا چیه ، اما به نظر میرسه باید از inflater برای تبدیل xml ها به view مورد نظر استفاده کنی
override 12 سال پیش
درسته توی بیشتر نمونه ها از همین روشinflater استفاده شده باید امتحان کنم ولی نمیدونم اگه بخوام از CreateDialog استفاده کنم چه جوریه؟سعی میکنم هر دو روش رو امتحان کنم
override 12 سال پیش
خب کد بالا اصلاح شد الان تا اینجا داره درست کار میکنه ظاهراً onBindView جواب میده :)
override 12 سال پیش

ما میتونیم یه کلاس اختصاصی بسته به نیاز خودمون بنویسم و اونو به شکل زیر مثلا ًدر preference.xml معرفی کنیم

 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">


<com.example.app.PreferenceTextFont

android:defaultValue="b_koodak"
android:dialogTitle="@string/font_dialog_title"
android:key="USER_SELECTED_FONT"
android:persistent="true"
android:summary="@string/font_dialog_summary"
android:title="@string/font_dialog_title"/>

</PreferenceScreen>

 

نظرات

override 12 سال پیش

امروز خیلی دارم به خودم جواب میدم :) حالا یه سئوال دارم متد onGetDefaultValue چه کاربردی داره من هر چی میخونم از ترجمه تحت الفظی چیزی دستگیرم نمیشه که آخرش کاربردش چیه ؟ متن اصلی به همراه ترجمه خودم رو میذارم ببینید چیزی متوجه میشید به منم بگید :

       Providing a default Value /ارائه مقدار پیش فرض

If the instance of your Preference class specifies a default value (with the android:defaultValue attribute), then the system calls onGetDefaultValue() when it instantiates the object in order to retrieve the value. You must implement this method in order for the system to save the default value in the SharedPreferences. For example:

اگر نمونه ی کلاس تنظیمات شما دارای یک مقدار پیش فرض باشد (با به کارگیری مشخصه ی android:defaultValue در فایل xml ) ، بعد از آن سیستم متد onGetDefaultValue رو به منظور بازیابی این مقدار،  زمانی که  آبجکتی از کلاس  مذکور را  نمونه سازی می کند صدا می زند. شما باید این متد رو برای اینکه سیستم مقدار پیش فرض را در SharedPreferences ذخیره کند ایمپلمنت (پیاده سازی)کنید. برای مثال:


    @Override
protected Object onGetDefaultValue(TypedArray a, int index) {
return a.getInteger(index, DEFAULT_VALUE);
}

The method arguments provide everything you need: the array of attributes and the index position of the android:defaultValue, which you must retrieve. The reason you must implement this method to extract the default value from the attribute is because you must specify a local default value for the attribute in case the value is undefined.

آرگومان های این متد هر چیزی که شما نیاز دارید را فراهم می کنند: آرایه ای از attributes (ویژگی ها) و موقعیت اندکسی android:defaultValue که شما باید آنها را بازیابی کنید . دلیلی که شما باید این متد را برای استخراج مقدار پیش فرض از attributes اجر کنید این است که شما بایستی یک متغیر لوکال یا محلی پیشفرض برای این attribute در مواردی که مقداری برای آن تعریف نشده مشخص کنید.


حالا شاید ترجمه من چنگی به دل نزنه ولی کمک میکنه متن اصلی رو بهتر در ذهن حلاجی کنید ، این توضیحات مربوط به مستندات و اینای گوگله

این متد برای دریافت مقدار پیش فرض ذخیره شده در xml مربوط به کلاس ماست؟ برای قرار دادن یه مقدار پیش فرضه ؟ ، برای زمانیه که چیزی در preference ذخیره نشده؟ یا باید همرا متد onSetInitialValue به کار بره؟ برای چیه؟کی کاربرد داره؟چه طور باید ازش استفاده کرد؟ پارامترهایی که دریافت میکنه برای چیه؟

نظرات


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