如何在首选项标头中使用 PreferenceFragmentCompat

2024-04-30

我正在尝试学习在 Xamarin Android 应用程序中构建首选项页面的方法。 我发现了很多 PreferenceFragment 的例子,但它被标记为已弃用,我在现阶段很难重写它们。

我创建了代表标题的活动。我添加了 IntentFilter,这样我就可以从设置菜单中的应用程序列表访问此活动。它还具有内部类来将一些偏好组合在一起:

namespace droid.examples.Preferences
{
    [Activity(Label = "Settings activity", Theme = "@style/AppTheme", Name = "droid.examples.Preferences.SettingsActivity")]
    [IntentFilter(new string[] { "android.intent.action.APPLICATION_PREFERENCES" })]
    public class SettingsActivity : PreferenceActivity
    {
        public override void OnBuildHeaders(IList<Header> target)
        {
            base.OnBuildHeaders(target);
            LoadHeadersFromResource(Resource.Xml.preference_headers, target);
        }

        public class SettingsFragment : PreferenceFragmentCompat
        {
            public override void OnCreatePreferences(Bundle savedInstanceState, string rootKey)
            {
                // Load the Preferences from the XML file
                SetPreferencesFromResource(Resource.Xml.app_preferences, rootKey);
            }
        }
    }
}

我无法通过从preference_headers.xml中选择“Prefs 1”标头来打开我的app_preferences.xml:

<?xml version="1.0" encoding="utf-8" ?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
  <PreferenceCategory android:title="Category">
    <CheckBoxPreference
            android:key="checkbox_preference"
            android:title="Developer mode"
            android:summary="Allow user to see detailed messages" />
  </PreferenceCategory>
</PreferenceScreen>

我有preference_headers.xml。当我单击应用程序名称附近的齿轮时,它会打开。它看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
  <header android:fragment="droid.examples.Preferences.SettingsActivity.SettingsFragment"
          android:title="Prefs 1"
          android:summary="An example of some preferences." />
</preference-headers>

我的包名称:droid.examples

我认为有一个问题与 android:fragment 属性值有关。 建立该价值的规则是什么?

我想它必须从“包名称”开始。它应该在类名和包名之间包含命名空间吗?

属性值中的$是什么意思?是用来标记内部类的吗?我在几个地方看到了下一个代码:

android:fragment="com.example.android.apis.preference.PreferenceWithHeaders$Prefs1Fragment"

我希望你能帮我找出我犯了错误的地方。

源代码来自 GitHub https://github.com/Shumigaj/XamarinExamples/tree/59d6af15350a9354e59f716e648bd54d12a5f889


我花了很多时间来研究这个问题,我想做一个总结。

我们必须重写 SettingsActivity 中的 IsValidFragment 方法:

protected override bool IsValidFragment(string fragmentName)
{
    return fragmentName == "droid.examples.preferences.SettingsActivity.SettingsFragment";
}

我的 SettingsActivity 扩展了 PreferenceActivity。感谢 @Jeremy 关于 IOnPreferenceStartFragmentCallback 实现的建议,我发现基类已经扩展了它。

public abstract class PreferenceActivity ...
{
    ...
    public virtual bool OnPreferenceStartFragment(PreferenceFragment caller, Preference pref);
    ...
}

因此,我可能需要使用 PreferenceFragment 而不是 PreferenceFragmentCompat 来使代码一致:

public class SettingsFragment : PreferenceFragment
{
    public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        AddPreferencesFromResource(Resource.Xml.app_preferences_for_header);
    }
}

此外,我们还必须向片段添加 Register 属性:

[Register("droid.examples.preferences.SettingsActivity.SettingsFragment")]
public class SettingsFragment : PreferenceFragment
{
}

最后我更新了preference_headers.xml

<?xml version="1.0" encoding="utf-8" ?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
  <header android:fragment="droid.examples.preferences.SettingsActivity.SettingsFragment"
          android:title="Prefs 1"
          android:summary="An example of some preferences." />
</preference-headers>

android:fragment 属性值可以包含 '$' 但 '+' 不起作用,因为 Register 不支持它,我们会得到编译错误。

感谢所有试图帮助我的人

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在首选项标头中使用 PreferenceFragmentCompat 的相关文章

随机推荐

  • 在不同节点上运行 Jenkins stage

    我有以下多分支管道架构的 Jenkinsfile usr bin groovy pipeline agent node label ubuntu customWorkspace src BUILD NUMBER environment SR
  • VBA Excel:将条件格式应用于空白单元格

    我正在尝试编写一个子过程 它将一些条件格式应用于 Excel 中的一系列单元格 我有点卡住了 所以我使用了宏录制器 然而 我无法弄清楚为什么它应用下面的公式 并且当我手动运行代码时它失败了 我想要做的是将条件格式应用于范围内的空白单元格 我
  • 在 Golang Server 中接受持久的 tcp 连接

    我正在尝试使用 Go 并且想创建一个 TCP 服务器 我可以通过 telnet 访问该服务器 发送命令并接收响应 const CONN HOST localhost CONN PORT 3333 CONN TYPE tcp func mai
  • Linux 中 NDIS 过滤器的类似物是什么?

    我正在研究一个as close to real time我在linux中尽可能地使用系统 并且需要在收到特定数据包后立即发送大约600 800字节的TCP数据包 为了获得最佳的延迟 我希望这个数据包直接从内核发送 而不是将接收到的数据包一直
  • 在 LibGDX 中保存和检索图像文件

    如何在 LibGDX 中保存和检索图像文件 我想将图像文件保存在 AndroidApplication 类的本地存储中 并在我的 Core 项目中检索它 Libgdx 中的文件处理在libGDX 维基 https github com li
  • 如何获取字段类型的零值

    我有一个包含许多字段的结构 我已经弄清楚如何使用反射提取字段名称 值和标签信息 我还想做的是确定字段的值是否与字段的默认值不同 目前 我有这个 有效 但有点臭 qsMap make map string interface var defa
  • Android WebView无法正确显示网页

    我有这样的简单 WebView 代码 WebView wv WebView findViewById R id webview1 wv loadUrl http en wikipedia org wiki Book 但显示的页面显示维基百科
  • R 在警告后执行某些操作(例如 tryCatch 警告,然后编辑对象)

    我正在运行一堆 logit 模型 其中一些模型具有完美的分离 会返回 glm 警告 这是显示问题的数据集 DT lt iris str DT DT binary lt as numeric DT Petal Width gt 1 DT du
  • 删除不需要的空行 Eclipse 编辑器

    当我在 eclipse 中打开任何文件时 它在所有代码行和空白行之后显示替代空白行 我怎样才能删除它 In eclipse preference setting you can remove all the unwanted blank l
  • 多种语言如何在一个项目中交互?

    我听说有些人在一个项目中使用多种语言进行编程 我无法想象这些语言如何相互作用 我的意思是没有像这样的Java方法 myProgram callCfunction parameters 从来没有发生过还是我错了 在一个项目中使用多种语言实际上
  • 在具有多个 Web 服务器的现有 .NET / SQL Server 堆栈上实施 Lucene

    我想考虑使用 Lucene 为我当前管理的网站提供全文搜索解决方案 该网站完全基于 SQL Server 2008 C NET 4 技术构建 我要索引的数据实际上非常简单 每个记录只有几个字段 并且只有其中一个字段实际上是可搜索的 我不清楚
  • 将自定义信息添加到 CSPROJ 文件

    作为我们开发生命周期的一部分 我们在项目中针对 C 源代码运行了许多流程 这些进程由 GUI 驱动 该 GUI 当前读取 csproj 文件以查找项目中使用的源文件 这很好用 我们现在有一个新要求 即提供一些需要调用 Web 服务的验证过程
  • 在嵌套有序字典 python 中查找给定键的值

    我试图从嵌套的 OrderedDict 中查找给定键的值 关键点 我不知道这个字典会嵌套多深 我正在寻找的键的名称是不变的 它将位于字典中的某个位置 我想返回本例中名为 powerpoint color 的键的值 mydict Ordere
  • Powershell/PowerCLI 循环、超时和退出

    以下是场景 我通过 Powershell PowerCLI VMwares Powershell 模块 远程启动虚拟机 一旦虚拟机启动 我将针对虚拟机运行一系列 cmdlet 目前我有这段代码 Start VM my VM Name run
  • 继续在文件的同一行写入

    我已经使用以下命令打开了要写入的文件 data open input a 使用循环 我想在同一行中向文件写入一些单词 在每次循环迭代之后我想添加一个换行符 while loop for loop do something if some c
  • 如何创建自定义主题并在 Android 应用程序中使用它?

    如何创建自定义主题并在代码中使用它 菜单中如何实现主题选项并申请活动 有一个不错的风格和主题指南 http developer android com guide topics ui themes html在 Android 开发者网站上
  • Nuget:packages.config 中的 属性的用途是什么?

    我将我的 C 项目 已经有一些 nuget 包 从 4 0 升级到 4 5 2 我看到有些
  • 覆盖主干“设置”方法

    我想重写骨干集方法 以便每当我为骨干模型设置一个值时 都会调用在该属性上注册的回调 而无需检查该属性的相同先前值 var model Backbone Model extend defaults prop1 true var view Ba
  • 使用反射检查java中的字段是否为final

    我正在编写一个类 它在某些时候必须拥有它的所有内容Fields 从该类的另一个项目分配 我通过反思做到了 for Field f pg getClass getDeclaredFields f set this f get pg 问题是 这
  • 如何在首选项标头中使用 PreferenceFragmentCompat

    我正在尝试学习在 Xamarin Android 应用程序中构建首选项页面的方法 我发现了很多 PreferenceFragment 的例子 但它被标记为已弃用 我在现阶段很难重写它们 我创建了代表标题的活动 我添加了 IntentFilt