Android: как увеличить ширину PreferenceFragment (или избавиться от поля)?

Снимок экрана настроек Android

Скриншот FragmentsBC

Если вы посмотрите на скриншот настроек Android или FragmentsBC, там являются маржей в PreferenceFragment. Как вы можете избавиться от него?

Я попытался сделать ширину PreferenceFragment равной fill_parent, но безуспешно.


person jclova    schedule 16.02.2012    source источник
comment
Ответ на аналогичный вопрос здесь: stackoverflow.com/questions/18509369/   -  person Vivek    schedule 06.11.2018


Ответы (8)


Наконец, я нашел решение этой проблемы.

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

person jclova    schedule 22.02.2012
comment
привет, @jclova, у меня та же проблема, что и у тебя. Вот ссылка на него: stackoverflow.com/questions/18509369/ На самом деле я не создаю какой-либо собственный макет для экрана настроек. Просто наличие флажка в макете, хотя он устанавливает любое поле слева. У вас есть идеи, где я ошибаюсь, пожалуйста, помогите. - person Dory; 29.08.2013
comment
Имейте в виду, что количество заполнения указано в Px. Вы, вероятно, захотите преобразовать их из dp в px перед установкой - person Felipe Lima; 19.03.2014
comment
Любой способ переопределить это в xml. - person lostintranslation; 23.03.2014
comment
Для меня v всегда возвращает null (super.onCreateView(...)) - person Gilian; 13.06.2016
comment
Работал без нареканий с Android 4.3, готовился о нем забыть. - person MRodrigues; 21.07.2016
comment
getListView().setPadding(0, 0, 0, 0); для android.support.v7.preference.PreferenceFragmentCompat. - person matoni; 21.08.2017

Просто дополнение к этому; принятый ответ не сработал для меня, потому что у самого ListView нет набора отступов, он установлен в родительском представлении (обычно LinearLayout). Поэтому вместо этого было необходимо следующее:

ListView lv = (ListView) findViewById(android.R.id.list);
ViewGroup parent = (ViewGroup)lv.getParent();
parent.setPadding(0, 0, 0, 0);
person devunwired    schedule 09.07.2012
comment
Не лучше ли добавить lv.setPadding(0, 0, 0, 0);? Для меня ответ @jclova работает, но я установлю оба дополнения lv и lv.getParent() для работы с непроверенными устройствами. Спасибо. - person Weekend; 12.11.2015

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

Обязательно вызывайте его после создания представления (не onCreate).

Имейте в виду, что int, которое вы передаете, находится в pixels, а не dp. Чтобы преобразовать из dp to pixels, см. этот ответ.

person theblang    schedule 08.05.2014
comment
Это единственный ответ, который сработал для меня. Я вызвал это в методе onCreate() моего PreferenceActivity. - person Maurizio; 02.08.2014

Вот что я делаю в переопределении 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);
person Phantômaxx    schedule 24.10.2013
comment
Это отлично работает для меня. Даже android:icon=@null не вносил никаких изменений, но ваше решение работает. Большое спасибо за отличное решение. Я думаю, что это должен быть принятый ответ. - person Smeet; 12.07.2017
comment
@Smeet Я рад, что тебе помогло! - person Phantômaxx; 12.07.2017

Существует более элегантное решение, по крайней мере для 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>
person ernazm    schedule 03.05.2017
comment
это не работает для меня. По-прежнему видны отступы при использовании PreferenceFragmentCompat. Кроме того, я не получаю никаких предупреждений или ошибок, но ‹item name=preferenceTheme› даже не существует (автозаполнение не работает) - person qkx; 12.03.2019
comment
@qkx тот факт, что автозаполнение не работает, не означает, что атрибута не существует; Атрибут preferenceTheme существует (stackoverflow.com/a/32073430/639183). Так что, скорее всего, у вас есть проблемы с настройкой (возможно, с библиотекой поддержки или ее версией?) - person ernazm; 14.03.2019
comment
Я использую последнюю версию (28.0.0), и я буквально скопировал ваш код и применил этот стиль. Это действительно вообще не работает :) И не может - потому что проблема не в отступах, проблема в том, что предпочтение совместимости всегда резервирует интервал для значка. В этом корень проблемы, а не в прокладке. Таким образом, вы должны установить для saveIconSpacing значение false, но программно в коде (в xml это работает). Это реальное решение :) Я также нашел его по некоторым другим вопросам и могу подтвердить, что оно отлично работает. - person qkx; 14.03.2019
comment
Хорошо, это не может работать, тем не менее это работает для меня и по крайней мере для 2 проголосовавших пользователей;) Вы скопировали решение, но нет настройки для копирования и вставки, поэтому мой комментарий все еще применим: у нас могут быть разные настройки, вот почему это работает для меня, но не работает для вас. - person ernazm; 14.03.2019

Ответы здесь не сработали для меня. Однако этот сделал:

источник: 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>
person Tayyab Mazhar    schedule 18.05.2020

Другой вариант — установить собственный адаптер. Таким образом, вы получаете больше гибкости и более устойчивы к изменениям.

См. другой ответ о пользовательском адаптере заголовка

person lujop    schedule 03.08.2016

Когда вы выполняете действие предпочтения с фрагментом, вот решение, которое я использовал:

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

}

person Droid Chris    schedule 29.06.2017
comment
Нет комментариев при голосовании против? - person Droid Chris; 03.10.2018