安卓 XML 文件 分析

安卓 XML 文件 分析

八月 28, 2023

安卓 XML 文件 分析

本文以深度分析安卓的XML文件为主,了解XML文件的作用,以便于更好的理解开发的各个概念。

学而不思则罔,思而不学则殆。

要学习,先思考。

首先定义三个问题:

  1. 为什么要用到XML?
  2. XML文件是如何被引用的?
  3. XML的各个元素在java文件中又是如何表示的?

问题解答环节 (一)

问题一:为什么要用到XML?

答:主要出于以下几个原因

  • 方便定义用户界面

    • XML非常的适合描述界面的视图元素,这使得开发人员能够以声明的形式定义界面元素,而不必在代码中直接构建和布局。
  • 方便逻辑与布局分离

    • XML文件描绘布局,java或kotlin文件实现逻辑,就这么简单。
  • 代码简化

    • 代码分开写,看起来更简单。
  • 支持可扩展性

    • XML被设计为可扩展的标记语言
  • 与安卓API集成

    • 可以通过使用XML布局文件和Android的API,开发人员可以轻松地创建动态的用户界面,响应用户的操作。(似懂非懂)

问题二:XML代码是如何被引用的?

首先,看代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import com.example.demoproject1.databinding.FragmentFirstBinding;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.navigation.fragment.NavHostFragment;


public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
// 实现xml导航
super.onViewCreated(view, savedInstanceState);

binding.buttonFirst.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
NavHostFragment.findNavController(FirstFragment.this)
.navigate(R.id.action_FirstFragment_to_SecondFragment);
}
});
}

上图代码中 R.id.action_FirstFragment_to_SecondFragment 这行代码,可以直接访问到nav_graph.xml

文件。

实质: action 作用: First Fragment to Second Fragment

解释: 将 第一片 Fragment导航到了 第二片 Fragment

通过NavHostFragment.findNavController()这个方法,实现了Fragment之间的导航管理.

看到这里,还没明白?没关系,来看看nav_graph.xml这个文件的内容.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="utf-8"?>
<navigation 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:id="@+id/nav_graph"
app:startDestination="@id/FirstFragment">

<fragment
android:id="@+id/FirstFragment"
android:name="com.example.demoproject1.FirstFragment"
android:label="@string/first_fragment_label"
tools:layout="@layout/fragment_first">

<action
android:id="@+id/action_FirstFragment_to_SecondFragment"
app:destination="@id/SecondFragment" />
</fragment>
<fragment
android:id="@+id/SecondFragment"
android:name="com.example.demoproject1.SecondFragment"
android:label="@string/second_fragment_label"
tools:layout="@layout/fragment_second">

<action
android:id="@+id/action_SecondFragment_to_FirstFragment"
app:destination="@id/FirstFragment" />
<!--我们可以看到这里有一个action标签 -->
</fragment>
</navigation>

也就是说,我们通过 R.id可以直接引用到此id,访问到其下的action_SecondFragment_to_FirstFragment这段内容,也就没有那么难理解了吧.

NavHostFragmentfindNavController方法,直译为寻找导航控制器.

实际上是在告诉系统:“请在 FirstFragment 的上下文中找到与之关联的 NavController”。通过传入 FirstFragment.this 作为参数,为系统提供了找到正确 NavController 的必要上下文信息。

navigate的本质:navigate()方法是Android Navigation组件中的一个方法,用于执行导航动作。该方法接受一个导航动作的ID作为参数,并触发与该动作关联的导航。

而在XML文件中 app:destination="@id/FirstFragment" 这行代码的作用不可小觑.

上文很重要的一句话是: 并出发与该动作关联的导航.

app:destination="@id/FirstFragment" ,所提供的,就是关联!

  • 在导航XML中,app:destination="@id/FirstFragment"的作用是指定一个目标页面的标识符,该标识符与FirstFragment类相关联。

    具体来说,@id/FirstFragment是一个资源标识符,它指定了目标页面的名称。在这种情况下,目标页面被指定为FirstFragment类,这意味着当应用程序需要跳转到FirstFragment时,可以参考这个标识符来找到正确的目标页面。

fragment_first.xml 中的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?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=".FirstFragment">

<TextView
android:id="@+id/textview_first"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_first_fragment"
app:layout_constraintBottom_toTopOf="@id/button_first"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/button_first"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/next"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/textview_first" />
</androidx.constraintlayout.widget.ConstraintLayout>

总结:

  • 理解了XML文件
  • findNavController()方法
  • navigate()方法
  • R.id印象加深