代码之家  ›  专栏  ›  技术社区  ›  Henry Twist Jjonns

PreferenceFragmentCompat在PreferenceCategory上有填充,我无法清除

  •  24
  • Henry Twist Jjonns  · 技术社区  · 6 年前

    所以我试着用androidx.preference.PreferenceFragmentCompat创建一个设置活动,一切正常。

    但是由于某些原因,在偏好类别和偏好本身上都存在一些填充。我使用app:iconspacerved=“false”设法去掉了首选项上的填充,但这似乎对类别不起作用。

    Image

    我试过所有不同的主题,比如Themeoverlay.v14.Material等等,但似乎没有什么不同

    这是我的密码!

    设置活动.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);
            }
    
        }
    }
    

    活动设置.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>
    

    设置stfragment.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);
        }
    }
    

    首选项\u 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'
    

    谢谢你的帮助。

    4 回复  |  直到 6 年前
        1
  •  63
  •   Hai Zhang    5 年前

    实际上,有一个更好的方法来解决这个问题,也可以使用资源覆盖:

    创建 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> 修复的默认值 iconSpacePreserved 为所有人 Preference ;的 <dimen> 修复 PreferenceCategory .

    编辑:如果使用 androidx.preference:preference:1.1.0-alpha01 或者更高,你不需要 preference_category_padding_start 修复和 config_materialPreferenceIconSpaceReserved 就够了。

        2
  •  5
  •   T-igra    6 年前

    我用一种变通的方法解决了问题。它与 优先范畴 .

    只需使用:app:iconspacerved=“false”作为首选项。

    [样式.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\u category\u material”。

    替换 @尺寸/首选项类别填充开始 具有 android:paddingLeft=“0dp” . 添加自定义颜色 @颜色/首选项/备用项/强调色 .

    <?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>
    
        3
  •  3
  •   Maksim Ivanov    5 年前

    如果使用 安卓立德 ,只需将以下属性添加到XML中的首选项和首选项类别,就可以添加/删除额外的填充:

    <androidx.preference.PreferenceScreen
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <Preference
            ...
            app:iconSpaceReserved="true/false"
            .../>
    
    </androidx.preference.PreferenceScreen>
    

    true 添加额外的填充, false 移除它。

        4
  •  2
  •   Arun Kumar Nagarajan    6 年前

    该修补程序目前在alpha中发布。你可以用

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

    或者最新发布的