Android: Як видалити поля / відступи на екрані налаштувань


83

Я стикаюся з дуже дивною проблемою при розробці екрану налаштувань. Хоча я не даю жодного поля в макеті, це залишає трохи місця в лівому.

Як ви можете бачити на зображенні нижче: введіть тут опис зображення

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 = "Auto Sync" /> </PreferenceScreen> ось код
Дорі

Подивіться на [цю відповідь] ( stackoverflow.com/a/41101859/1785516 ), можливо, це допомогло б вирішити вашу справу.
KLM

Відповіді:


153

Оновлення цього для androidx.

Після довгих експериментів я вирішив цю проблему, додавши це до кожного уподобання, яке мало зайвий відступ:

app:iconSpaceReserved="false"

Звичайно, вам також потрібно буде додати це до самого оголошення PreferenceScreen у верхній частині вашого 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
я не знаю, хто ти, але знайду тебе і подякую за тебе! :)
Девід

Це правильний шлях; немає необхідності користувацьких класів, я думаю. Зараз Android, схоже, резервує місце для значків.
Blogger

1
Це також працює для PreferenceFragmentCompatпідтримки lib 28.0.0. Чудово!
jayeffkay

7
А як щодо категорії переваг? Категорія преференцій, здається, не працює
jknair

1
Преференційна категорія, яка чудово працює в androidx.preference: преференція: 1.1.0
kalandar

53

Я повідомляв про цю проблему тут (ви також можете перевірити мій проект обхідного рішення там), але наразі я знайшов трохи хакі, але простий спосіб подолати це:

  • Адже 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)
        }
    }
}

Java

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

І результат (зразок XML можна знайти тут для цього зразка Google , який я створив тут для перевірки):

введіть тут опис зображення

Цей код трохи небезпечний, тому переконайтеся, що після кожного оновлення бібліотеки ви перевіряєте, чи працює він нормально.

Крім того, це може не спрацювати у деяких особливих випадках, наприклад, коли ви визначаєте android:layoutвласну перевагу, тож вам доведеться її змінити.


Отримали краще, більш офіційне рішення:

Для кожного уподобання використовуйте app:iconSpaceReserved="false". Це має працювати нормально, але з якоїсь причини існує (відома) помилка, яка не працює для PreferenceCategory. Про це повідомлялося тут , і це має бути виправлено найближчим часом.

Тож наразі ви можете використовувати комбіновану версію обхідного шляху, який я написав, та цей прапор.


EDIT: Знайдено ще одне рішення. Цей отримає всі переваги та встановить 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
        }
    }

Java

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. Робота молодця!
Ліор Ілуз,

2
Я навіть не розумію, чому це річ. Що з Google припиняє / видаляє / блокує API, коли заміни немає або він не працює?
TheWanderer

1
@androiddeveloper Я це розумію, крім PreferenceCa Categories. Ті не повинні вирівнюватися.
TheWanderer

@TheWanderer Ну, я б вважав за краще, щоб кожен зайняв місце, яке йому справді потрібно, і щоб ми могли вибрати, яку поведінку використовувати в будь-якому випадку.
розробник android

Помилка PreferenceCategory виправлена ​​станом на 5 листопада 2018 року на AndroidX. Я тестував після міграції, і зараз він працює, як очікувалося. Див. Developer.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.

EDIT: Якщо ви використовуєте androidx.preference:preference:1.1.1, розмір вам не знадобиться preference_category_padding_start. Перевірено на Android 6-10.


Працює і для мене. Дуже дякую. Але я не розумію, чому це має бути в каталозі, який називається "values-sw360dp-v13", а не просто "values". (Розміщення його у "значеннях" для мене не впливає.) Хтось знає, чому?
Gereon99

Ідеальне рішення для всього екрану. Автоматично все виправлено, але не знаєте як?
Md

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.
загублений переклад 24.03.14

@lostintranslation Я згоден, що не надто логічно створювати власний вигляд саме для цієї мети, проте я протестував, і він чудово працює.
defhlt

На жаль, при використанні 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, я в підсумку просто вибрав кілька напіввідповідних піктограм матеріалу для кожного з моїх полів налаштувань, щоб використати цей лівий інтервал, а не намагатися знайти спосіб його позбутися
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
К. Кемпський

Для цього потрібно мати макет для всіх типів уподобань. Де ви їх знайшли? У вас є для цього бібліотека? Я зробив тут обхідне рішення: stackoverflow.com/a/51568782/878126 , але я думаю, що ваше рішення безпечніше. Просто потрібно багато роботи над копіюванням речей ...
розробник android

Ви можете знайти його на GitHub дзеркалі AOSP: перевірте файли xml із префіксом preference_. github.com/aosp-mirror/platform_frameworks_base/tree/…
Горд,

3

Заповнення викликане батьком ListViewу відповідних PreferenceScreenналаштуваннях. Якщо ви використовуєте a 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, поки вона не буде виправлена, і тим часом дотримуйтесь цього рішення, щоб обробляти поля.
Ганеш Мохан

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's 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, можливо, ви могли б це вирішити. Однак це не дуже прямо.


Це жахлива відповідь: "ось код, але я не впевнений, як це зробити" - це не відповідь.
загублений переклад 24.03.14

Я погоджуюсь, що це не відповідь, але я не впевнений, як інакше поділитися цією відповідною інформацією. Простір, побачений у питанні, додається фреймворком, як видно вище, і, очевидно, немає можливості його видалити. Тобто, якщо немає можливості замінити "com.android.internal.R.styleable.PreferenceFrameLayout". І що я не знаю, як це робити.
jayeffkay

Чи можете ви дати кращу відповідь? Може Github показати, як використовувати його за будь-яких уподобань?
розробник android

0

Я намагаюся використовувати

android:icon="@null"

з CheckBoxPreferenceв Android 4.4, але не може заповнювати ліворуч. Я обдурив маленький прозорий значок і додав

android:icon="@drawable/transparent_icon" 

і це, здається, працює для мене. Сподіваюся, це може допомогти. Дякую.


Що в "transparent_icon"? Я спробував порожній малюнок, але це не допомогло ...
розробник android

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
розробник 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">

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.