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

我在devise偏好屏幕时面临着很奇怪的问题。 尽pipe我没有给出任何保证金,但是留下了一些空间。

正如你可以看到下面的图片: 在这里输入图像说明

XML:

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

我在屏幕上添加checkbox选项时做错了什么?

Solutions Collecting From Web of "Android:如何在首选项屏幕中删除边距/填充"

尝试这个:

 @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();来设置填充setPadding();

填充由包含您的设置的PreferenceScreen中的父级ListView引起。 如果使用PreferenceFragment创build首选项,只需转到PreferenceFragement的onActivityCreated函数,然后执行以下操作以删除填充:

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

编译“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.Override 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> 

不幸的是,上面的东西没有为我工作。

简短的回答

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

脚步:

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

详细答案:

首选项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" /> 

“填充”是在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定义的样式,则可以解决此问题。 然而这并不是非常简单。

我尝试使用

 android:icon="@null" 

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

 android:icon="@drawable/transparent_icon" 

这对我来说似乎是工作。 我希望它可以帮助。 谢谢。

我不知道答案是否太晚,但今天我有同样的问题,这个答案没有帮助我。

所以我使用这个解决scheme:

extends Preference我的DisclaimerPreference中,我以这种方式onBindView(View view)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 。 请让我知道是否有错误:)

显然,在xml中添加android:layout="@null"可以实现这个function。 但是,它也会使标题大一些。

这是一个延迟的回复,但尝试在CheckBoxPreferences下设置android:icon =“@ null”:

 <CheckBoxPreference ... android:icon="@null" /> 

android:defaultValue="false"到您的<PreferenceScreen [...]标签:

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