【问题标题】:Programmatically creating UI and Frame in Android like in Swift / iOS像在 Swift / iOS 中一样以编程方式在 Android 中创建 UI 和 Frame
【发布时间】:2019-06-18 14:01:40
【问题描述】:

我是一名 iOS Swift 开发人员,正在学习制作 Android 应用程序。我想知道是否有一种等效的方法可以在 Android 中动态/以编程方式创建 UI 对象。在 iOS 中我可以简单地

let btn = UIButton() // Create a UI object
btn.frame = CGRect(x: 0, y: 0, width: 100, height: 100) // Set the frame of the object
btn.backgroundColor = UIColor.blue // Mess with the properties of the object
self.view.addSubview(btn) // Add it to a UIView

在 Android 中,我似乎总是需要对象的 XML 版本。另外我似乎无法轻松设置对象的框架?我真的很喜欢以编程方式执行此操作,因为我的 UI 非常复杂,而且我喜欢使用基于像素的精确计算进行定位。 Java中没有与此等效的东西吗?

【问题讨论】:

  • 以编程方式执行 UI 并不是最好的想法,因为它显着增加了代码量,但可以做到,这里有一个简单的例子 stackoverflow.com/questions/3204852/…
  • 有什么理由不想只使用 xml 布局?
  • 我不同意这里。我认为在您的应用程序中以编程方式创建 UI 而不是使用 XML 有很多好处。一方面,不在不同布局中扩展 XML 会显着降低绘图/渲染性能。其次,在您的项目中没有 XML 可以大大减少您的 APK 或 App Bundle 大小。最后,能够封装可以操作这些程序化 UI 的逻辑使您的代码更加简洁和灵活。

标签: java android ios swift user-interface


【解决方案1】:

您可以从代码中创建对象,但这不是非常可取的。如果在 xml 文件中表示最终代码,则它会更加清晰和可解释。如果你想从代码中插入一个按钮:

Button actionBtn = new Button(this); // Create a UI object
actionBtn.setLayoutParams(new ViewGroup.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT)); // Set the frame of the object

actionBtn.setBackgroundColor(getResources().getColor(R.color.blue)); // Mess with the properties of the object
setContentView(actionBtn); // Add it to a UIView

【讨论】:

  • 嗨,我真的不能使用像素设置框架吗?就像我在(0,0,100,100)的例子一样。所以我必须使用布局来定位东西?
  • 在 Android 中,您应该为许多不同的设备进行设计,因此使用硬编码的像素值不是一个好主意。但是,您可以尝试类似 actionBtn .getLayoutParams().height=180;
【解决方案2】:

您可以动态创建 ui 对象。喜欢:

Button btn = new Button(context);
btn.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

并将其添加到布局中,例如:

layout.add(btn);

请记住,如果没有上下文,则无法创建 ui 对象。

如果您知道如何将您的 ui 对象放入 xml 中,您将很快了解动态创建中的其他内容)

【讨论】:

  • 谢谢,我怎样才能像CGRect 是 Swift 那样动态更改框架
  • 这取决于您使用的布局类型。在 android 中,您可以添加边距以将视图定位在其父级中。
【解决方案3】:

是的!你绝对可以!事实上,以编程方式创建视图和 UI 在 Android 中有很多好处:

  1. 由于您没有膨胀和使用 XML 文件,因此渲染性能变得更快、更高效,尤其是对于更复杂的 UI。
  2. 您的视图和 UI 现在可以更加灵活和可重用,尤其是当您需要在运行时动态更改 UI 时。
  3. 您可以将大量绑定和操作逻辑直接存储到自定义视图类中,因此您可以执行myCustomView.updateLabel("new label") 之类的操作,而无需执行findViewById(...) 之类的操作
  4. 您可以将编程 UI 封装到可重用的类中,如下所示:
class MyCustomView : FrameLayout {

    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(
        context, attrs, defStyleAttr
    )

    init {
        val button = Button(context)
        val buttonParams = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)
        buttonParams.gravity = Gravity.CENTER
        button.text = "Click Me!"
        button.layoutParams = buttonParams
        this.addView(button)
    }
}

这个类创建一个 FrameLayout,它有一个带有一些文本的按钮,在 FrameLayout 中垂直和水平居中。

尽管程序化 UI 令人难以置信,但您应该真正使用最适合您的用例的工具。如果您正在创建将在应用程序的许多地方使用的 UI,请考虑通过自定义 View 类以编程方式执行此操作,如上所示。如果您只是制作一个相对简单且没有大量嵌套布局的一次性 UI,那么 XML 会更快更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多