📌  相关文章
📜  Android中如何在Fragment之间进行通信?

📅  最后修改于: 2022-05-13 01:54:23.722000             🧑  作者: Mango

Android中如何在Fragment之间进行通信?

现在,大多数应用程序都具有如此多的功能,因此它们在单个应用程序中使用多个片段,而通信是应用程序从一个片段到另一个片段共享数据的重要部分之一,因为两个片段无法直接通信。片段代表任何用户界面的一部分。一个活动中可以有多个片段。他们有自己的生命周期。

方法

我们可以通过多种方式在应用程序中进行通信:

想要一个更快节奏和更具竞争力的环境来学习 Android 的基础知识吗?
单击此处前往由我们的专家精心策划的指南,旨在让您立即做好行业准备!
  • 我们可以使用ViewModel在片段内进行通信。
  • 我们还可以使用接口在片段之间进行通信。

在本文中,我们将使用 Kotlin 解释使用接口在片段之间进行通信。

分步实施

第 1 步:在您的 android studio 中创建一个新项目



要在 Android Studio 中创建新项目,请参阅如何在 Android Studio 中创建/启动新项目。请注意,选择 Kotlin 作为编程语言。

第 2 步:创建两个空白片段

导航到MainActivity.kt所在的项目文件。右键单击该文件夹,然后单击新包并将其命名为片段。现在在这个新创建的文件夹中创建两个空白片段并将它们命名为Fragment1Fragment2

第 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.ktFragment2.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
    }
  
}

输出:

输出