安卓 XML 文件 分析
本文以深度分析安卓的XML文件为主,了解XML文件的作用,以便于更好的理解开发的各个概念。
学而不思则罔,思而不学则殆。
要学习,先思考。
首先定义三个问题:
- 为什么要用到XML?
- XML文件是如何被引用的?
- XML的各个元素在java文件中又是如何表示的?
问题解答环节 (一)
问题一:为什么要用到XML?
答:主要出于以下几个原因
方便定义用户界面
- XML非常的适合描述界面的视图元素,这使得开发人员能够以声明的形式定义界面元素,而不必在代码中直接构建和布局。
方便逻辑与布局分离
- XML文件描绘布局,java或kotlin文件实现逻辑,就这么简单。
代码简化
支持可扩展性
与安卓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) { 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" /> </fragment> </navigation>
|
也就是说,我们通过 R.id
可以直接引用到此id
,访问到其下的action_SecondFragment_to_FirstFragment
这段内容,也就没有那么难理解了吧.
而NavHostFragment
的findNavController
方法,直译为寻找导航控制器.
实际上是在告诉系统:“请在 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
印象加深