preferenceactivity 相关问题

Android中的PreferenceActivity是活动的基类,用于向用户显示首选项层次结构

动态更改android首选项的widgetlayout资源

我在首选项屏幕内创建了一个首选项条目,如下所示: 我在首选项屏幕内创建了一个首选项条目,如下所示: <PreferenceScreen> <Preference android:title="title" android:key="key" android:widgetLayout="@layout/someview"/> </PreferenceScreen> 这里我设置了一个 widgetlayout 资源,它应该显示在首选项的右侧(就像复选框首选项的复选框)。我还可以在我的 PreferenceActivity.onCreate() 代码中设置此资源,如下所示: Preference myPreference = findPreference("key"); myPreference.setWidgetLayoutResource(R.layout.someview); 两种方法都可以正常工作,因此我可以在首选项右侧看到我的资源。 但是,我无法访问此资源(someview)以在运行时更改其属性。 手动设置资源 ID、从资源中夸大它或findViewById似乎都不起作用 - 我有无效的资源/资源 ID 未找到异常。似乎偏好活动稍后会导致资源膨胀。 有人遇到同样的问题吗?关于如何在运行时更改 widgetlayout 资源属性有什么想法吗? 这里有一个类似的问题,但没有回答 [android-开发者] 在首选项 widgetLayout 中访问小部件时出现问题 我似乎也有同样的问题,我尝试了这样的方法: 1) 创建自定义 Preference 并覆盖 onBindView(): public class ProgressBarPreference extends Preference { private ProgressBar mProgressBar; // constructors @Override protected void onBindView(View view) { super.onBindView(view); mProgressBar = (ProgressBar) view.findViewById(R.id.progressBar); } public ProgressBar getProgressBar() { return mProgressBar; } } 2) 将此首选项添加到屏幕 xml: <package.ProgressBarPreference android:key="key" android:summary="summary" android:title="title" android:widgetLayout="@layout/preference_widget_progressbar" /> preference_widget_progressbar.xml <?xml version="1.0" encoding="utf-8"?> <ProgressBar xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/progressBar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> 或致电setWidgetLayoutResource()。 3) 当onPreferenceTreeClick():时获取ProgressBar if (preference instanceof ProgressBarPreference) { ProgressBar progressBar = ((ProgressBarPreference) preference).getProgressBar(); // TODO something } 然而,已经一年多了! 我对 joinAero 的情况有部分解决方法。如果目标只是在小部件中显示或隐藏不确定的进度条,则技巧是在代码中设置和清除小部件布局资源。 1) 定义包含 ProgressBar 的小部件布局。无需分配 ID。首选项_widget_progressbar.xml: <?xml version="1.0" encoding="utf-8"?> <ProgressBar xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> 2)不要在settings.xml中指定小部件 <package.ProgressBarPreference android:key="key" android:summary="summary" android:title="title" /> 3)当你想显示进度条时,将widget资源设置为preference_widget_progressbar。要清除它,请将其设置为 0。需要调用 notifyChanged() 来更新屏幕。 public void showProgressBar(boolean isVisible) { // Show or hide the entire widget (which contains only a ProgressBar) setWidgetLayoutResource(isVisible ? R.layout.preference_widget_progressbar: 0); notifyChanged(); // Update screen } 获取指向实际 ProgressBar 的指针非常困难,特别是当首选项位于库项目中时。我按照这篇文章使用getIdentifier()取得了一些成功,但这种方法实际上隐藏了整个小部件,而在进度条上设置可见性则留下了一个空白的小部件可见。 这里有一个解决方法: 创建小部件布局并设置 onClick 属性, <?xml version="1.0" encoding="utf-8"?> <ImageView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/icon" android:layout_width="48dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:background="?android:attr/selectableItemBackground" *android:onClick="onMyKeyClicked"* android:scaleType="centerInside" android:src="@drawable/ic_action_info" /> 然后在您的首选项中设置小部件布局, <ListPreference android:defaultValue="1" android:entries="@array/my_entries" android:entryValues="@array/my_values" android:key="my_key" android:title="@string/pref_my_key_title" android:widgetLayout="@layout/pref_layout_my_key" /> 然后在你的活动中有一个类似的方法, public void onMyKeyClicked(View v) { Toast.makeText(this, "My key widget clicked", Toast.LENGTH_SHORT).show(); } 因此,对于带有小部件的每个首选项,您都会有一个将 onClick 属性设置为活动中唯一方法的布局。你觉得怎么样? 我找到了解决此问题的方法,而无需创建自定义首选项。 此解决方案的一个好处是,您可以将相同的小部件资源与不同的侦听器实现(即“setOnClickListener”)一起使用。 下面的示例创建了两个 EditTextPreferecnes,每个都指向相同的小部件布局。然后使用 addOnChildAttachStateChangeListener 根据需要设置小部件。需要侦听器是因为首选项 Recycler 视图中首选项的视图绑定是最后发生的事情之一或 onResume() 之后发生的事情之一。 此外,请确保使用非零 ID。 琴弦: <resources> <!-- Preference Titles --> <string name="prefs_header">Prefs With Widgets</string> <!-- Preferences --> <string name="pref_key_a">pref_key_a</string> <string name="pref_key_b">pref_key_b</string> </resources> 小部件布局: <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageButton android:id="@+id/imageButton" style="@android:style/Widget.Holo.ImageButton" android:layout_width="32dp" android:layout_height="32dp" android:contentDescription="@string/messages_header" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@android:drawable/stat_sys_download" /> </androidx.constraintlayout.widget.ConstraintLayout> 首选布局: <PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"> <PreferenceCategory app:iconSpaceReserved="false" app:title="Prefs With Widgets"> <EditTextPreference app:iconSpaceReserved="false" app:key="@string/pref_key_a" app:title="Test Button A" app:useSimpleSummaryProvider="true" app:widgetLayout="@layout/my_widget" /> <EditTextPreference app:iconSpaceReserved="false" app:key="@string/pref_key_b" app:title="Test Button B" app:useSimpleSummaryProvider="true" app:widgetLayout="@layout/my_widget" /> </PreferenceCategory> </PreferenceScreen> 科特林: class SettingsFragment : PreferenceFragmentCompat() { private lateinit var _onChildAttachListener : RecyclerView.OnChildAttachStateChangeListener private lateinit var _editTextA : EditTextPreference private lateinit var _editTextB : EditTextPreference override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.root_preferences, rootKey) _editTextA = preferenceScreen.findPreference(getString(R.string.pref_key_a))!! _editTextB = preferenceScreen.findPreference(getString(R.string.pref_key_b))!! _editTextA.setViewId(PREF_A_ID) _editTextB.setViewId(PREF_B_ID) _onChildAttachListener = object : RecyclerView.OnChildAttachStateChangeListener { override fun onChildViewAttachedToWindow(view: View) { if(PREF_A_ID == view.id){ view.findViewById<ImageButton>(R.id.imageButton).setOnClickListener { Toast.makeText(context, "Button A", Toast.LENGTH_SHORT).show() } } if(PREF_B_ID == view.id){ view.findViewById<ImageButton>(R.id.imageButton).setOnClickListener { Toast.makeText(context, "Button B", Toast.LENGTH_SHORT).show() } } } override fun onChildViewDetachedFromWindow(view: View) { // Do nothing.. } } } override fun onResume() { listView.addOnChildAttachStateChangeListener(_onChildAttachListener) super.onResume() } override fun onDestroy() { listView.removeOnChildAttachStateChangeListener(_onChildAttachListener) super.onDestroy() } companion object { // Note: Set ID's to anything but 0 const val PREF_A_ID = 1 const val PREF_B_ID = 2 } }

回答 4 投票 0

androidx 中的自定义 SwitchPreferenceCompat

我正在尝试将首选项屏幕中的默认开关拇指更改为我的自定义。我尝试了这里找到的不同解决方案,但没有一个有效。我的最后一次尝试是创建自定义布局,但是...

回答 2 投票 0

为什么Android会忽略返回true的OnPreferenceClickListener()?

我在 xml 文件中定义了我的首选项,如下所示: 我在 xml 文件中定义了我的首选项,如下所示: <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceScreen android:title="@string/pref_screen" android:key="pref_screen_key"> <CheckBoxPreference android:defaultValue="true" android:key="prefs1_key" android:title="@string/prefs1_str" android:summary="@string/prefs1_summary" /> .... 在 PreferenceActivity 内部,我重写了“pref_screen_key”的 onPreferenceClick(): ... findPreference("pref_screen_key").setOnPreferenceClickListener( new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { if (flag) { // do some stuff return true; // According to Android doc it means, that click was handled } else return false; } 因此,如果我的标志为 true,我希望 Android 不会使用 CheckBoxPreference 打开视图,而只是执行我的内容(我在 onPreferenceClick() 内返回 true 来指示单击已处理,并且不需要执行默认的 onPreferenceClick()行为)。 不幸的是,Android 总是以默认行为处理 onPreferenceClick() 并同时制作我的东西。 这是 Android 中的一个错误吗? 有没有办法阻止 Android 在用户点击 PreferenceScreen 后显示 CheckBoxPreference? 您可能会遇到问题,因为必须将 flag 声明为最终才能在 OnPreferenceClickListener 内访问。尝试将其封装在一个类中并将该类声明为final。 为了更直接地回答您的问题,请记住,当您从 onPreferenceClick() 返回 true 时,您是在告诉系统“别担心,我已经处理好了。”因此,当您只是返回 true 而没有实际执行任何操作时,系统本身并没有忽略您,您只是告诉它在单击 Preference 时不执行任何操作。 您的代码看起来与此示例的第 108-115 行类似。仔细看看它可能会有所帮助。 该错误位于 https://github.com/android/platform_frameworks_base/blob/android-5.1.1_r13/core/java/android/preference/Preference.java#L985 在 Preference.performClick 中,它检查 isEnabled() 是否为 true,调用 onClick(),然后调用您的侦听器,如果返回 false,则返回 - 如果不是,则继续处理,并将点击传播到右侧树/屏幕/启动活动指定。 错误在于它在 onPreferenceClick 之前调用 onClick,因此无论 onPreferenceClick 返回什么,例如复选框总是处于切换状态。 解决方法:不幸的是,您需要对所有首选项进行子类化并进行自己的侦听器调度,并且仅在允许的情况下调用 super.onClick()。 我相信您想使用 setOnPreferenceChangeListener 而不是 setOnPreferenceClickListener。根据 android 文档: 这是在 Preference 的状态即将更新之前以及状态被持久化之前调用的。 返回: 如果为 True,则使用新值更新首选项的状态。 示例: Preference pref = findPreference("pref_key"); pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (flag) { // do some stuff return false; // Pref change will be not be persisted. } else { return true; } } }); 我用 getActivity().recreate() 来打断 onClick()。 ... findPreference("pref_screen_key").setOnPreferenceClickListener( new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { if (flag) { // do some stuff getActivity().recreate() return true; // According to Android doc it means, that click was handled } else return false; } 或者根据具体情况也可能是getActivity().onBackPressed()。

回答 4 投票 0

Android如何添加动画来闪烁设置首选项,以便引起用户的注意

我有一个设置首选项屏幕,我从另一个屏幕打开该屏幕并自动滚动到特定的设置首选项,但我想向滚动的首选项添加闪烁/闪烁动画...

回答 1 投票 0

如何获取Android中PreferenceActivity中使用的paddingmargin资源?

我有一个扩展了PreferenceActivity的设置活动。然而,我也有一个自定义的偏好,我使用我自己的布局添加。问题是,我如何使用相同的资源(paddingmargin)...。

回答 1 投票 0

在PreferenceActivity中使用非默认首选项

使用PreferenceActivity,Android会自动保存简单的首选项,例如选中复选框等。我有两个问题:1-这些首选项保存在哪里?是否相同...

回答 1 投票 12

建筑轮廓首选项类别

我想创建具有我可以更改用户个人资料的首选项的设置,包括姓名和个人资料照片。最接近的示例是WhatsApp如何更改配置文件(请参见下面的链接)。我...

回答 1 投票 0

根据职位设置偏好背景

我正在开发一个使用首选项(androidx.preference.Preference)的应用。我正在使用PreferenceCategory并在运行时向其添加Preerence。我的要求是首先,中间和...

回答 1 投票 0

Android偏好设置:根据位置设置偏好背景

我正在开发一个使用首选项(androidx.preference.Preference)的应用。我正在使用PreferenceCategory并在运行时向其添加Preerence。我的要求是首先,中间和...

回答 1 投票 0

首选项点击监听器上的首选项活动

我正在建立一个首选项活动,其中列表中的大多数首选项将执行代码,而不是直接修改SharedPreference。我的preferences.xml文件如下所示。

回答 7 投票 16

模仿偏好屏幕并显示键值属性

我如何在不做太多工作的情况下模仿android的首选项屏幕或“编辑联系人”屏幕的设计?我必须显示一个对象的〜12个属性,并且无法理解...

回答 1 投票 0

如何设置对editText首选项的关注并自动显示键盘?

我正在学习首选项,并且已经创建了它。单击EditText后,我得到了我想要做的是这个。仅当我单击它时,才会显示键盘和对edittext的关注。我...

回答 2 投票 0

在EditTextPreference上检测否定按钮按下

我具有一个带有EditTextPreference的PreferenceActivity。我可以使用OnPreferenceChangedListener轻松检测到肯定的按钮按下。但是,当用户按下...

回答 1 投票 0

如何使用DropDownPreference更改主题

我想在我的设置页面上使用DropDownPreference,但是尽管在Internet上四处浏览,但似乎没有关于此操作的任何不错的教程。有谁知道应该在...] >>>

回答 1 投票 0

安卓:创建自定义的偏好

是否有可能建立在PreferenceScreen个人爱好?我想编写这样的颜色设置:我知道,选择的颜色是很容易实现的与ListPreference,...

回答 5 投票 44

亚马逊Kindle Fire HD的首选屏幕图标大小?

我已经在亚马逊Kindle Fire HD 8.9上运行Android应用程序。它有一个带有旋转木马主屏幕的全高清显示屏,图标大小为675x675像素。我遇到的第一个问题是使用标准小...

回答 1 投票 1

PreferenceFragment具有透明背景?

我创建了一个具有两个类别和一个复选框的PreferenceFragment,但是,当我在应用程序中显示它时,背景看起来是透明的。我可以看到主要活动,字段和...

回答 6 投票 7

如何在Android上的首选项中处理长文本?

背景我正在创建一个具有一些设置的应用程序,我想使用内置的PreferenceActivity或PreferenceFragment来完成工作问题一些首选项有一个很长的标题,...

回答 3 投票 11

Android设置首选项类别的背景颜色

我尝试自定义首选项类别的背景颜色。我已经改变了首选项本身的背景颜色,但我找不到如何更改类别背景的方法......

回答 1 投票 4

PreferenceActivity:将值保存为整数

在我的首选项活动中使用简单的EditTextPreference:

回答 5 投票 49

© www.soinside.com 2019 - 2024. All rights reserved.