java - 实现复杂首选项屏幕的最佳方式?

标签 java android user-interface mobile

对于我的应用程序,我有一组相当复杂的配置选项供用户选择。我目前正在使用 PreferenceActivity 作为这些选项的用户界面,并且这些选项是使用共享首选项存储的。作为我必须适应的一些设置的示例:

  • 成对列表:要选择背景图案,用户可以选择使用 1 到 5 种不同的形状(其中每个形状都是一个 .png 文件)并为每个形状分配一个 int 颜色。例如,用户可以选择橙色正方形、绿色三角形和红色矩形。

  • 分层数据:我的应用程序的一部分可以配置为使用五种模式之一。每种模式都有一些相关联的独特设置,例如一种模式需要选择两个整数,另一种模式可能需要选择一个 boolean 值。

但是,我的感觉是 PreferenceActivity 不适用于上述设置,因为:

  • 共享首选项不能存储列表。
  • 共享首选项不能存储分层数据。
  • 将我的偏好界面简化为例如用于配置每种颜色的单独首选项按钮以及使用相关首选项来禁用不适用于当前模式的首选项将导致界面困惑且难以使用。

我可以编写自己的 Preference 类来配置列表,但我发现与实现典型的 View 相比,这些实现起来真的很费力,而且我仍然必须处理存储问题。

我的计划是:

  • 只需使用自定义 GUI 实现自定义 Activity 。这让我有更多的自由来为配置列表创建一个漂亮的界面,并且我可以智能地隐藏不适用于当前模式的选项。
  • 将我的所有设置存储在一个 XML 文件中或通过序列化一个 Java 对象。这意味着我可以轻松支持分层数据和可变长度列表,从而为进一步扩展留出了空间。

这个计划看起来合理吗?我担心我没有按照 Android 的方式做事,但在我看来,共享首选项和 PreferenceActivity 不适合我的需求。

最佳答案

自从我开始使用 Android 以来,我一直在创建自己的偏好 Activity 。这看起来真的很难,因为互联网上没有太多关于如何做的文档,但事实上,它真的很简单。正如您所说,它使您可以更自由地决定 UI 的外观和行为。以防万一您想知道如何自己进行偏好设置,这里有一个简单的 fragment :

public class myprefs extends Activity{
private static final String PREFS_XML = "prefs_xml";
private static final String PREF_1 = "pref_1";

String preference;

private SharedPreferences preferences = null;
public void loadPrefs(){
    preferences = this.getSharedPreferences(PREFS_XML, Activity.MODE_PRIVATE);
    preference = preferences.getString(PREF_1, "default value");
}
}

这就是获取您自己的偏好的简单方法。要设置它们,您可以使用

preferences.edit().putString(PREF_1, "hello!").commit();

可以将其放入 onClick、onItemSelected 或您想要放入的任何其他“事件”中。我将“首选项”设为类范围的实例,这样我就可以在类中的任何地方访问它,而不必重新实例化它。我希望这对你有所帮助。作为对您具体问题的具体回答,我认为您的计划是完全合理的。

关于java - 实现复杂首选项屏幕的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4891105/

相关文章:

android - 动态添加 View 到 Activity 布局

java - Spring data JPA @Query 与命名列的映射

java - Android 改造预计为 BEGIN_ARRAY

android - 上方布局 - 居中其他布局

android - FusedLocation API - 未调用 onLocationChanged

python - 如何将滚动条应用到 Canvas 中的框架

java - 服务器端 css 选择器

java - 我怎样才能让这个开关只选择 3 个选项之一?

java - 从spring-data-jdbc的 "Entities"生成脚本sql

python - Python 是否有使用 native 小部件的跨平台 GUI 工具包?