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