PreferenceFragmentCompat 在 PreferenceCategory 上有填充,我无法摆脱
PreferenceFragmentCompat has padding on PreferenceCategory that I can't get rid of
所以我一直在尝试使用 androidx.preference.PreferenceFragmentCompat 创建设置 activity,并且一切正常。
但是由于某种原因,偏好类别和偏好本身都存在一些填充。我设法通过使用 app:iconSpaceReserved="false" 摆脱了首选项的填充,但这似乎不适用于类别。
Image
我已经尝试了所有不同的主题,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'
我通过样式解决方法解决了问题。它适用于 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_start 替换为 android: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>
实际上有一个更好的 hack 来解决这个问题,也有资源覆盖:
创建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>
为所有Preference
修复默认值iconSpacePreserved
; <dimen>
修复了 PreferenceCategory
.
编辑:如果您使用的是 androidx.preference:preference:1.1.0-alpha01
或更高版本,则不需要 preference_category_padding_start
修复并且 config_materialPreferenceIconSpaceReserved
就足够了。
该修复程序目前发布了 alpha 版。您可以使用
implementation 'androidx.preference:preference:1.1.0-alpha01'
或您 build.gradle
中最新发布的一个
如果使用 AndroidX,您可以 add/remove 额外填充,只需将以下属性添加到 XML 中的首选项和首选项类别:
<androidx.preference.PreferenceScreen
xmlns:app="http://schemas.android.com/apk/res-auto">
<Preference
...
app:iconSpaceReserved="true/false"
.../>
</androidx.preference.PreferenceScreen>
true
添加额外的填充,false
删除它。
此错误已在最新版本的 androidx 首选项中修复
尝试在你的项目中遵循依赖关系 Build.Gradle
implementation 'androidx.preference:preference:1.1.0'
我发现以编程方式更容易,而不是处理样式:
private fun Preference.removeIconSpace() {
setIconSpaceReserved(false)
if (this is PreferenceGroup) {
for (i in 0 until preferenceCount) {
getPreference(i).removeIconSpace()
}
}
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.settings, rootKey)
…
preferenceScreen.removeIconSpace()
}
如果您使用的是 AndroidX,只需添加以下属性即可 add/remove 额外填充。
<Preference
...
app:iconSpaceReserved="false/true"
.../>
所以我一直在尝试使用 androidx.preference.PreferenceFragmentCompat 创建设置 activity,并且一切正常。
但是由于某种原因,偏好类别和偏好本身都存在一些填充。我设法通过使用 app:iconSpaceReserved="false" 摆脱了首选项的填充,但这似乎不适用于类别。
Image
我已经尝试了所有不同的主题,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'
我通过样式解决方法解决了问题。它适用于 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_start 替换为 android: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>
实际上有一个更好的 hack 来解决这个问题,也有资源覆盖:
创建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>
为所有Preference
修复默认值iconSpacePreserved
; <dimen>
修复了 PreferenceCategory
.
编辑:如果您使用的是 androidx.preference:preference:1.1.0-alpha01
或更高版本,则不需要 preference_category_padding_start
修复并且 config_materialPreferenceIconSpaceReserved
就足够了。
该修复程序目前发布了 alpha 版。您可以使用
implementation 'androidx.preference:preference:1.1.0-alpha01'
或您 build.gradle
中最新发布的一个如果使用 AndroidX,您可以 add/remove 额外填充,只需将以下属性添加到 XML 中的首选项和首选项类别:
<androidx.preference.PreferenceScreen
xmlns:app="http://schemas.android.com/apk/res-auto">
<Preference
...
app:iconSpaceReserved="true/false"
.../>
</androidx.preference.PreferenceScreen>
true
添加额外的填充,false
删除它。
此错误已在最新版本的 androidx 首选项中修复
尝试在你的项目中遵循依赖关系 Build.Gradle
implementation 'androidx.preference:preference:1.1.0'
我发现以编程方式更容易,而不是处理样式:
private fun Preference.removeIconSpace() {
setIconSpaceReserved(false)
if (this is PreferenceGroup) {
for (i in 0 until preferenceCount) {
getPreference(i).removeIconSpace()
}
}
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.settings, rootKey)
…
preferenceScreen.removeIconSpace()
}
如果您使用的是 AndroidX,只需添加以下属性即可 add/remove 额外填充。
<Preference
...
app:iconSpaceReserved="false/true"
.../>