结合AI,快速上手安卓开发

安卓开发总览

安卓开发主要包括两个部分:界面和逻辑,其实也就是xml+java(activity)

xml-标记是描绘界面;java-用来书写逻辑

Activity 是 Android 应用的基本组成单元,代表一个屏幕。

创建一个新的安卓页面需要三个步骤:

1,在layout目录下创建布局文件

2,activity

3,在清单文件中注册


安卓XML布局

xml必须以<?xml version="1.0" encoding="utf-8"?>开头 编码格式可以自定义 一般都是utf-8

cdata: 原样输出 不解析

常见布局:

1. LinearLayout(线性布局) 按水平(horizontal)或垂直(vertical)方向依次排列子控件,支持layout_weight按比例分配空间。 优点:结构简单,易于理解,适合一维排列。 缺点:嵌套过多会影响性能。 示例:

<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:text="标题"/>
<Button android:text="按钮"/>
</LinearLayout>

2. RelativeLayout(相对布局) 通过相对父容器或其他控件的位置关系来布局,如layout_below、layout_centerInParent等。 优点:减少嵌套,灵活定位。 缺点:复杂依赖关系可能降低可维护性。

3. FrameLayout(帧布局) 所有子控件默认叠加在左上角,后添加的控件覆盖前面的控件。 优点:适合做层叠效果(如图片覆盖文字)。 缺点:不适合复杂排列。

4. TableLayout(表格布局) 按行列组织控件,列宽由该列最宽控件决定,可用stretchColumns、shrinkColumns调整列宽。 优点:适合表格数据展示。 缺点:灵活性较低。

5. ConstraintLayout(约束布局) 通过约束(Constraint)定义控件相对位置,支持链式布局(Chains)、比例(Bias)、权重(Weighted Chain)。 优点:减少嵌套,适配性强,适合复杂响应式布局。 缺点:XML编写相对复杂,推荐配合可视化编辑器。

选择建议:

  1. 简单线性排列 → LinearLayout
  2. 精确相对定位 → RelativeLayout
  3. 层叠效果 → FrameLayout
  4. 表格数据 → TableLayout
  5. 复杂自适应布局 → ConstraintLayout


实践1:LinearLayout内部左右两个元素 左侧固定 右侧占满

android:layout_weight="1"

android:layout_width="0dp"


实践2:圆角

<androidx.cardview.widget.CardView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:cardCornerRadius="40dp"
app:cardElevation="0dp">
<ImageView
android:id="@+id/image_view"
android:layout_width="40dp"
android:layout_height="40dp"
android:scaleType="centerCrop"
android:src="@drawable/img1" />

</androidx.cardview.widget.CardView>

实践3:Fragment

在实际开发中很多应用界面需要重复使用,那么这个时候就需要Fragment。Fragment拥有自己的生命周期,能接收自己的输入事件,并且可以在 Activity 运行时被添加或移除,需要一个java文件+xml布局文件。(前端的component)

创建Fragment

onCreateView: 建并返回 Fragment 的视图

onViewCreated: 当视图创建完成后调用,在这里进行初始化和查找View

// 以 Kotlin 为例,Java 语法类似
class MyExampleFragment : Fragment() {

// 关键方法:创建并返回 Fragment 的视图
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// 使用 LayoutInflater 将 XML 布局文件“膨胀”成 View 对象
return inflater.inflate(R.layout.fragment_my_example, container, false)
}

// 另一个重要方法:当视图创建完成后调用,在这里进行初始化和查找View
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// 例如,找到布局中的按钮并设置点击事件
val myButton: Button = view.findViewById(R.id.my_button)
myButton.setOnClickListener {
// 处理点击事件
Toast.makeText(activity, "Fragment Button Clicked!", Toast.LENGTH_SHORT).show()
}
}
}

将 Fragment 添加到 Activity 中

有两种方式:在 XML 布局中静态添加在代码中动态添加

方式一:静态添加(在 XML 中)

在 Activity 的布局文件中使用 <fragment> 标签。这种方式简单但不灵活,Fragment 一旦添加就无法在运行时移除。

<LinearLayout ...>
<fragment
android:name="com.example.myapp.MyExampleFragment" // 你的 Fragment 类的全路径名
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>

方式二:动态添加(在代码中)

这是最常用、最强大的方式。它允许你在运行时添加、移除、替换 Fragment。

核心概念:

  1. FragmentManager:负责管理 Fragment(supportFragmentManager)。
  2. FragmentTransaction:执行添加、移除、替换等操作。

Activity 的布局需要提供一个容器

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container" // 就是这个容器!
android:layout_width="match_parent"
android:layout_height="match_parent" />


Activity 中的代码

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

// 1. 获取 FragmentManager
val fragmentManager = supportFragmentManager

// 2. 开始一个事务 (FragmentTransaction)
val fragmentTransaction = fragmentManager.beginTransaction()

// 3. 创建一个 Fragment 实例
val myFragment = MyExampleFragment()

// 4. 执行操作:将 Fragment 添加到布局中的某个容器(通常是一个 FrameLayout)
// R.id.fragment_container 是 Activity 布局中的一个 ViewGroup,用来盛放 Fragment
fragmentTransaction.add(R.id.fragment_container, myFragment)

// (可选)添加到返回栈,这样用户按返回键可以回到上一个 Fragment 状态
fragmentTransaction.addToBackStack(null)

// 5. 提交事务
fragmentTransaction.commit()
}
}