【问题标题】:Customizable input fields in an android appAndroid 应用程序中的可自定义输入字段
【发布时间】:2012-11-21 14:42:51
【问题描述】:

我正在为我的大学开展一个关于在运行时自定义 Android 应用程序的项目。

是否可以包含实际上不在我的 android 项目的 \res\layout\ 文件夹中但在外部网络服务器上的布局 XML 文件? 这背后的想法是让我有机会在我的网络服务器上自定义 xml 文件,例如添加新字段,无需重新安装/更新应用程序。

我将尝试通过以下示例来解释我的想法:

假设我有一个应用程序来保存和显示地址。所有地址都存储在数据库中。我在我的数据库中获得了“姓名”和“姓氏”字段,并在保存或显示地址时显示在应用程序中。

现在我想添加第三个字段“电子邮件”,我可以在其中输入电子邮件地址。

我的想法是在我的数据库中创建此字段并将其添加到我的 web 服务器上的 layout-xml-file 中。所以我可以在应用程序中“链接”xml文件,刷新应用程序后会出现新字段。

希望你们能给我一些关于如何在运行时自定义输入表单的信息,我在互联网上的研究根本没有帮助我..

问候

【问题讨论】:

标签: android runtime customizing


【解决方案1】:

您不能使用外部 XML 文件来动态调整布局。

LayoutInflater#inflate(XmlPullParser, ViewGroup) 的文档解释了原因:

重要出于性能原因,视图膨胀在很大程度上依赖于在构建时完成的 XML 文件的预处理。因此,目前无法在运行时将 LayoutInflater 与 XmlPullParser 一起用于纯 XML 文件。

但是您可以在代码中动态创建布局,请参见例如Android Runtime Layout Tutorial

因此,您可以在服务器上放置一个包含布局信息的文件,在您的应用程序中获取它,解析它并动态创建布局。这将是很多工作,因为您基本上会复制 Android 的LayoutInflater。您显然可以将格式简化为您需要的基本内容,但恕我直言,这仍然是不需要的大量工作。

假设您的布局信息只是一个具有字段名称的纯文本文件

name
surname
email

然后,您可以逐行阅读并为每个内容创建一个简单的EditText,就像

private View getDynamicLayout(ArrayList<String> lines) {
    LinearLayout ll = new LinearLayout(this);
    for (String line : lines) {
        EditText et = new EditText(this);
        // fill it with some text
        et.setText(line);
        ll.addView(ll);
    }
    return ll;
}

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ArrayList<String> layoutConfig = readConfigFromFile();
    View layout = getDynamicLayout(layoutConfig);
    setContentView(layout);
}

但除非您真的需要,否则我建议您以常规方式更新应用程序。使用预处理的布局也比自己构建信息更快。

还要注意不要像上面的例子那样在 UI 线程中做大量的磁盘/任何网络访问(读取文件)。这应该在后台任务中完成。

【讨论】:

    【解决方案2】:

    非常感谢您的帮助。我会努力解决这个问题的。

    我不能只更新应用程序的原因是我所说的应用程序实际上是许多不同公司使用的 CRM 系统。他们都必须从 google play 商店下载相同的应用程序。

    我的工作目标是每个公司都可以自定义他们自己的输入表单,因此可以有许多不同的输入表单(每个公司都适用)但都使用相同的应用程序。

    我想到了一个服务器,它存储一个包含布局信息的文件,应用程序可以在运行时访问该文件。

    顺便说一句,由于我不是软件工程师,所以我不必编写任何代码,我只需抽象地描述一下这个概念.. :)

    【讨论】:

      猜你喜欢
      • 2017-06-17
      • 2011-03-26
      • 2016-02-19
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 2012-08-04
      相关资源
      最近更新 更多