web-dev-qa-db-ja.com

PreferenceFragmentCompatにはPreferenceCategoryのパディングがあり、それを取り除くことはできません

だから、androidx.preference.PreferenceFragmentCompatを使用して設定アクティビティを作成しようとしてきましたが、すべて正常に動作しています。

ただし、何らかの理由で、選好カテゴリと選好自体の両方に何らかのパディングが存在します。私はapp:iconSpaceReserved = "false"を使用して設定のパディングを取り除くことができましたが、これはカテゴリーでは機能しないようです。

画像

PreferenceThemeOverlay.v14.Materialなど、さまざまなテーマをすべて試しましたが、違いはないようです

すべてが私のコードです!

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>

私の依存関係は...

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'

ご協力いただきありがとうございます。

31
Henry Twist

実際には、これを修正するためのより良いハックがあり、リソースのオーバーライドもあります:

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>は、すべてのiconSpacePreservedPreferenceのデフォルト値を修正します。 <dimen>PreferenceCategoryを修正します。

編集:androidx.preference:preference:1.1.0-alpha01以上を使用している場合、preference_category_padding_start修正は不要で、config_materialPreferenceIconSpaceReservedのみで十分です。

57
Hai Zhang

スタイルの回避策で解決しました。 PreferenceCategoryで動作します。

設定には、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]「@ layout/preference_category_material」からコピー。

@ dimen/preference_category_padding_startAndroid:paddingLeft = "0dp"に置き換えます。カスタムカラー@ 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

修正は現在アルファ版でリリースされています。使用できます

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

または、build.gradleの最新リリース

AndroidXを使用する場合、次の属性をXMLのPreferencesおよびPreference Categoriesに追加するだけで、余分なパディングを追加/削除できます。

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

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

</androidx.preference.PreferenceScreen>

trueはパディングを追加し、falseはそれを削除します。

1
Maksim Ivanov