web-dev-qa-db-fra.com

PreferenceFragmentCompat a un rembourrage sur PreferenceCategory dont je ne peux pas me débarrasser

Donc, j'ai essayé de créer une activité de paramètres en utilisant androidx.preference.PreferenceFragmentCompat et tout fonctionne bien.

Cependant, pour une raison quelconque, des marges de remplissage sont présentes à la fois dans les catégories de préférences et les préférences elles-mêmes. J'ai réussi à supprimer le remplissage des préférences en utilisant app: iconSpaceReserved = "false" mais cela ne semble pas fonctionner pour les catégories.

Image

J'ai essayé tous les thèmes, PreferenceThemeOverlay.v14.Material etc., mais ils ne semblent pas faire la différence

Voici mon code pour tout!

ParamètresActivité.Java

import Android.os.Bundle;

import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

public class SettingsActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);

        Toolbar toolbar = findViewById(R.id.settings_toolbar);
        setSupportActionBar(toolbar);
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setDisplayShowTitleEnabled(false);
        }

    }
}

activity_settings.xml

<androidx.constraintlayout.widget.ConstraintLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context=".SettingsActivity">

    <androidx.appcompat.widget.Toolbar
        Android:id="@+id/settings_toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <TextView
            style="@style/ToolbarTitle"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="@string/title_settings"
            Android:textColor="@color/font_dark_primary" />

    </androidx.appcompat.widget.Toolbar>

    <fragment
        Android:name="com.henrytwist8gmail.fullcart.SettingsTestFragment"
        Android:tag="settings_fragment"
        Android:layout_width="match_parent"
        Android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@id/settings_toolbar" />

</androidx.constraintlayout.widget.ConstraintLayout>

ParamètresTestFragment.Java

import Android.os.Bundle;

import androidx.preference.PreferenceFragmentCompat;

public class SettingsTestFragment extends PreferenceFragmentCompat {

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {

        setPreferencesFromResource(R.xml.preferences_test, rootKey);
    }
}

preferences_test.xml

<PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <PreferenceCategory Android:title="test" >

        <Preference Android:title="testPref" />
    </PreferenceCategory>

</PreferenceScreen>

Mes dépendances sont ...

implementation 'com.google.Android.material:material:1.0.0-beta01'
implementation 'androidx.preference:preference:1.0.0-beta01'
implementation 'androidx.constraintlayout:constraintlayout:1.1.2'

Merci de votre aide.

31
Henry Twist

En fait, il existe un meilleur hack pour résoudre ce problème, également en surchargeant les ressources:

Créer res/values-sw360dp-v13/values-preference.xml:

<?xml version="1.0" encoding="utf-8"?>

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

Le <bool> corrige la valeur par défaut de iconSpacePreserved pour tous Preference; Le <dimen> corrige le PreferenceCategory.

EDIT: Si vous utilisez androidx.preference:preference:1.1.0-alpha01 ou supérieur, vous n’avez pas besoin du preference_category_padding_start correctif et config_materialPreferenceIconSpaceReserved suffira.

57
Hai Zhang

J'ai résolu par une solution de contournement avec des styles. Cela fonctionne avec PreferenceCategory.

Pour les préférences, utilisez simplement: app: iconSpaceReserved = "false".

[styles.xml]

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="preferenceTheme">@style/AppPreferenceTheme</item>
</style>

<style name="AppPreferenceTheme" parent="@style/PreferenceThemeOverlay.v14.Material">
    <item name="preferenceCategoryStyle">@style/FixForPreferenceCategoryStyle</item>

    <!-- <item name="Android:textColor">#ffffffff</item> -->
    <!-- <item name="Android:textColorSecondary">#b3ffffff</item> -->
    <!--when the check box is checked-->
    <!--<item name="colorControlNormal">#FF4081</item>-->
    <!--when the check box is unchecked -->
    <!--<item name="colorControlActivated">#81FF40</item>-->
</style>

<style name="FixForPreferenceCategoryStyle" parent="@style/Preference.Category.Material">
    <item name="Android:layout">@layout/_preference_category_material</item>
</style>

<color name="_preference_fallback_accent_color">@color/colorAccent</color>

[_ preference_category_material.xml] copié de "@ layout/preference_category_material".

Remplacez @ dimen/preference_category_padding_start par Android: paddingLeft = "0dp" . Ajouter une couleur personnalisée @ color/_preference_fallback_accent_color .

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_marginBottom="8dp"
    Android:layout_marginTop="8dp"
    Android:layout_marginLeft="?android:attr/listPreferredItemPaddingLeft">

    <LinearLayout
        Android:id="@+id/icon_frame"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:gravity="start|center_vertical"
        Android:orientation="horizontal">
        <Android.support.v7.internal.widget.PreferenceImageView
            Android:id="@Android:id/icon"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            app:maxHeight="18dp"
            app:maxWidth="18dp"/>
    </LinearLayout>

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical"
        Android:paddingLeft="0dp"><!-- SET to 0dp -->
        <!--Android:paddingLeft="@dimen/preference_category_padding_start"-->

        <TextView
            Android:id="@Android:id/title"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_marginTop="16dp"
            Android:paddingRight="?android:attr/listPreferredItemPaddingRight"
            Android:textAlignment="viewStart"
            Android:textColor="@color/_preference_fallback_accent_color"/>
        <TextView
            Android:id="@Android:id/summary"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:ellipsize="end"
            Android:singleLine="true"
            Android:textColor="?android:attr/textColorSecondary"/>
    </LinearLayout>

</FrameLayout>
5
T-igra

Le correctif est actuellement publié en alpha. Vous pouvez utiliser

implementation 'androidx.preference:preference:1.1.0-alpha01'

ou le dernier publié dans votre build.gradle

2

Si vous utilisez AndroidX, vous pouvez ajouter/supprimer un remplissage supplémentaire en ajoutant simplement l'attribut suivant à vos catégories de préférences et de préférences en XML:

<androidx.preference.PreferenceScreen
    xmlns:app="http://schemas.Android.com/apk/res-auto">

    <Preference
        ...
        app:iconSpaceReserved="true/false"
        .../>

</androidx.preference.PreferenceScreen>

true ajoute un rembourrage supplémentaire, false le supprime.

1
Maksim Ivanov