نوشتن کلاس سفارشی برای preferences (حل نشده)
راهی برای سفارشی کردن و تغییر ظاهر دیالوگ ها و آیتم های sharedpreferences وجود داره؟ یا مثلاً از دیالوگ ها و customController هایی که خودمون طراحی کردیم به جای عناصری که به صورت پیشفرض در نظر گرفته شده استفاده کنیم؟ ممنون
راهی که به نظرم میرسه اینه که یه دیالوگ با استفاده از 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();
خب من قصد داشتم براساس نیازی که دارم آیتم هایی رو به 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 روش درستیه؟ اگر نیست چه طور باید این کار رو انجام بدم؟
ما میتونیم یه کلاس اختصاصی بسته به نیاز خودمون بنویسم و اونو به شکل زیر مثلا ًدر 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>
امروز خیلی دارم به خودم جواب میدم :) حالا یه سئوال دارم متد 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 به کار بره؟ برای چیه؟کی کاربرد داره؟چه طور باید ازش استفاده کرد؟ پارامترهایی که دریافت میکنه برای چیه؟
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .