为啥使用 XML 创建 GUI 是 Android 中的一个好习惯

Posted

技术标签:

【中文标题】为啥使用 XML 创建 GUI 是 Android 中的一个好习惯【英文标题】:Why using XML to create GUI is a good practice in Android为什么使用 XML 创建 GUI 是 Android 中的一个好习惯 【发布时间】:2011-07-02 12:55:11 【问题描述】:

我来自 Java Swing 背景。我可以知道为什么在 android 中使用 XML 创建 GUI 是一种很好的做法吗?例如,而不是编写代码(这让我在使用 Swing 桌面应用程序时感觉更舒服)

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloAndroid extends Activity 
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) 
       super.onCreate(savedInstanceState);
       TextView tv = new TextView(this);
       tv.setText("Hello, Android");
       setContentView(tv);
   

我们以 XML 方式编写代码。

import android.app.Activity;
import android.os.Bundle;

public class HelloAndroid extends Activity 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    

在教程中,它指出,

这种结构很容易 快速构建 UI,使用更多 结构和语法比你简单 将在程序化布局中使用。

不过,我并不认同这个想法,因为我觉得创建一个单独的 XML 文件比较麻烦。

谁能给出一个真实世界的例子(在 Android 的意义上),为什么使用 XML 构建 GUI 比纯 Java 代码更优越?

如果通过 XML 进行 GUI 编程真的是个好东西,为什么它还没有成为 GUI 桌面应用程序开发人员的普遍做法?

【问题讨论】:

【参考方案1】:

与 Java 代码相比,使用 XML 布局有很多优势。您可以轻松引用字符串、可绘制对象、尺寸、主题等。但最大的优势是自动支持多种配置。在不更改代码的情况下,只需在 layout-land/ 和 layout-port/ 中使用 XML 布局,您就可以拥有不同的横向和纵向布局。您也可以这样做以使布局适应不同的分辨率、语言等。

【讨论】:

如果XML布局有这么多优点,那么为什么通过XML进行GUI编程在GUI桌面应用程序开发中仍然很少见? 这些优势是 Android 特有的,而不是其他工具包。 嗨罗曼!当xml中有很多文件时,您如何处理项目?因为对这些文件的任何更改,在 Eclipse 中需要很长时间才能对 java 文件生效:( 我一直觉得支持横屏模式其实是个噱头。充其量,好吧,UI 在横向模式下工作,现在呢?付出了巨大的努力几乎没有收获,而与此同时,开发人员现在不得不担心旋转设备会导致 Activity 重新创建自身,从而导致正在进行的网络请求问题(在上传图像/视频的过程中?再见! )【参考方案2】:

如果通过 XML 进行 GUI 编程真的是个好东西,为什么它还没有成为 GUI 桌面应用程序开发人员的普遍做法?

.NET 开发使用 XAML,即 XML Flex 开发,通过 AIR,即 XML,用于 Web 和桌面 XUL 开发是 XML 有~20 XML bindings for Swing and SWT

考虑到单独的 .NET 开发可能超过所有其他桌面 GUI 开发的总和,我认为它已经“成为 GUI 桌面应用程序开发人员的一种常见做法”。

此外,将 XML 用于 GUI 是更大的“声明式 UI”趋势的一个方面,该趋势具有许多非 XML 形式,例如用于 Qt 的 JSON-ish QML。 AFAICT,所有主要的 GUI 开发都在以一种形式或方式合并此类声明性标记。

【讨论】:

我知道有很多用于 GUI 项目的 XML 绑定。但是,它们是否被广泛采用?你能举一个使用 XML GUI 绑定的著名 Java GUI 应用程序的例子吗? @CheokYanCheng JavaFX【参考方案3】:

考虑使用 html/CSS 创建 UI。与 Swing 相比,我总是觉得这很方便。而且我相信,不仅仅是我,其他人也有同样的想法,即Jelly Swing。

【讨论】:

我猜你只是通过谷歌搜索获得了“Jelly Swing”?因为它似乎是一个死项目。查看它的网页。 (最后发布:2006 年 4 月 5 日) @Yan Cheng:我从 2008 年就知道这个项目,是的,也很晚。但我没有推荐它。我只是说它不是一个非常陌生的想法,使用 CSS 做 RCP 有点像,而且这实际上有一些实现,不管是否陈旧。【参考方案4】:

我认为您来自 Java Swing 背景,因此您可能会考虑以编程方式创建布局的简单任务。但是有很多理由可以让你想到 XML 策略:

1) XML 布局设计易于理解,并保持应用程序用户界面与应用程序代码分离。

2) 市场上有许多设备具有不同的显示尺寸,Android 提供了一个更简单的任务来为所有使用 XML 的人创建 UI 并保持它们分开。

3) 此外,如果您想开发多语言应用程序,那么 XML 是最好的。

底线:

仅在您确实需要时才使用 Java 代码进行布局,否则您仍然可以选择 XML。

【讨论】:

【参考方案5】:

嗯,一方面,它允许您使用 GUI 构建器(例如 Google 提供的 eclipse 驱动的构建器)。

它还可以帮助您将业务逻辑与显示逻辑分开。

不过,您可能只是非常擅长 Swing 代码,而您已经忘记了培养这些技能需要多长时间。 :)

【讨论】:

我并没有真正感受到使用 Java Swing 代码生成 GUI 的痛苦,因为我最喜欢的 NetBeans 有助于生成所有健壮的代码。我只是想知道,为什么 Eclipse 不帮助我们生成所有的 Java 代码,而不是生成 XML 格式的代码。 @Yan:除了作为 Netbeans 的粉丝和用户之外,我想说,“Eclipse 有几个插件可以做到这一点”。但这些可能不如 Netbeans 好。另外,Netbeans 平台确实很棒。 没有什么能阻止开发人员创建一个扩展 RelativeLayout 的自包含自定义视图类,在单独的文件中,在 Activity 中创建此自定义视图的一个实例并将自定义视图设置为内容视图。他/她不必将 UI 设置代码推入 Activity【参考方案6】:

我不得不说,如果开发人员技术娴熟,任何一种方式都可以很好地工作。 但是,我认为我们必须考虑这在团队中是如何工作的。我同意切线风暴。通过这种方式,我们可以轻松地将 UI 开发人员和应用程序开发人员解耦。在一个团队中,人们只能专注于他们正在做的事情。

【讨论】:

UI 开发者?你是说平面设计师?如果是这样,我在与图形设计师和程序员在团队环境中工作之前和从前听到这个论点,你真的希望图形设计师能够安装开发工具,设置他们所有的 IDE 配置,从包管理器下载所有依赖项,知道如何使用 IDE,然后最后,挖掘所有正确的菜单以找到该属性 textCursorDrawable 例如?那就是期望图形设计师成为程序员只是为了进行编辑。期望他将更改提交给 git 怎么样? 晕倒【参考方案7】:

以下是我的想法:

照顾我的 GUI 管道的好方法。 每当我需要试验 GUI 维度值时,代码都不需要重新编译 XML 布局通常很容易理解 - 初始 GUI 开发变得简单

【讨论】:

【参考方案8】:

您应该考虑的一件事是,在您的代码中动态创建 UI 的性能在 android 中具有更好的性能Telegram 具有如此出色的性能还使用动态 UI。 此外,您可以检查article 关于动态和 XML 在 android 中的性能,动态总是具有更好的性能。 但很明显,动态 UIXML 难多了。

【讨论】:

以上是关于为啥使用 XML 创建 GUI 是 Android 中的一个好习惯的主要内容,如果未能解决你的问题,请参考以下文章

为啥在eclipes为创建一个android布局文件在R中没有自动生成

android: 一个新的 GUI 问题 - 如何声明 viewGroup,没有布局 XML 文件?

为啥c#可以在android和iOS上制作带有GUI的程序而c++不能? [关闭]

自动从 XML 模式创建 GUI

为啥我的Android Studio里新建的drawable的XML文件里没找不到shape这个选项.

Android:在创建时设置随机颜色背景