android एंड्रॉइड: कस्टम वरीयता बनाना




android-layout android-preferences (4)

क्या वरीयता स्क्रीन में व्यक्तिगत वरीयता बनाना संभव है?

मैं रंग सेटिंग्स को कोड करना चाहता हूं:

मुझे पता है कि रंग ListPreference साथ आसान प्राप्य है, लेकिन यह उस तरह के "चेकबॉक्स" के साथ शानदार होगा।


कस्टम वरीयता बनाना, दृश्यों और कार्यों को परिभाषित करके, एक टुकड़ा या अन्य यूआई घटकों को बनाने के समान है।

एंड्रॉइड डेवलपर्स की सेटिंग्स बनाने पर एक अच्छी मार्गदर्शिका है, जिसमें कस्टम वरीयताएं बनाने के लिए एक सेक्शन शामिल है: http://developer.android.com/guide/topics/ui/settings.html#Custom कस्टम


समर्थन लाइब्रेरी preference-v7 का उपयोग करके मैं इसे कैसे करता हूं।

  • Preference बढ़ाएं और onBindViewHolder() ओवरराइड करें। यह विधि आपको ViewHolder ऑब्जेक्ट के माध्यम से अपनी वरीयता के दृश्य के संदर्भ प्राप्त करने की अनुमति देती है।
  • setWidgetLayoutResourece() या setWidgetLayoutResourece() का उपयोग करके अपने कस्टम व्यू को setWidgetLayoutResourece()
  • पूरे वरीयता दृश्य के डिफ़ॉल्ट क्लिक व्यवहार को अक्षम करें, और केवल क्लिक करने योग्य होने के लिए कस्टम दृश्यों को अनुमति दें।

लेआउट / preference_theme.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <Button android:id="@+id/theme_light" ... />
    <Button android:id="@+id/theme_dark"... />
    <Button android:id="@+id/theme_sepia"... />
    <Button android:id="@+id/theme_green"... />
</LinearLayout>

वरीयताथीम.जावा (कस्टम वरीयता वर्ग)

import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceViewHolder;

public class PreferenceTheme extends Preference {

    public PreferenceTheme(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public PreferenceTheme(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setWidgetLayoutResource(R.layout.preference_theme);
    }

    @Override
    public void onBindViewHolder(PreferenceViewHolder holder) {
        super.onBindViewHolder(holder);
        holder.itemView.setClickable(false); // disable parent click
        View button = holder.findViewById(R.id.theme_dark);
        button.setClickable(true); // enable custom view click
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // persist your value here
            }
        });
        // the rest of the click binding
    }
}

preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v7.preference.PreferenceCategory
        android:title="Reading">
        <example.com.preference.PreferenceTheme
            android:key="pref_theme"
            android:title="Theme"
            android:defaultValue="light" />
        ...
    </android.support.v7.preference.PreferenceCategory>
</android.support.v7.preference.PreferenceScreen>

या डायलॉग प्रेफरेंस क्लास का विस्तार करने के लिए एक बेहतर विकल्प होगा। आप एक संवाद पिकर विजेट को संवाद दृश्य के रूप में सेट कर सकते हैं और विस्तारित वरीयता के भीतर सकारात्मक परिणाम प्राप्त कर सकते हैं। Here एक समान प्रश्न है, लेकिन यह आपके परिदृश्य के लिए बहुत उपयोगी है।


एंड्रॉइड डेवलपर पेज केवल DialogFragment बनाने का DialogFragment । हालांकि Preference आइटम की उपस्थिति को अनुकूलित करना अभी भी संभव है। आपके एक्सएमएल में आपको रूट तत्व को android:id="@android:id/widget_frame रूप में घोषित करना होगा android:id="@android:id/widget_frame , और फिर android:id="@android:id/widget_frame को android:title रूप में घोषित करें android:title और android:summary । फिर आप लेआउट में दिखने वाले अन्य तत्वों को घोषित कर सकते हैं। यहां एक उदाहरण है जो एक SeekBar दिखा रहा है जिसे आप आसानी से बहु-चेकबॉक्स रंग चयनकर्ता के अनुकूल बना सकते हैं।

seekbar_preference.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/widget_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@android:id/title"
        style="@android:style/TextAppearance.DeviceDefault.SearchResult.Title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Title" />

    <TextView
        android:id="@android:id/summary"
        style="@android:style/TextAppearance.DeviceDefault.SearchResult.Subtitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Summary" />

    <SeekBar
        android:id="@+id/seekbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

फिर, Preference से प्राप्त कक्षा में, onCreateView() विधि को ओवरराइड करें:

SeekbarPreference.java

@Override
protected View onCreateView( ViewGroup parent )
{
  LayoutInflater li = (LayoutInflater)getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE );
  return li.inflate( R.layout.seekbar_preference, parent, false);
}

फिर प्राथमिकताओं में .xml फ़ाइल वरीयता का उपयोग करें:

preferences.xml

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

    <com.example.SeekbarPreference
        android:key="pref_max_volume"
        android:title="@string/max_volume" />
    <com.example.SeekbarPreference
        android:key="pref_balance"
        android:title="@string/balance" />

</PreferenceScreen>

यह वरीयता देता है जो निम्नानुसार दिखता है:

मूल प्रश्न में मौजूद पंक्ति में एकाधिक चेकबॉक्स दिखाने के लिए आप आसानी से इस विधि को अनुकूलित कर सकते हैं।





preferenceactivity