1

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

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

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

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

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

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

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

格雷茨

4

2 回答 2

1

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

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

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

但是您可以在代码中动态创建布局,请参阅例如Android 运行时布局教程

因此,您可以在服务器上放置一个包含布局信息的文件,在您的应用程序中获取它,解析它并动态创建布局。这将是很多工作,因为您基本上会复制 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 线程中进行大量磁盘/任何网络访问(读取文件)。这应该在后台任务中完成。

于 2012-11-21T15:11:14.417 回答
0

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

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

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

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

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

于 2012-11-22T09:54:03.277 回答