如何在 Android 中将数据从 Activity 发送到 Fragment?
先决条件:
- Android 中的 Activity 介绍
- Android 中的 Fragment 简介
在 Android 中,片段是用户界面的一部分,可以反复使用。 Fragment 管理自己的布局,有自己的生命周期。由于片段是较大用户界面的一小部分,因此它只能在活动或另一个片段内初始化。因此,如果我们希望在片段中显示任何类型的资源,例如字符串或图像,我们需要在活动中声明它们,然后将其传递给片段。因此,在本文中,我们将向您展示如何将数据从 Activity 传递到 Fragment。
分步实施
第 1 步:在 Android Studio 中创建一个新项目
要在 Android Studio 中创建新项目,请参阅如何在 Android Studio 中创建/启动新项目。我们在Kotlin 中演示了该应用程序,因此请确保在创建新项目时选择 Kotlin 作为主要语言。
第二步:在layout文件夹中创建自定义fragment布局(my_custom_fragment.xml)
我们将向片段传递一个字符串。为了显示这个字符串,我们实现了一个 TextView。
XML
XML
Kotlin
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment
class MyCustomFragment: Fragment() {
// Declaring TextView fro the custom fragment layout
private lateinit var myTextView: TextView
// Override function when the view is being created
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
// Inflates the custom fragment layout
val view: View = inflater.inflate(R.layout.my_custom_fragment, container, false)
// Finds the TextView in the custom fragment
myTextView = view.findViewById(R.id.fragmentTextView) as TextView
// Gets the data from the passed bundle
val bundle = arguments
val message = bundle!!.getString("mText")
// Sets the derived data (type String) in the TextView
myTextView.text = message
return view
}
}
Kotlin
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Declaring and initializing the EditText and Button from the layout
val mEditText = findViewById(R.id.editText)
val mButton = findViewById
第三步:在布局文件(activity_main.xml)中添加EditText、Button、Frame
请参阅代码中的注释以更好地理解。
XML
第 4 步:为自定义片段创建一个类 (MyCustomFragment.kt)
这是一个自定义片段类,用于在主活动中存在的框架布局中扩充自定义布局。
科特林
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment
class MyCustomFragment: Fragment() {
// Declaring TextView fro the custom fragment layout
private lateinit var myTextView: TextView
// Override function when the view is being created
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
// Inflates the custom fragment layout
val view: View = inflater.inflate(R.layout.my_custom_fragment, container, false)
// Finds the TextView in the custom fragment
myTextView = view.findViewById(R.id.fragmentTextView) as TextView
// Gets the data from the passed bundle
val bundle = arguments
val message = bundle!!.getString("mText")
// Sets the derived data (type String) in the TextView
myTextView.text = message
return view
}
}
第 5 步:初始化 MyCustomFragment 类并从 EditText (MainActivity.kt) 传递值
在这个程序中,EditText 值(输入字符串)是在单击按钮时获取的。自定义片段类被初始化并传递输入字符串以获得所需的结果。请参考下面代码中的注释以获得更好的理解。
科特林
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Declaring and initializing the EditText and Button from the layout
val mEditText = findViewById(R.id.editText)
val mButton = findViewById
输出:
我们可以看到,当在 EditText 中输入文本并单击按钮时,在我们的自定义片段中显示相同的文本。