【问题标题】:Android: How to maximize PreferenceFragment width (or get rid of margin)?Android:如何最大化 PreferenceFragment 宽度(或摆脱边距)?
【发布时间】:2012-02-16 16:15:47
【问题描述】:

如果您查看 Android 设置屏幕截图或FragmentsBC 屏幕截图,则 PreferenceFragment 中有边距。你怎么能摆脱它?

我尝试将 PreferenceFragment 宽度设置为 fill_parent,但没有成功。

【问题讨论】:

标签: android preference


【解决方案1】:

终于找到了解决办法。

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

【讨论】:

  • 嘿@jclova,我面临着和我们一样的问题。这是它的链接:stackoverflow.com/questions/18509369/… Acutally 我没有为首选项屏幕创建任何自定义布局。只需在布局中有复选框首选项,尽管它将任何边距设置为左侧。你知道我哪里出错了请帮忙。
  • 请记住,填充量以 Px 为单位。您可能希望在设置之前将它们从 dp 转换为 px
  • 在 xml 中覆盖它的任何方式。
  • 对我来说 "v" 总是返回 null (super.onCreateView(...))
  • 在 Android 4.3 上完美运行,我已经准备好忘记它了。
【解决方案2】:

只是对此的补充;接受的答案对我不起作用,因为ListView 本身没有任何填充集,它是在父视图上设置的(通常是LinearLayout)。因此,以下是必要的:

ListView lv = (ListView) findViewById(android.R.id.list);
ViewGroup parent = (ViewGroup)lv.getParent();
parent.setPadding(0, 0, 0, 0);

【讨论】:

  • 添加lv.setPadding(0, 0, 0, 0);不是更好吗?对我来说@jclova 的答案确实有效,但我将设置lvlv.getParent() 的填充以处理未经测试的设备。谢谢。
【解决方案3】:

getListView().setPadding(left, top, right, bottom)

确保在创建视图后调用它(不是onCreate)。

请记住,您传入的intpixels,而不是dp。要从dp to pixels 转换,请参阅this answer

【讨论】:

  • 这是唯一对我有用的答案。我在PreferenceActivityonCreate() 方法中调用了它。
【解决方案4】:

这就是我在 onResume 覆盖中所做的:

    // Fix PreferenceFragment's padding...
    int paddingSize = 0;
    if (Build.VERSION.SDK_INT < 14)
    {
        paddingSize = (int) (-32 * CLS_Gfx.scale);
    }
    else
    {
        paddingSize = (int) (-16 * CLS_Gfx.scale);
    }

    final View v = getView();

    v.setPadding(paddingSize, 0, paddingSize, 0);

【讨论】:

  • 这对我来说非常有效。甚至 android:icon="@null" 也没有进行任何更改,但您的解决方案有效。非常感谢您的出色解决方案。我认为这应该是一个公认的答案。
  • @Smeet 很高兴它对您有所帮助!
【解决方案5】:

至少对于 PreferenceFragmentCompat,有更优雅的解决方案来定义主题中的填充。假设我们将活动设置为 android:theme="@style/PreferenceTheme"

   <style name="PreferenceTheme" parent="@style/Theme.AppCompat">
       <item name="preferenceTheme">@style/MyPreferenceThemeOverlay</item>
   </style>

   <style name="MyPreferenceThemeOverlay" parent="PreferenceThemeOverlay">
        <item name="preferenceFragmentListStyle">@style/MyPreferenceFragmentListStyle</item>
   </style>

   <style name="MyPreferenceFragmentListStyle" parent="@style/PreferenceFragmentList">
       <item name="android:paddingLeft">0dp</item>
       <item name="android:paddingRight">0dp</item>
   </style>

【讨论】:

  • 这对我不起作用。使用 PreferenceFragmentCompat 时仍会看到填充。此外,我没有收到任何警告或错误,但 甚至不存在(自动完成不起作用)
  • @qkx 自动完成功能不起作用并不意味着该属性不存在; preferenceTheme 属性确实存在 (stackoverflow.com/a/32073430/639183)。所以很可能你有一些设置问题(可能是支持库或其版本?)
  • 我使用的是最新版本 (28.0.0),我从字面上复制粘贴了您的代码并应用了这种样式。它真的根本不起作用:)而且它不能 - 因为问题不是填充,问题是兼容偏好总是为图标保留间距。那是问题的根源,而不是填充。所以你必须将 preserveIconSpacing 设置为 false - 但在代码中,以编程方式(在 xml 中它不起作用)。那是一个真正的解决方案:) 我还在其他一些问题上找到了它,我可以确认它可以完美运行。
  • 好的,它不能工作,它仍然适用于我和至少 2 个赞成的用户;)你复制粘贴了解决方案,但没有设置复制粘贴,所以我的评论仍然是适用:我们可能有不同的设置,这就是为什么它对我有用但对你不起作用。
【解决方案6】:

这里的答案对我不起作用。但是,这个做到了:

来源:https://stackoverflow.com/a/53402144/9026710

在你的 PreferenceScreen 添加这一行:

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

在 PreferenceScreen 中添加这一行及其元素:

app:iconSpaceReserved="false"

例子:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    app:iconSpaceReserved="false"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <CheckBoxPreference
        app:iconSpaceReserved="false"
        android:defaultValue="false"
        android:key="key1"
        android:title="title1" />
    <SwitchPreference
        app:iconSpaceReserved="false"
        android:defaultValue="false"
        android:key="@string/pref_wakeup"
        android:title="key2" />
</PreferenceScreen>

【讨论】:

    【解决方案7】:

    另一种选择是设置您自己的适配器。 这样一来,您就拥有更大的灵活性,并且更能应对变化。

    that other answer about custom header adapter

    【讨论】:

      【解决方案8】:

      当您使用片段进行偏好活动时,这是我使用的解决方案:

      public class T2DPreferenceActivity extends PreferenceActivity {
      
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          getFragmentManager().beginTransaction().replace(android.R.id.content,
                  new T2DPreferenceFragment()).commit();
      }
      
      public static class T2DPreferenceFragment extends PreferenceFragment {
          @Override
          public void onCreate(final Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              addPreferencesFromResource(R.xml.server_screen_preference);
          }
      
          public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
              super.onViewCreated(view, savedInstanceState);
              ListView lv = (ListView)view.findViewById(android.R.id.list);
              ViewGroup parent = (ViewGroup)lv.getParent();
              parent.setPadding(0, 100, 0, 0);
          }
      }
      

      }

      【讨论】:

      • 投反对票时无评论?
      猜你喜欢
      • 2016-11-29
      • 2013-07-24
      • 1970-01-01
      • 2016-11-09
      • 2021-05-25
      • 1970-01-01
      • 2013-01-05
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多