Android开发系列8——纯代码+XML混编UI界面

本文深入解析Android UI开发的三种方式:纯代码、XML布局及混合使用。重点介绍View和ViewGroup类,以及如何通过XML布局文件高效创建UI界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

  Android应用的UI组件大多数都在Android.widget包及其子包、Android.view包及其子包中。Android应用的所有UI组件都继承View类,View组件类似IOS中的UIView,代表一个白色的显示UI区域。

  View类还要一个重要的子类:ViewGroup(容器类)。

  Android所有的UI组件底层都是继承于View,一些组件继承于ViewGroup的子类。Android在UI开发过程中采用的”组合器“设计模式进行UI的布局。 布局都是依靠一个UI容器(ViewGroup),在容器内添加UI组件的方式。

UI布局

   Android开发过程中,会遇到各种样式的UI开发,程序员都有自己的开发习惯,有的热衷于纯代码开发,有的人会选择XML,还有的会选择混合使用。

  接下来用三个例子,讲解三种模式的UI开发

一、纯代码(不推荐)

在Activity的onCreate方法中,直接开发书写UI布局

// 导入 头文件
import java.util.Date;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
		// 线性布局LinearLayout是ViewGroup的子类
        LinearLayout layout = new LinearLayout(this);
        super.setContentView(layout);

        layout.setOrientation(LinearLayout.VERTICAL);

        final TextView show = new TextView(this);
        Button btn = new Button(this);
		
		// R.string.MainBtn MainBtn是在res/values/string.xml定义的按钮名字
        btn.setText(R.string.MainBtn);
        btn.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

        layout.addView(show);
        layout.addView(btn);


        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                show.setText("Hello World, " + new Date());
            }
        });
}

运行结果如图所示:纯代码UI布局
  在上述代码中,可以看到所有UI组件在创建过程中都会把当前Activity(this)传给组件。点击组件初始化方法,可以看到创建UI组件时需要传入一个Context 类参数。

  查看Android官方文档Context的解释如下:

  Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.

从上述可知Context一下三点作用:

  • 它描述的是一个应用程序环境的信息,即上下文。
  • 该类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类
  • 通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent

Android中的Activity、Service都继承于Context,所以UI组件通过this获取Context传给UI组件。

二、XML(推荐)

Android的Activity页面的类如下:

// 导入 头文件
import java.util.Date;


//Activity内的onCreate方法
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        final TextView show = findViewById(R.id.show);


        Button nextBtn = findViewById(R.id.btn);
        nextBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                show.setText("Hello World, " + new Date());
   }

对应Activity的XML UI布局文件如下

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:id="@+id/root"
    >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="@+id/root"

        android:id="@+id/show"
        >
    </TextView>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn"
        android:text="@string/MainBtn"

        app:layout_constraintStart_toStartOf="@+id/root"
        app:layout_constraintTop_toBottomOf="@+id/show"
        app:layout_goneMarginBottom="10dp"
        >

    </Button>
</androidx.constraintlayout.widget.ConstraintLayout>

通过XML布局UI,把所有的UI组件都创建在XML文件中,通过Activity进行控制UI组件。

三、XML + 代码

  Android通过XML+代码的方式,就不详细列举了。可以参考前两种的方式。

总结

  Android的UI开发,更多的采用XML的方式。

### 如何在Android项目中集成和使用Java代码 #### 集成Jetpack Compose到现有Java项目 对于现有的Java Android项目,如果希望引入Jetpack Compose作为UI框架的一部分,则需要按照特定的方式调整项目的构建文件以及设置。这不仅能够保留原有的业务逻辑不变,还能逐步采用新的声明式UI编程模型。 为了使旧版Java应用程序支持Compose UI组件,在`build.gradle(Project)`级别需加入必要的依赖项: ```groovy buildscript { ext { compose_version = '1.2.0-alpha08' } } ``` 而在应用级别的`build.gradle(Module: app)`里则要添加如下配置以启用AGP(Android Gradle Plugin)对Compose的支持并导入所需库[^1]: ```groovy android { ... buildFeatures { compose true } composeOptions { kotlinCompilerExtensionVersion compose_version } } dependencies { implementation "androidx.compose.ui:ui:$compose_version" implementation "androidx.compose.material:material:$compose_version" implementation "androidx.compose.ui:ui-tooling-preview:$compose_version" debugImplementation "androidx.compose.ui:ui-tooling:$compose_version" } ``` 通过上述更改之后,就可以开始编写基于Composable函数定义界面布局了。值得注意的是,虽然主要工作是在XML转为Kotlin DSL的过程中完成的,但是原有Activity/Fragment中的生命周期管理等部分依旧可以沿用之前的实现方式。 #### Kotlin与Java互操作性增强 当考虑将某些功能模块迁移至更现代的语言如Kotlin时,不必担心两者之间的兼容性和交互问题。Google官方已经确保了这两种语言之间具有良好的互通特性,允许开发者自由混编而不会遇到障碍。 具体来说,在同一个包内同时存在`.kt` 和 `.java` 文件的情况下,它们可以直接相互引用对方公开的方法、属性或类成员变量。不过需要注意一些细微差异,例如null安全机制的不同处理方法或是协程这样的高级特性的运用[^3]。 #### Flutter与原生Java代码桥接 除了内部技术栈的选择外,有时也会面临跨平台需求——即在一个多端共存的应用体系结构下共享核心算法或者网络请求层之类的通用服务。此时借助插件化方案可以让不同前端呈现形式无缝对接后台资源池。 以Flutter为例,其提供了完整的API用于接入宿主环境所提供的设施和服务。通常做法是利用Platform Channels建立消息传递通道,从而实现在Dart侧发起RPC调用来触发本地执行相应任务的效果。这种方式既保持了各自生态系统的独立性又促进了协作效率提升[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值