Android应用中可自定义的输入字段

时间:2012-11-21 14:42:51

标签: android runtime customizing

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

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

我将尝试用以下示例解释我的想法:

假设我有一个保存和显示地址的应用程序。所有地址都存储在数据库中。我在数据库中输入了字段'name'和'surname',并在保存或显示地址时显示在应用程序中。

现在我想添加第三个字段'email',我可以输入电子邮件地址。

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

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

格尔茨

2 个答案:

答案 0 :(得分:1)

您无法使用外部XML文件动态调整布局。

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

  

重要出于性能原因,查看通胀严重依赖于在构建时完成的XML文件的预处理。因此,目前无法在运行时对普通XML文件使用带有XmlPullParser的LayoutInflater。

但您可以在代码中动态创建布局,例如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线程中执行重磁盘/任何网络访问,如上例所示(读取文件)。这应该在后台任务中完成。

答案 1 :(得分:0)

非常感谢你的帮助。我会试着通过这个。

我无法更新应用程序的原因是我所说的应用程序实际上是许多不同公司使用的CRM系统。他们都必须从谷歌游戏商店下载相同的应用程序。

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

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

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