【问题标题】:How to pass a variable from one fragment to another in kotlin [duplicate]如何在kotlin中将变量从一个片段传递到另一个片段[重复]
【发布时间】:2021-06-03 10:05:27
【问题描述】:

我对 android Studio 比较陌生,所以我只是问如何发送变量让我们说;

val Name = editName.text.toString() 从一个片段到另一个片段,以便您可以在第二个片段中使用它?? 我没有这个项目,这只是我的一个问题。

【问题讨论】:

  • 查看以下链接tutorialspoint.com/…
  • 我也可以在 kotlin 中找到解决方案吗?
  • @adamadam 检查我在 kotlin 中的答案
  • 你想在两个 Fragment 都在同一个活动上活动时这样做吗?或者当一个新片段替换预览片段时?两者都是可能的,但需要不同的解决方案

标签: android-studio kotlin


【解决方案1】:

首先我建议你如果你不知道什么是片段,你可以在传递片段时添加一些参数这是导航链接。 https://developer.android.com/guide/navigation 我会先解释一下从这个链接做导航的实现 https://developer.android.com/guide/navigation/navigation-getting-started

然后,创建一个导航(文档将帮助您)最后,您将在导航中的片段之间创建箭头,并将附加内容作为参数放入导航中,无需任何代码。非常简单的参数文档在这里: https://developer.android.com/guide/navigation/navigation-pass-data

val bundle = bundleOf("amount" to amount)
view.findNavController().navigate(R.id.confirmationAction, bundle)

最后您可以使用这些代码传递您的数据

【讨论】:

    【解决方案2】:

    第 1 步 - 在 Android Studio 中创建一个新项目,转到 File ⇉ New Project 并填写所有必需的详细信息以创建一个新项目。

    第 2 步 - 将以下代码添加到 res/layout/activity_main.xml。

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:id="@+id/relativeLayout"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:orientation="vertical"
       android:padding="8dp">
    </RelativeLayout>
    

    Step 3 - 创建两个 FragmentActivity 并添加下面给出的代码。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:gravity="center"
       android:orientation="vertical"
       android:padding="8dp">
       <EditText
          android:id="@+id/editText"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_marginTop="50dp"
          android:hint="Enter your message"
          android:textColorHint="@android:color/background_dark"
          android:textSize="16sp"
          android:textStyle="bold" />
       <Button
          android:id="@+id/btnSend"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:background="@android:color/holo_blue_dark"
          android:padding="10dp"
          android:text="Send Message"
          android:textColor="@android:color/white"
          android:textStyle="bold" />
    </LinearLayout>
    
    FirstFragment.kt −
    
    import android.os.Bundle
    import android.view.LayoutInflater
    import android.view.View
    import android.view.ViewGroup
    import androidx.fragment.app.Fragment
    import kotlinx.android.synthetic.main.fragment_one.view.*
    class FirstFragment : Fragment() {
       private lateinit var communicator: Communicator
       override fun onCreateView(
          inflater: LayoutInflater,
          container: ViewGroup?,
          savedInstanceState: Bundle?
       ): View? {
          val rootView = inflater.inflate(R.layout.fragment_one, container, false) as ViewGroup
          communicator = activity as Communicator
          rootView.btnSend.setOnClickListener {
             communicator.passData(rootView.editText.text.toString())
          }
          return rootView
       }
    }
    
    fragmentTwo.xml −
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:gravity="center"
       android:orientation="vertical">
       <TextView
          android:id="@+id/outPutTextView"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:gravity="center"
          android:textColor="@android:color/background_dark"
          android:textSize="24sp"
          android:textStyle="bold" />
    </LinearLayout>
    
    FragmentTwo.kt −
    
    import android.os.Bundle
    import androidx.fragment.app.Fragment
    import android.view.LayoutInflater
    import android.view.View
    import android.view.ViewGroup
    import kotlinx.android.synthetic.main.fragment_two.view.*
    class FragmentTwo : Fragment() {
       var inputText: String? = ""
       override fun onCreateView(
          inflater: LayoutInflater,
          container: ViewGroup?,
          savedInstanceState: Bundle?
       ): View? {
          val rootView = inflater.inflate(R.layout.fragment_two, container, false)
          inputText = arguments?.getString("inputText")
          rootView.outPutTextView.text = inputText
          return rootView
       }
    }
    
    
    Step 5 − Add the following code to androidManifest.xml
    
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="app.com.kotlipapp">
       <application
          android:allowBackup="true"
          android:icon="@mipmap/ic_launcher"
          android:label="@string/app_name"
          android:roundIcon="@mipmap/ic_launcher_round"
          android:supportsRtl="true"
          android:theme="@style/AppTheme">
          <activity android:name=".MainActivity">
             <intent-filter>
                <action android:name="android.intent.action.MAIN" /&g;
                <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter&g;
          </activity>
       </application>
    </manifest>
    

    我以tutorial为例

    【讨论】:

      【解决方案3】:

      您想在两个 Fragment 都在同一个活动上处于活动状态时这样做吗?或者当一个新片段替换预览片段时?两者都是可能的,但需要不同的解决方案。

      如果两个片段同时处于活动状态,您可以创建一个接口并让所有片段实现它。下面是一个将事件从一个片段发送到其他片段的示例:

      abstract class ActionableFragment(@LayoutRes contentLayoutId: Int) : Fragment() {
              init { Fragment(contentLayoutId) }
              abstract fun processEvent(event: MyEventObject)
      
          fun sendEvent(event: MyEventObject) {
              val fragmentList = parentFragmentManager.fragments as MutableList<ActionableFragment>
              for (fragment in fragmentList) {
              fragment.processEvent(event)
          }
      }
      

      片段中的代码:

         class FirstFragment : ActionableFragment(R.layout.fragment_one) {
          
              override fun processEvent(event: MyEventObject) {
                  Util.log("FirstFragment", "${event.name}")
              }
          
              override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
                  // Inflate the layout for this fragment
                  sendEvent(MyEventObject("This is an event with an Int",1))
                  return inflater.inflate(R.layout.fragment_one, container, false)
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-12
        • 2020-05-31
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        相关资源
        最近更新 更多