38 votes

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

J'ai donc essayé de créer un des paramètres de l'activité à l'aide de androidx.la préférence.PreferenceFragmentCompat et ça fonctionne très bien.

Cependant, pour une raison quelconque il y a quelques rembourrage présent à la fois sur la préférence catégories et les préférences eux-mêmes. J'ai réussi à me débarrasser de la marge sur les préférences à l'aide d'app:iconSpaceReserved="false" mais cela ne semble pas fonctionner sur les catégories.

Image

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

Voici mon code pour tout!

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

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

Mon dépendances...

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 pour votre aide.

84voto

Dreaming in Code Points 94

En fait, il existe un meilleur hack pour résoudre ce problème, également avec le remplacement des 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>
 

<bool> fixe 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 plus, vous aurez pas besoin du preference_category_padding_start fixe et config_materialPreferenceIconSpaceReserved ne sera suffisant.

6voto

T-igra Points 1272

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

De Préférence utilisation: application: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ées à partir de "@mise en page/preference_category_material".

Remplacer @dimen/preference_category_padding_start avec android:paddingLeft="0dp". Ajouter de la couleur personnalisée @couleur/_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>

4voto

Maksim Ivanov Points 83

Si vous utilisez AndroidX , vous pouvez ajouter / supprimer un remplissage supplémentaire en ajoutant simplement l'attribut suivant à vos préférences et catégories 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 supprime.

3voto

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

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

ou la dernière version publiée dans votre build.gradle

1voto

Nisarg Jani Points 62

Ce bug a été corrigé dans la dernière version de la préférence androidx

Essayez de suivre la dépendance dans votre build.

     implementation 'androidx.preference:preference:1.1.0'
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X