首页 > 解决方案 > 创建自定义首选项

问题描述

我想创建一个SeekBarPreference类似的偏好。我需要范围Seekbar。然后我找到了这个库:https ://github.com/syedowaisali/crystal-range-seekbar 。我想创建一个首选项,使用CrystalRangeSeekbar它与其他首选项具有相同的外观。

我使用 compileSdkVersion = 29,minSdkVersion = 23,targetSdkVersion = 29。

这在Android上甚至可能吗?我花了几个小时尝试编写一些代码,但我从未设法获得相同的外观。我需要所有填充、边距、标题和摘要位置等与内置首选项相同。

是否有任何官方手册可以制作与内置首选项外观相同的自定义首选项?

标签: androidandroid-layoutandroid-preferences

解决方案


我认为没有关于如何执行此操作的手册,但我遇到了一个问题,我需要 minSdkVersion=22 的远程搜索栏首选项,而当时可用的内容直到更高版本的 SDK 才允许远程搜索。

所以我自己做了,不确定与内置偏好相比它看起来如何

使用的 xml 布局片段是

<GridLayout
            android:id="@+id/GridLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:columnCount="2"
            android:orientation="horizontal">

<SeekBar
                android:id="@+id/fontSeek"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_column="0"
                android:layout_columnWeight="15"
                android:layout_gravity="fill"
                android:max="40"
                android:padding="6dp"/>


            <TextView
                android:id="@+id/fontText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_column="1"
                android:layout_gravity="center"
                android:textStyle="bold"
                android:textColor="@color/colorText"
                android:typeface="monospace"
                android:minEms="2"
                android:padding="6dp"/>

</GridLayout>

然后在代码中,我调整了 textview 值以显示调整后的范围,而不是通过将 20 添加到值来显示调整后的范围而不是 0 到 40。

提取的与 xml 关联的 Java 代码

int fontSize;

int fontSizeOffset = 20;

fontSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                // Work out the correct values
                fontSizeAdjusted = progress;
                fontSize = fontSizeAdjusted + fontSizeOffset;
                // Update the Textview
                fontTextView.setText(String.valueOf(fontSize));
                // store pref
                SharedPreferences.Editor editor = sharedPref.edit();
                editor.putInt("fontSize", fontSize);
                editor.apply();
            }

            public void onStartTrackingTouch(SeekBar seekBar) {
                // Do Nothing
            }

            public void onStopTrackingTouch(SeekBar seekBar) {
                // Do Nothing
            }
        });

您现在可能可以使用 Androidx https://developer.android.com/reference/androidx/preference/SeekBarPreference做得更好,但在我开发此代码时不可用。

您应该能够调整样式以完全匹配标准偏好,因为文档说它只是一个带有可选 texview 的搜索栏。

您可以随时查看 Androidx 的源代码,了解他们是如何做到的,例如https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-master-dev/preference/preference/src/主/java/androidx/preference/SeekBarPreference.java

https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-master-dev/preference/preference/res/layout/preference_widget_seekbar.xml


推荐阅读