Android:如何在首选项屏幕中删除边距/填充


79

我在设计首选项屏幕时遇到非常奇怪的问题。尽管我没有在布局上留出任何余地,但仍留有一些空间。

正如您在下图中看到的: 在此处输入图片说明

XML:

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

在屏幕上添加复选框首选项时我做错了吗?


您可能会在这里
Miral

嘿,米兰拉,谢谢你的回复。但是我没有
为首

您能告诉我们您的布局文件吗?
罗宾·迪克霍夫

<PreferenceScreen xmlns:android =“ schemas.android.com/apk/res/android ”> <CheckBoxPreference android:defaultValue =“ false” android:key =“ prefSync” android:title =“自动同步” /> </ PreferenceScreen>这是代码
Dory

看看[这个答案](stackoverflow.com/a/41101859/1785516)可能会帮助解决您的问题。
荷航

Answers:


148

针对androidx更新此内容。

经过大量的实验,我通过将其添加具有多余缩进的每个首选项解决了该问题:

app:iconSpaceReserved="false"

当然,您还需要将此添加到xml顶部的PreferenceScreen声明本身中:

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
我不知道你是谁,但我会找到你的,并感谢你!:)
David

这是正确的方法。我猜不需要自定义类。现在看来,Android默认情况下会为图标保留一个空间。
Blogger

1
这也适用于PreferenceFragmentCompatsupport lib 28.0.0。大!
jayeffkay

7
那喜好类别呢?偏好类别似乎不起作用
Jknair

1
首选项类别在androidx.preference:preference:1.1.0中工作正常
kalandar

53

我已经在此处报告了此问题(您也可以在此处检查我的解决方法项目),但是到目前为止,我发现了一些hack-y的简单方法可以克服此问题:

  • 对于PreferenceCategory,我将其布局的开始/左侧填充设置为0。

  • 对于其他类型的首选项,我选择隐藏icon_frame它们,以防它们没有图标。

这是代码。只是从此类扩展,其余的都是自动的:

科特林

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样本中可以找到XML样本,我在这里创建了该样本以进行检出):

在此处输入图片说明

此代码有点危险,因此请确保在每次更新库时都检查它是否工作正常。

另外,在某些特殊情况下,例如在android:layout您自己定义首选项时,它可能无法很好地工作,因此您必须对此进行修改。


得到了更好,更官方的解决方案:

对于每个首选项,请使用app:iconSpaceReserved="false"。这应该可以正常工作,但是由于某种原因,存在一个(已知的)错误,该错误不适用于PreferenceCategory。据报道,此处应在不久的将来修复。

因此,现在您可以使用我编写的解决方法和此标志的混合版本。


编辑:找到了另一个解决方案。这将克服所有首选项,并isIconSpaceReserved为每个首选项进行设置。不幸的是,正如我上面所写的那样,如果您使用PreferenceCategory,它将使其崩溃,但是如果您不使用它,它应该可以正常工作:

科特林

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);
        }
    }
}

编辑: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库。干得好!
Lior Iluz

2
我什至不明白为什么这是一回事。如果没有替代品或损坏的替代品,那么Google弃用/移除/阻止API会发生什么?
TheWanderer '18 -10-28

1
@androiddeveloper我可以理解,除了PreferenceCategories。那些不应该对齐。
TheWanderer '18 -10-28

@TheWanderer好吧,我希望每个人都可以占用其真正需要的空间,并且在任何情况下我们都可以选择使用哪种行为。
Android开发人员

PreferenceCategory错误已于2018年11月5日在AndroidX上修复。迁移后,我已经进行了测试,现在可以正常使用了。请参阅developer.android.com/jetpack/androidx/…。如果您不希望迁移并使用自定义布局,建议您使用大约120的负填充来消除间隙。
美国东部时间

28

这里开始简单的工作解决方案。
它适用于所有首选项,而无需写入所有首选项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,则不需要dimen preference_category_padding_start。在Android 6-10上测试。


也为我工作。非常感谢你。但是我不明白为什么它必须位于一个名为“ values-sw360dp-v13”的目录中,而不仅仅是“ values”。(将其放在“值”中对我没有影响。)有人知道为什么吗?
Gereon99

整个屏幕的完美解决方案。自动修复所有问题,但不知道如何解决?
莫辛

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
嘿@David,谢谢您的回复。但是我没有为首选项屏幕创建任何自定义视图。我正在使用默认的。
多丽

同意我也没有自定义视图。最好将其设置为android视图。
lostintranslation 2014年

@lostintranslation我同意仅为此目的创建自定义视图不是很合逻辑,但是我已经测试过,并且效果很好。
2014年

可悲的是,使用时PreferenceFragmentCompat,这不再是原因。现在,填充(或只是图标框)是首选项视图的一部分。
Android开发人员

5

如果您使用的是com.android.support:preference-v7库,请确保托管您的首选项的活动的主题已preferenceTheme设置为v14材质首选项主题叠加层:

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


1
使用新PreferenceFragmentCompat类时是否有任何类似的解决方案?
Android开发人员

1
尚未尝试过,对不起...我PreferenceFragmentCompat现在也使用过,但是自那时以来,我重新设置了设置屏幕的样式,并添加了图标,这些图标现在对于我来说很理想(这有助于保持左对齐)。
mtrewartha

感谢@mtrewartha,我最后只是为我的每个设置字段选择了一些半合适的Material图标来使用此左间距,而不是试图找到一种方法来摆脱它
gregdev

没有问题,很高兴我可以帮助@gregdev!
mtrewartha

4

不幸的是,没有什么对我有用。

简短答案

我通过在自定义首选项布局的最上层容器上使用负边距来解决此问题。

脚步:

  • 为首选项创建一个自定义布局(例如preference_category.xml)
  • 通过将android:layout参数添加到XML中的首选项标签来指定您的首选项使用自定义布局
  • 应用负边距

详细答案:

首选项XML:

    <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" />

太好了,您救了我的命!:D
K. Kempski '18

这就需要为所有类型的首选项设置一个布局。你在哪里找到他们?您有图书馆吗?我在这里做了一个hack-y解决方法:stackoverflow.com/a/51568782/878126,但是我认为您的解决方案更安全。只是需要大量工作来复制内容...
android开发人员

您可以在AOSP的GitHub镜像上找到它:检查带有preference_前缀的xml文件。github.com/aosp-mirror/platform_frameworks_base/tree/…–
Gord

3

填充是由父母造成ListViewPreferenceScreen包含您的设置。如果您使用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,这不再是原因。现在,填充(或只是图标框)是首选项视图的一部分。
Android开发人员

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
Joonsoo,

2
@Joonsoo:可以确认。收到一些模糊的“片段保存状态失败”错误。因此,请继续使用版本1.0.0,直到它得到修复,并同时遵循此解决方案来处理边距。
Ganesh Mohan

iconSpaceReserved仅适用于版本26和更高版本。
realpranav

2

编译'com.android.support:preference-v7:24.2.1'

使用PreferenceFragmentCompat可以做到这一点:

1,定义一个PreferenceGroupAdapter

    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.重写PreferenceFragmentCompat的onCreateAdapter方法:

   @Override
   protected Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {

      return new CustomAdapter(preferenceScreen);
   }

使用style.xml可以做到这一点:

1.values / styles.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>

这适用于所有偏好吗?您有图书馆吗?
Android开发人员

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

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();
}

如果您知道如何覆盖Android定义的样式,则可以解决此问题。但是,这不是很简单。


这是一个可怕的答案,“这是代码,但我不确定该怎么做”不是答案。
lostintranslation 2014年

我同意这不是答案,但是我不确定如何共享此相关信息。如上所示,问题是在框架中添加的,显然,没有选择将其删除。即,如果无法覆盖“ com.android.internal.R.styleable.PreferenceFrameLayout”。而且我不知道该怎么做。
jayeffkay 2014年

您能提供一个更好的答案吗?也许Github展示了如何在所有首选项中使用它?
Android开发人员

0

我尝试使用

android:icon="@null"

CheckBoxPreference在Android 4.4系统,但不能从左填充。我欺骗了使用一个小的透明图标并添加

android:icon="@drawable/transparent_icon" 

似乎对我有用。希望对您有所帮助。谢谢。


什么是“ transparent_icon”?我尝试了一个空的drawable,但这没有帮助...
android开发人员

0

我不知道答案是否为时已晚,但是今天我遇到了同样的问题,这些答案都没有帮助我。

所以我用这个解决方案:

在我DisclaimerPreferenceextends Preference,我onBindView(View view)以这种方式ovveride方法:

    @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。相反,您可以使用onCreateAdapteronBindViewHolder,就像我在这里写道:stackoverflow.com/a/51568782/878126
android开发人员



-1

在很久以前问过,但是帮助我解决这个问题的是负利润,不需要自定义文件。

当您创建SettingsActivity类(内部包含PreferenceFragment)时,只需将其布局设置为片段并添加负的边距即可。

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">

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.