Android: वरीयता स्क्रीन में मार्जिन / पैडिंग कैसे निकालें


83

मैं वरीयता स्क्रीन डिजाइन करने में बहुत अजीब समस्या का सामना कर रहा हूं। हालांकि मैं लेआउट में कोई अंतर नहीं दे रहा हूं, यह बाईं ओर कुछ जगह छोड़ रहा है।

जैसा कि आप नीचे चित्र में देख सकते हैं: यहाँ छवि विवरण दर्ज करें

XML:

   <PreferenceScreen android:title="demo" >
       <CheckBoxPreference
           android:defaultValue="false"
            android:key="prefSync"`
            android:title="Auto Sync" />
    </PreferenceScreen>

क्या मैं स्क्रीन में चेक-बॉक्स वरीयता जोड़ने में कुछ गलत कर रहा हूं?



हे मिरल, उत्तर के लिए धन्यवाद। लेकिन मैं वरीयता स्क्रीन के लिए कस्टम लेआउट नहीं बना रहा हूं
Dory

क्या आप हमें अपनी लेआउट फ़ाइल दिखा सकते हैं?
रॉबिन दिजाखोफ

< वरीयतास्क्रीन xmlns: android = " schemas.android.com/apk/res/android "> <CheckBoxPreference Android: defaultValue = "false" Android: key = "prefSync" Android: शीर्षक = "ऑटो सिंक" /> </ वरीयतास्क्रीन> यहाँ कोड है
Dory

[इस उत्तर] को देखें ( stackoverflow.com/a/41101859/1785516 ) शायद यह आपके मामले को ठीक करने में मदद करेगा।
केएलएम

जवाबों:


153

यह Androidx के लिए अद्यतन कर रहा है।

बहुत अधिक प्रयोग के बाद, मैंने इस मुद्दे को प्रत्येक वरीयता में जोड़कर हल किया, जिसमें अतिरिक्त इंडेंटेशन था:

app:iconSpaceReserved="false"

बेशक, आपको इसे अपने xml के शीर्ष पर वरीयतास्क्रीन घोषणा में भी जोड़ना होगा:

xmlns:app="http://schemas.android.com/apk/res-auto"

कस्टम प्राथमिकता के लिए ऊपर का पालन करें

मैंने देखा कि कस्टम वरीयताओं के मामले में, विशेष रूप से पुराने उपकरणों पर, यह समाधान हमेशा काम नहीं कर रहा था। उदाहरण के लिए, इस तरह की वरीयता अभी भी दी जा सकती है:

com.example.preference.SomeCustomPreference
    android:id="@+id/some_custom_preference"
    android:name="Custom Preference"
    android:key="@string/custom_pref_key"
    android:summary="@string/custom_pref_summary"
    android:title="@string/preference_custom_title"
    app:iconSpaceReserved="false"

समस्या कस्टम प्राथमिकता वर्ग में तीसरे कंस्ट्रक्टर पैरामीटर के उपयोग का पता लगाती है। यदि आप उस तीसरे पैरामीटर को पास करते हैं, तो सूची आइटम इंडेंट किया जाएगा। यदि आप इसे छोड़ देते हैं, तो सूची को सही ढंग से संरेखित किया जाएगा:

class SomeCustomPreference
@JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyle: Int = android.R.attr.someCustomPreferenceStyle
) : DialogPreference(context, attrs, defStyle) {

    override fun getDialogLayoutResource(): Int {
        return R.layout.my_layout
    }
}

इसके बजाय, इसका उपयोग करें:

class SomeCustomPreference
@JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null
) : DialogPreference(context, attrs) {

    override fun getDialogLayoutResource(): Int {
        return R.layout.my_layout
    }
}

इसका श्रेय इस बहुत पुरानी पोस्ट में @CommonsWare को जाता है ।


11
मैं नहीं जानता कि आप कौन हैं लेकिन मैं आपको ढूंढूंगा और आपके लिए धन्यवाद दूंगा! :)
डेविड

यह जाने का सही तरीका है; मुझे लगता है कि कस्टम कक्षाओं की कोई आवश्यकता नहीं है। एंड्रॉइड डिफ़ॉल्ट रूप से आइकन के लिए एक स्थान को जला रहा है अब ऐसा लगता है।
ब्लॉगर

1
यह PreferenceFragmentCompatसपोर्ट लिब के लिए भी काम करता है 28.0.0। महान!
jayeffkay

7
वरीयता श्रेणी के बारे में क्या? पसंद की श्रेणी में काम नहीं लगता है
jknair

1
वरीयता श्रेणी androidx.preference में ठीक काम कर रही है: वरीयता: 1.1.0
kalandar

53

मैंने इस मुद्दे के बारे में यहां रिपोर्ट की है (आप वहां पर मेरे वर्कअराउंड प्रोजेक्ट की जांच भी कर सकते हैं), लेकिन अभी के लिए, मैंने इसे हैक करने के लिए थोड़ा हैक-वाई पाया है, फिर भी इसे दूर करने का आसान तरीका:

  • इसके लिए PreferenceCategory, मैंने इसके लेआउट्स की शुरुआत / बाईं पैडिंग को 0 पर सेट किया।

  • अन्य प्रकार की वरीयताओं के लिए, मैं उस icon_frameमामले को छिपाने के लिए चुनता हूं जब उनके पास एक आइकन नहीं है।

यहाँ कोड है। बस इस वर्ग से विस्तार करें और बाकी स्वचालित है:

Kotlin

abstract class BasePreferenceFragment : PreferenceFragmentCompat() {

    override fun onCreateAdapter(preferenceScreen: PreferenceScreen?): RecyclerView.Adapter<*> {
        return object : PreferenceGroupAdapter(preferenceScreen) {
            override fun onBindViewHolder(holder: PreferenceViewHolder, position: Int) {
                super.onBindViewHolder(holder, position)
                val preference = getItem(position)
                if (preference is PreferenceCategory)
                    setZeroPaddingToLayoutChildren(holder.itemView)
                else
                    holder.itemView.findViewById<View?>(R.id.icon_frame)?.visibility = if (preference.icon == null) View.GONE else View.VISIBLE
            }
        }
    }

    private fun setZeroPaddingToLayoutChildren(view: View) {
        if (view !is ViewGroup)
            return
        val childCount = view.childCount
        for (i in 0 until childCount) {
            setZeroPaddingToLayoutChildren(view.getChildAt(i))
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
                view.setPaddingRelative(0, view.paddingTop, view.paddingEnd, view.paddingBottom)
            else
                view.setPadding(0, view.paddingTop, view.paddingRight, view.paddingBottom)
        }
    }
}

जावा

public abstract class BasePreferenceFragmentCompat extends PreferenceFragmentCompat {
    @Override
    protected RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {
        return new PreferenceGroupAdapter(preferenceScreen) {
            @SuppressLint("RestrictedApi")
            @Override
            public void onBindViewHolder(PreferenceViewHolder holder, int position) {
                super.onBindViewHolder(holder, position);
                Preference preference = getItem(position);
                if (preference instanceof PreferenceCategory)
                    setZeroPaddingToLayoutChildren(holder.itemView);
                else {
                    View iconFrame = holder.itemView.findViewById(R.id.icon_frame);
                    if (iconFrame != null) {
                        iconFrame.setVisibility(preference.getIcon() == null ? View.GONE : View.VISIBLE);
                    }
                }
            }
        };
    }

    private void setZeroPaddingToLayoutChildren(View view) {
        if (!(view instanceof ViewGroup))
            return;
        ViewGroup viewGroup = (ViewGroup) view;
        int childCount = viewGroup.getChildCount();
        for (int i = 0; i < childCount; i++) {
            setZeroPaddingToLayoutChildren(viewGroup.getChildAt(i));
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
                viewGroup.setPaddingRelative(0, viewGroup.getPaddingTop(), viewGroup.getPaddingEnd(), viewGroup.getPaddingBottom());
            else
                viewGroup.setPadding(0, viewGroup.getPaddingTop(), viewGroup.getPaddingRight(), viewGroup.getPaddingBottom());
        }
    }
}

और परिणाम (एक्सएमएल नमूना पाया जा सकता है यहाँ की इस Google नमूना है, जो मैं बना लिया है यहाँ की जाँच करने के लिए):

यहाँ छवि विवरण दर्ज करें

यह कोड थोड़ा खतरनाक है, इसलिए सुनिश्चित करें कि लाइब्रेरी के प्रत्येक अपडेट पर, आप जांच लें कि यह ठीक काम करता है।

इसके अलावा, यह कुछ विशेष मामलों पर अच्छी तरह से काम नहीं कर सकता है, जैसे कि जब आप android:layoutवरीयता के लिए स्वयं को परिभाषित करते हैं, तो आपको इस मामले के लिए इसे संशोधित करना होगा।


एक बेहतर, अधिक आधिकारिक समाधान मिला:

प्रत्येक वरीयता के लिए, का उपयोग करें app:iconSpaceReserved="false"। यह ठीक काम करना चाहिए, लेकिन किसी कारण से एक ज्ञात (ज्ञात) बग है कि यह वरीयता के लिए काम नहीं करता है। यह यहां बताया गया था , और निकट भविष्य में तय किया जाना चाहिए।

तो अब के लिए आप मेरे द्वारा लिखे गए वर्कअराउंड और इस ध्वज के मिश्रण संस्करण का उपयोग कर सकते हैं।


संपादित करें: अभी तक एक और समाधान मिला। यह एक प्राथमिकता के सभी खत्म हो जाएगा, और isIconSpaceReservedप्रत्येक के लिए निर्धारित किया है। अफसोस की बात है, जैसा कि मैंने ऊपर लिखा है, यदि आप वरीयता-सूची का उपयोग करते हैं, तो यह इसे बर्बाद कर देता है, लेकिन यदि आप इसका उपयोग नहीं करते हैं तो यह ठीक काम करना चाहिए:

Kotlin

abstract class BasePreferenceFragment : PreferenceFragmentCompat() {

    override fun setPreferenceScreen(preferenceScreen: PreferenceScreen?) {
        super.setPreferenceScreen(preferenceScreen)
        if (preferenceScreen != null) {
            val count = preferenceScreen.preferenceCount
            for (i in 0 until count)
                preferenceScreen.getPreference(i)!!.isIconSpaceReserved = false
        }
    }

जावा

public class BasePreferenceFragment extends PreferenceFragmentCompat {

    @Override
    public void setPreferenceScreen(PreferenceScreen preferenceScreen) {
        super.setPreferenceScreen(preferenceScreen);
        if (preferenceScreen != null) {
            int count = preferenceScreen.getPreferenceCount();
            for (int i = 0; i < count; i++)
                preferenceScreen.getPreference(i).setIconSpaceReserved(false);
        }
    }
}

EDIT: Google ने आखिरकार लाइब्रेरी ( यहां लिंक ) को निर्धारित करने के बाद, आप प्रत्येक वरीयता के लिए ध्वज सेट कर सकते हैं, या इस समाधान का उपयोग कर सकते हैं, जो आपके लिए यह सब करता है:

abstract class BasePreferenceFragment : PreferenceFragmentCompat() {
    private fun setAllPreferencesToAvoidHavingExtraSpace(preference: Preference) {
        preference.isIconSpaceReserved = false
        if (preference is PreferenceGroup)
            for (i in 0 until preference.preferenceCount)
                setAllPreferencesToAvoidHavingExtraSpace(preference.getPreference(i))
    }

    override fun setPreferenceScreen(preferenceScreen: PreferenceScreen?) {
        if (preferenceScreen != null)
            setAllPreferencesToAvoidHavingExtraSpace(preferenceScreen)
        super.setPreferenceScreen(preferenceScreen)

    }

    override fun onCreateAdapter(preferenceScreen: PreferenceScreen?): RecyclerView.Adapter<*> =
            object : PreferenceGroupAdapter(preferenceScreen) {
                @SuppressLint("RestrictedApi")
                override fun onPreferenceHierarchyChange(preference: Preference?) {
                    if (preference != null)
                        setAllPreferencesToAvoidHavingExtraSpace(preference)
                    super.onPreferenceHierarchyChange(preference)
                }
            }
}

बस इससे आगे बढ़ें, और आपके पास अपनी प्राथमिकताओं के लिए बेकार पैडिंग नहीं होगी। यहां नमूना परियोजना , जहां मैं उन टोटकों के बजाय, इससे बचने के लिए एक आधिकारिक तरीका रखने का अनुरोध करता हूं। कृपया इसे अभिनीत करने पर विचार करें।


यह केवल समाधान है जो काम करता है। दोनों v7 और androidx पुस्तकालयों के लिए। बहुत अच्छा काम किया!
लोर इलूज

2
मुझे समझ में भी नहीं आता कि यह क्यों है। जब कोई प्रतिस्थापन या एक टूटी हुई नहीं है, तो एपीआई को हटाने / अवरुद्ध करने के लिए Google के साथ क्या है?
वंडर

1
@androiddeveloper मैं यह समझ सकता हूं कि, प्राथमिकता के अलावा। जिन्हें संरेखित नहीं किया जाना चाहिए।
TheWanderer

@ वांडरर खैर मैं पसंद करूँगा अगर प्रत्येक वह स्थान लेगा जो वास्तव में उसकी आवश्यकता है, और यह कि हम किसी भी मामले में किस व्यवहार का उपयोग कर सकते हैं।
एंड्रॉइड डेवलपर

एंड्रॉइडएक्स पर 5 नवंबर, 2018 तक वरीयता श्रेणी बग को निर्धारित किया गया है। मैंने माइग्रेट करने के बाद परीक्षण किया है और यह अब उम्मीद के मुताबिक काम करता है। देखें डेवलपर .android.com/ jetpack/androidx/… । यदि आप माइग्रेट नहीं करना चाहते हैं और कस्टम लेआउट का उपयोग कर रहे हैं, तो मैं अंतर को दूर करने के लिए लगभग 120 की नकारात्मक पैडिंग का उपयोग करने की सलाह देता हूं।
ET

32

सरल कार्य समाधान यहाँ से
यह सभी वरीयताओं को लिखने की आवश्यकता के बिना सभी प्राथमिकताओं में काम करता हैapp:iconSpaceReserved="false"

बनाएँ res/values-sw360dp/values-preference.xml:

<resources xmlns:tools="http://schemas.android.com/tools">
    <bool name="config_materialPreferenceIconSpaceReserved" tools:ignore="MissingDefaultResource,PrivateResource">false</bool>
    <dimen name="preference_category_padding_start" tools:ignore="MissingDefaultResource,PrivateResource">0dp</dimen>
</resources>

<bool>फिक्स का डिफ़ॉल्ट मान iconSpacePreservedसभी के लिए Preference; <dimen>PreferenceCategory ठीक करता है।

संपादित करें: यदि आप उपयोग कर रहे हैं androidx.preference:preference:1.1.1, तो आपको डिमेन की आवश्यकता नहीं होगी preference_category_padding_start। एंड्रॉइड 6-10 पर परीक्षण किया गया।


मेरे लिए भी काम करता है। आपका बहुत बहुत धन्यवाद। लेकिन मुझे समझ में नहीं आता कि इसे केवल "मूल्यों" के बजाय "मूल्यों-sw360dp-v13" नामक निर्देशिका में क्यों होना चाहिए। (इसे "मूल्यों" में रखने से मेरे लिए कोई प्रभाव नहीं पड़ता है।) कोई जानता है कि क्यों?
गेरोन 99

संपूर्ण स्क्रीन के लिए सही समाधान। स्वचालित रूप से सभी चीजें तय हो जाती हैं लेकिन पता नहीं कैसे?
एमडी मोहसिन

7

इसे इस्तेमाल करे:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = super.onCreateView(inflater, container, savedInstanceState);
    if(v != null) {
        ListView lv = (ListView) v.findViewById(android.R.id.list);
        lv.setPadding(10, 10, 10, 10);
    }
    return v;
}

आप का उपयोग करके पैडिंग सेट कर सकते हैं: setPadding();


1
अरे @ डेविड, जवाब के लिए धन्यवाद। लेकिन मैं वरीयता स्क्रीन के लिए कोई कस्टम दृश्य नहीं बना रहा हूं। मैं डिफ़ॉल्ट एक का उपयोग कर रहा हूँ।
डोरी

सहमत मुझे कोई कस्टम दृश्य भी नहीं है। Android दृश्य के लिए इसे सेट करना अच्छा होगा।
खो गया

@lostintranslation मैं मानता हूं कि यह केवल उस उद्देश्य के लिए एक कस्टम दृश्य बनाने के लिए बहुत तर्कसंगत नहीं है, हालांकि मैंने परीक्षण किया है और यह बहुत अच्छा काम करता है।
डिफाल्ट

अफसोस की बात है, जब उपयोग PreferenceFragmentCompat, यह अब कारण नहीं है। पैडिंग (या सिर्फ एक आइकन फ्रेम) अब वरीयताओं के विचारों का एक हिस्सा है।
एंड्रॉयड डेवलपर

5

यदि आप com.android.support:preference-v7लाइब्रेरी का उपयोग कर रहे हैं , तो सुनिश्चित करें कि आपकी वरीयताओं को होस्ट करने वाली गतिविधि के लिए विषय preferenceThemev14 सामग्री वरीयता थीम ओवरले में सेट है:

<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>


1
नए PreferenceFragmentCompatवर्ग का उपयोग करते समय कोई समान समाधान ?
एंड्रॉयड डेवलपर

1
उसके साथ यह कोशिश नहीं की गई, क्षमा करें ... मैं PreferenceFragmentCompatअब भी उपयोग करता हूं, लेकिन मैंने अपनी सेटिंग्स स्क्रीन को पुन: स्थापित किया है और इसमें आइकन शामिल हैं, जो अब मेरे लिए इस पैडिंग को वांछनीय बनाते हैं (यह बाएं संरेखण को सुसंगत रखने में मदद करता है)।
mtrewartha

धन्यवाद @mtrewartha, मैंने अपने प्रत्येक सेटिंग फ़ील्ड के लिए कुछ अर्द्ध-उपयुक्त सामग्री आइकन चुनना समाप्त कर दिया है ताकि इस से छुटकारा पाने के लिए एक रास्ता खोजने के बजाय उपयोग करने के लिए इसे छोड़ दिया जा सके
gregdev

कोई संभावना नहीं, खुशी है कि मैं @ सहायतादेव की मदद कर सकता हूं!
mtrewartha

4

दुर्भाग्य से, ऊपर से कुछ भी मेरे लिए काम नहीं किया।

संक्षिप्त उत्तर :

मैंने कस्टम वरीयता लेआउट के ऊपरवाले कंटेनर पर एक नकारात्मक मार्जिन का उपयोग करके इसे हल किया ।

कदम:

  • वरीयता के लिए एक कस्टम लेआउट बनाएं (जैसे प्रायोरिटी_संगोरी.एक्सएमएल)
  • निर्दिष्ट करें कि आपकी प्राथमिकता एंड्रॉइड को जोड़कर कस्टम लेआउट का उपयोग करती है: एक्सएमएल में वरीयता टैग के लिए लेआउट परम
  • नकारात्मक मार्जिन लागू करें

विस्तृत जवाब:

वरीयता एक्सएमएल:

    <android.support.v7.preference.PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:title="@string/settings_title" >

    <android.support.v7.preference.PreferenceCategory
        android:layout="@layout/preference_category"
        android:key="settings_list"
        android:title="@string/pref_category_settings" />
    <android.support.v7.preference.SwitchPreferenceCompat
        android:layout="@layout/preference_row"
        android:icon="@drawable/ic_nav_switch"
        android:key="pref_switch"
        android:title="@string/pref_switch_title" />

    </android.support.v7.preference.PreferenceScreen>

वरीयता पंक्ति के लिए कस्टम लेआउट जो अनावश्यक बाएँ और दाएँ मार्जिन को हटा देता है:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginStart="-12dp"
    android:layout_marginEnd="-8dp"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:gravity="center_vertical">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@android:id/icon"
            android:layout_width="58dp"
            android:layout_height="58dp"
            android:padding="8dp"
            android:layout_gravity="center"
            android:visibility="visible" />

    </RelativeLayout>

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="15dp"
        android:layout_marginEnd="6dp"
        android:layout_marginTop="6dp"
        android:layout_marginBottom="6dp"
        android:layout_weight="1">

        <TextView
            android:id="@android:id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:textAppearance="?android:attr/textAppearanceListItem"
            android:ellipsize="marquee"
            android:fadingEdge="horizontal" />

        <TextView
            android:id="@android:id/summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@android:id/title"
            android:layout_alignStart="@android:id/title"
            android:textAppearance="?android:attr/textAppearanceListItemSecondary"
            android:textColor="?android:attr/textColorSecondary"
            android:maxLines="2"/>

    </RelativeLayout>

    <LinearLayout
        android:id="@android:id/widget_frame"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="end|center_vertical"
        android:orientation="vertical">

    </LinearLayout>
</LinearLayout>

वरीयता श्रेणी के लिए कस्टम लेआउट जो अनावश्यक बाएँ और दाएँ मार्जिन को हटा देता है:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="@color/colorAccent"
    android:textStyle="bold"
    android:textSize="12sp"
    android:gravity="center_vertical"
    android:textAllCaps="true"
    android:layout_marginStart="-4dp"
    android:layout_marginEnd="-8dp"
    android:id="@+android:id/title" />

महान, आपने मेरी जान बचाई! : डी
। केम्प्स्की

इसके लिए सभी प्रकार की प्राथमिकताओं के लिए एक लेआउट होना चाहिए। यह तुम्हे कहॉँ मिल गये? क्या आपके पास इसके लिए एक पुस्तकालय है? मैंने यहां एक हैक-वाई वर्कअराउंड बनाया है: stackoverflow.com/a/51568782/878126 , लेकिन मुझे लगता है कि आपका समाधान अधिक सुरक्षित है। बस बहुत सी चीजों की नकल करने की जरूरत है ...
Android डेवलपर

आप इसे AOSP के GitHub दर्पण पर पा सकते हैं: वरीयता / उपसर्ग के साथ xml फ़ाइलों की जाँच करें। github.com/aosp-mirror/platform_frameworks_base/tree/…
गॉर्डन

3

गद्दी माता पिता के कारण होता है ListViewमें PreferenceScreenअपनी सेटिंग्स हैं। यदि आप PreferenceFragmentअपनी प्राथमिकताएँ बनाने के लिए उपयोग कर रहे हैं , तो बस onActivityCreatedसमारोह में जाएँ PreferenceFragementऔर पैडिंग निकालने के लिए निम्न कार्य करें:

public void onActivityCreated(Bundle savedInstanceState) {
  super.onActivityCreated(savedInstanceState);

  View lv = getView().findViewById(android.R.id.list);
  if (lv != null) lv.setPadding(0, 0, 0, 0);
}

उपयोग करते समय PreferenceFragmentCompat, यह अब कारण नहीं है। पैडिंग (या सिर्फ एक आइकन फ्रेम) अब वरीयताओं के विचारों का एक हिस्सा है।
एंड्रॉयड डेवलपर

3

वरीयता विषय को इस तरह बदलें। वरीयता पुस्तकालय के नवीनतम संस्करण का उपयोग करना सुनिश्चित करेंandroidx.preference 1.1.0-alpha01

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="preferenceTheme">@style/CustomPreferenceTheme</item>
</style>

<style name="CustomPreferenceTheme" parent="@style/PreferenceThemeOverlay">
    <item name="preferenceFragmentCompatStyle">@style/CustomPreferenceFragmentCompatStyle</item>
    <item name="preferenceCategoryStyle">@style/CustomPreferenceCategory</item>
    <item name="preferenceStyle">@style/CustomPreference</item>
    <item name="checkBoxPreferenceStyle">@style/CustomCheckBoxPreference</item>
    <item name="dialogPreferenceStyle">@style/CustomDialogPreference</item>
    <item name="switchPreferenceCompatStyle">@style/CustomSwitchPreferenceCompat</item>  <!-- for pre lollipop(v21) -->
    <item name="switchPreferenceStyle">@style/CustomSwitchPreference</item>
</style>

 <style name="CustomPreferenceFragmentCompatStyle" parent="@style/PreferenceFragment.Material">
    <item name="android:layout">@layout/fragment_settings</item>
</style>

<style name="CustomPreferenceCategory" parent="Preference.Category.Material">
    <item name="iconSpaceReserved">false</item>
</style>

<style name="CustomPreference" parent="Preference.Material">
    <item name="iconSpaceReserved">false</item>
</style>

<style name="CustomCheckBoxPreference" parent="Preference.CheckBoxPreference.Material">
    <item name="iconSpaceReserved">false</item>
</style>

<style name="CustomDialogPreference" parent="Preference.DialogPreference.Material">
    <item name="iconSpaceReserved">false</item>
</style>

<style name="CustomSwitchPreferenceCompat" parent="Preference.SwitchPreferenceCompat.Material">
    <item name="iconSpaceReserved">false</item>
</style>

<style name="CustomSwitchPreference" parent="Preference.SwitchPreference.Material">
    <item name="iconSpaceReserved">false</item>
</style>

2
दुर्भाग्य से, मुझे इसका एक महत्वपूर्ण बग मिला androidx.preference:preference:1.1.0-alpha01। ऐप में किसी भी दूसरे टुकड़े के ढेर पर डिवाइस के घूमने से क्रैश हो जाएगा। मुझे उम्मीद है कि इसे बाद के संस्करणों में तय किया जाएगा। मैं वापस जाता हूं androidx.preference:preference:1.0.0
जूनोओ

2
@ जूनो: पुष्टि कर सकते हैं। कुछ अस्पष्ट "खंड बचत राज्य विफलता" त्रुटि हो रही थी। इसलिए संस्करण 1.0.0 पर बने रहना जब तक यह ठीक नहीं हो जाता है और मार्जिन को संभालने के लिए इस बीच इस समाधान का पालन ​​किया जाता है ।
गणेश मोहन

iconSpaceReserved केवल version26 और अधिक के लिए उपलब्ध है।
realpranav

2

संकलन 'com.android.support :preference-v7:24.2.1'

का उपयोग करें वरीयताग्राहक.कॉम यह कर सकता है:

1. एक वरीयता समूह एडाप्टर को परिभाषित करें:

    static class CustomAdapter extends PreferenceGroupAdapter {

    public CustomAdapter(PreferenceGroup preferenceGroup) {
      super(preferenceGroup);
    }

    @Override
    public PreferenceViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
      PreferenceViewHolder preferenceViewHolder = super.onCreateViewHolder(parent, viewType);
      parent.setPadding(0, 0, 0, 0);
      preferenceViewHolder.itemView.setPadding(20, 5, 20, 5);
      return preferenceViewHolder;
    }
  }

2. ओवरराइड प्राथमिकताफ्रेममेंटकंपनी की ऑनक्रीट एडॉप्टर विधि:

   @Override
   protected Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {

      return new CustomAdapter(preferenceScreen);
   }

Style.xml का उपयोग कर सकते हैं:

1. सिद्धांत / शैलियों। xml:

  <style name="customPreferenceThemeOverlay" parent="@style/PreferenceThemeOverlay">
    <item name="preferenceFragmentListStyle">@style/customPreferenceFragmentList</item>
  </style>
  <style name="customPreferenceFragmentList">
    <item name="android:paddingLeft">0dp</item>
    <item name="android:paddingRight">0dp</item>
  </style>

2.values-v17 / styles.xml:

  <style name="customPreferenceFragmentList">
    <item name="android:paddingLeft">0dp</item>
    <item name="android:paddingRight">0dp</item>
    <item name="android:paddingStart">0dp</item>
    <item name="android:paddingEnd">0dp</item>
  </style>

3.value / styles.xml:

  <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    ... ...
    <item name="preferenceTheme">@style/customPreferenceThemeOverlay</item>
  </style>

क्या यह सभी वरीयताओं के लिए काम करता है? क्या आपके पास इसके लिए एक पुस्तकालय है?
एंड्रॉयड डेवलपर

1

उपरोक्त उत्तर में से किसी ने भी काम नहीं किया, मुझे वरीयता लेआउट को कॉपी करना था , एक नया लेआउट फ़ाइल बनाना था जैसे कि custom_preference.xml, आइकन की दृश्यता को GONE पर सेट करके लेआउट सामग्री को ओवरराइड करें । और फिर pref.xml में, इस कस्टम लेआउट का उपयोग करने के लिए वरीयता के लिए लेआउट सेट करें।

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <android.support.v7.preference.EditTextPreference
        android:title="@string/pref_label"
        android:hint="@string/pref_hint"
        android:key="@string/pref_key"
        android:inputType="text"
        android:singleLine="true"
        android:layout="@layout/custom_preference_layout"
        />
</PreferenceScreen>

0

The गद्दी ’आरंभ की गई है PreferenceFrameLayout.java:

public PreferenceFrameLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    TypedArray a = context.obtainStyledAttributes(attrs,
            com.android.internal.R.styleable.PreferenceFrameLayout, defStyle, 0);

    float density = context.getResources().getDisplayMetrics().density;
    int defaultBorderTop = (int) (density * DEFAULT_BORDER_TOP + 0.5f);
    int defaultBottomPadding = (int) (density * DEFAULT_BORDER_BOTTOM + 0.5f);
    int defaultLeftPadding = (int) (density * DEFAULT_BORDER_LEFT + 0.5f);
    int defaultRightPadding = (int) (density * DEFAULT_BORDER_RIGHT + 0.5f);

    mBorderTop = a.getDimensionPixelSize(
            com.android.internal.R.styleable.PreferenceFrameLayout_borderTop,
            defaultBorderTop);
    mBorderBottom = a.getDimensionPixelSize(
            com.android.internal.R.styleable.PreferenceFrameLayout_borderBottom,
            defaultBottomPadding);
    mBorderLeft = a.getDimensionPixelSize(
            com.android.internal.R.styleable.PreferenceFrameLayout_borderLeft,
            defaultLeftPadding);
    mBorderRight = a.getDimensionPixelSize(
            com.android.internal.R.styleable.PreferenceFrameLayout_borderRight,
            defaultRightPadding);

    a.recycle();
}

यदि आप जानते हैं कि एंड्रॉइड द्वारा परिभाषित शैलियों को कैसे ओवरराइड करना है, तो आप शायद इसे हल कर सकते हैं। हालांकि यह बहुत सीधा नहीं है।


यह एक भयानक जवाब है, 'यहाँ कोड है, लेकिन मुझे यकीन नहीं है कि यह कैसे करना है' एक जवाब नहीं है।
खो गया

मैं मानता हूं कि यह कोई जवाब नहीं है, लेकिन मैं इस पर अनिश्चित हूं कि इस प्रासंगिक जानकारी को कैसे साझा किया जाए। प्रश्न में देखा गया स्थान फ्रेमवर्क द्वारा जोड़ा गया है, जैसा कि ऊपर देखा गया है, और स्पष्ट रूप से इसे हटाने का कोई विकल्प नहीं है। यानी अगर "com.android.internal.R.styleable.PreferenceFrameLayout" को ओवरराइड करना संभव नहीं है। और मुझे नहीं पता कि कैसे।
ज्येफकेय

क्या आप कृपया बेहतर उत्तर प्रदान कर सकते हैं? शायद गितुब यह दिखाने के लिए कि सभी वरीयताओं के लिए इसका उपयोग कैसे करें?
एंड्रॉयड डेवलपर

0

मैं प्रयोग करके देखता हूं

android:icon="@null"

साथ CheckBoxPreferenceएंड्रॉयड 4.4 में लेकिन बाएं से अतिरिक्त जगह नहीं कर सकते। मैंने एक छोटे पारदर्शी आइकन का उपयोग किया और जोड़ दिया

android:icon="@drawable/transparent_icon" 

और यह मेरे लिए काम लगता है। मुझे उम्मीद है कि यह मदद कर सकता है। धन्यवाद।


"पारदर्शी_कोण" में क्या है? मैंने एक खाली ड्रॉबल की कोशिश की, लेकिन यह मदद नहीं की ...
एंड्रॉइड डेवलपर

0

मुझे नहीं पता कि जवाब के लिए बहुत देर हो चुकी है लेकिन आज मुझे भी यही समस्या थी और इस जवाब से मुझे कुछ भी मदद नहीं मिली।

इसलिए मैंने इस समाधान का उपयोग किया:

मेरे में DisclaimerPreferenceहै कि extends Preference, मैं ovveride onBindView(View view)इस तरह से विधि:

    @Override protected void onBindView(View view) {
        super.onBindView(view);
        if(view instanceof ViewGroup){
            ViewGroup vg = (ViewGroup)view;
            View currView;
            for(int i=0; i<vg.getChildCount(); i++){
               currView = vg.getChildAt(i);
               if (currView instanceof RelativeLayout)
                   currView.setVisibility(View.GONE);
            }
         }
    }

कुंजी RelativeLayoutमुख्य दृश्य के अंदर सेट करना है GONE। कृपया मुझे बताएं कि क्या कुछ गलत है :)


1
अफसोस की बात है, onBindViewनए में अब उपलब्ध नहीं है PreferenceFragmentCompat। इसके बजाय, आप उपयोग कर सकते हैं onCreateAdapterऔर onBindViewHolder, जैसा कि मैंने यहां लिखा है: stackoverflow.com/a/51568782/878126
Android डेवलपर

0

जाहिरा तौर पर, android:layout="@null"xml में अपनी पसंद को जोड़ने की चाल होगी। लेकिन फलस्वरूप, यह शीर्षक आकार को भी बड़ा कर देगा।


इस का उपयोग करने के लिए आसान है, लेकिन जैसा कि आपने लिखा है, यह सभी वरीयताओं की शैली को बर्बाद कर देता है ...:। शायद मेरे हैक-वाई वर्कअराउंड की कोशिश करें: stackoverflow.com/a/51568782/878126
एंड्रॉइड डेवलपर


-1

कुछ समय पहले पूछा गया था, लेकिन इससे मुझे क्या फायदा हुआ यह नकारात्मक मार्जिन था, कस्टम फ़ाइलों की कोई आवश्यकता नहीं है।

जब आप अपना SettingsActivity class बनाते हैं (जिसमें अंदर की तरफ फैरफ्रैगमेंट होता है), तो आप बस यह निर्धारित करते हैं कि यह एक टुकड़ा है और एक नकारात्मक मार्जिन जोड़ें।

settings_activity:

<?xml version="1.0" encoding="utf-8"?>
<fragment
    android:layout_marginLeft="-40dp"
    android:name="com.example.USER.APPNAME.SettingsActivity$PrefsFragment"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.USER.APPNAME.SettingsActivity">
</fragment>

-5

android:defaultValue="false"अपने <PreferenceScreen [...]टैग में जोड़ें :

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.