Android中如何在Fragment之间进行通信?
现在,大多数应用程序都具有如此多的功能,因此它们在单个应用程序中使用多个片段,而通信是应用程序从一个片段到另一个片段共享数据的重要部分之一,因为两个片段无法直接通信。片段代表任何用户界面的一部分。一个活动中可以有多个片段。他们有自己的生命周期。
方法
我们可以通过多种方式在应用程序中进行通信:
- 我们可以使用ViewModel在片段内进行通信。
- 我们还可以使用接口在片段之间进行通信。
在本文中,我们将使用 Kotlin 解释使用接口在片段之间进行通信。
分步实施
第 1 步:在您的 android studio 中创建一个新项目
要在 Android Studio 中创建新项目,请参阅如何在 Android Studio 中创建/启动新项目。请注意,选择 Kotlin 作为编程语言。
第 2 步:创建两个空白片段
导航到MainActivity.kt所在的项目文件。右键单击该文件夹,然后单击新包并将其命名为片段。现在在这个新创建的文件夹中创建两个空白片段并将它们命名为Fragment1和Fragment2 。
第 3 步:使用 XML 文件
导航到app > res > layout > fragment1.xml并将以下代码添加到该文件中。下面是fragment1.xml文件的代码。
XML
XML
Kotlin
package com.mrtechy.gfg
interface Communicator {
fun passData(ediTextInput:String)
}
Kotlin
package com.mrtechy.gfg
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.mrtechy.gfg.fragments.Fragment1
import com.mrtechy.gfg.fragments.Fragment2
class MainActivity : AppCompatActivity(), Communicator {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// created instance of Fragment1
val fragment1 = Fragment1()
// Frame manager called to replace Fragment2 frame layout with Fragment1 data
supportFragmentManager.beginTransaction().replace(R.id.frameLayout,fragment1).commit()
}
// Override function which we
// have created in our interface
override fun passData(ediTextInput: String) {
val bundle = Bundle()
bundle.putString("message", ediTextInput)
val transaction = this.supportFragmentManager.beginTransaction()
// Created instance of fragment2
val fragment2 = Fragment2()
fragment2.arguments = bundle
transaction.replace(R.id.frameLayout,fragment2)
transaction.commit()
}
}
Kotlin
package com.mrtechy.gfg.fragments
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.EditText
import com.mrtechy.gfg.Communicator
import com.mrtechy.gfg.R
class Fragment1 : Fragment() {
private lateinit var communicator: Communicator
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_1, container, false)
communicator = activity as Communicator
// there are button and edittext id which we have saved
val button:Button = view.findViewById(R.id.sendBtn)
val textMessage:EditText = view.findViewById(R.id.messageInput)
// pass data to our interface while
// button clicked using setOnClickListener
button.setOnClickListener {
communicator.passData(textMessage.text.toString())
}
return view
}
}
Kotlin
package com.mrtechy.gfg.fragments
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.mrtechy.gfg.R
class Fragment2 : Fragment() {
// initalised a emplty string variable
var displayMessage:String? =""
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_2, container, false)
val displayM:TextView = view.findViewById(R.id.displayMessage)
// get text from interface and send
// to textView present in Fragment2
displayMessage = arguments?.getString("message")
displayM.text = displayMessage
return view
}
}
导航到app > res > layout > fragment2.xml并将以下代码添加到该文件中。下面是fragment2.xml文件的代码。
XML
第 4 步:创建接口
再次导航到MainActivity.kt所在的项目文件夹,然后右键单击该文件夹 -> 新建 -> Kotlin 类/文件 ->将其命名为 Communicator。
科特林
package com.mrtechy.gfg
interface Communicator {
fun passData(ediTextInput:String)
}
第 5 步:使用 MainActivity.kt
科特林
package com.mrtechy.gfg
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.mrtechy.gfg.fragments.Fragment1
import com.mrtechy.gfg.fragments.Fragment2
class MainActivity : AppCompatActivity(), Communicator {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// created instance of Fragment1
val fragment1 = Fragment1()
// Frame manager called to replace Fragment2 frame layout with Fragment1 data
supportFragmentManager.beginTransaction().replace(R.id.frameLayout,fragment1).commit()
}
// Override function which we
// have created in our interface
override fun passData(ediTextInput: String) {
val bundle = Bundle()
bundle.putString("message", ediTextInput)
val transaction = this.supportFragmentManager.beginTransaction()
// Created instance of fragment2
val fragment2 = Fragment2()
fragment2.arguments = bundle
transaction.replace(R.id.frameLayout,fragment2)
transaction.commit()
}
}
第 6 步:使用 Fragment1 和 Fragment 文件
下面分别是Fragment1.kt和Fragment2.kt文件的代码。
科特林
package com.mrtechy.gfg.fragments
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.EditText
import com.mrtechy.gfg.Communicator
import com.mrtechy.gfg.R
class Fragment1 : Fragment() {
private lateinit var communicator: Communicator
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_1, container, false)
communicator = activity as Communicator
// there are button and edittext id which we have saved
val button:Button = view.findViewById(R.id.sendBtn)
val textMessage:EditText = view.findViewById(R.id.messageInput)
// pass data to our interface while
// button clicked using setOnClickListener
button.setOnClickListener {
communicator.passData(textMessage.text.toString())
}
return view
}
}
科特林
package com.mrtechy.gfg.fragments
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.mrtechy.gfg.R
class Fragment2 : Fragment() {
// initalised a emplty string variable
var displayMessage:String? =""
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_2, container, false)
val displayM:TextView = view.findViewById(R.id.displayMessage)
// get text from interface and send
// to textView present in Fragment2
displayMessage = arguments?.getString("message")
displayM.text = displayMessage
return view
}
}
输出: