在 Kotlin 中将值从 Activity 传递到 Fragment

     2023-04-18     274

关键词:

【中文标题】在 Kotlin 中将值从 Activity 传递到 Fragment【英文标题】:Passing a value from Activity to Fragment in Kotlin 【发布时间】:2019-05-26 15:27:50 【问题描述】:

我在我的项目中创建了一个底部导航活动,其中包含一个活动和两个片段。在主活动中,我将值存储在一个变量中,但如果我将值传递给片段,那么我会收到 NullPointer 异常错误。我在我的项目中使用 kotlin,感谢您的帮助。 期待

Get Value into Fragment from MainActivity. MainActivity--->TestOneFragment

使用的语言

Kotlin

主要活动

class Test : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener

    private val KEY_POSITION = "keyPosition"
    private var navPosition: BottomNavigationPosition = BottomNavigationPosition.ONE
    private lateinit var toolbar: Toolbar
    private lateinit var bottomNavigation: BottomNavigationView

    override fun onCreate(savedInstanceState: Bundle?)
    
        super.onCreate(savedInstanceState)
        restoreSaveInstanceState(savedInstanceState)
        setContentView(R.layout.activity_test)
        toolbar = findViewById(R.id.toolbar)
        bottomNavigation = findViewById(R.id.bottom_navigation)
        setSupportActionBar(toolbar)
        initBottomNavigation()
        initFragment(savedInstanceState)
        var Name:String=intent.getStringExtra("name")
        println("Test CLLicked: $Name")


        //This code is to pass the value to Fragment
        var bundle=Bundle()
        bundle.putString("name",Name)
        var frag=TestFragment()
        frag.arguments=bundle
    

    override fun onSaveInstanceState(outState: Bundle?)
    
        outState?.putInt(KEY_POSITION, navPosition.id)
        super.onSaveInstanceState(outState)
    

    override fun onNavigationItemSelected(item: MenuItem): Boolean
    
        navPosition = findNavigationPositionById(item.itemId)
        return switchFragment(navPosition)
    

    private fun restoreSaveInstanceState(savedInstanceState: Bundle?)
    
        savedInstanceState?.also 
            val id = it.getInt(KEY_POSITION, BottomNavigationPosition.ONE.id)
            navPosition = findNavigationPositionById(id)
        
    

    private fun initBottomNavigation()
    
        bottomNavigation.active(navPosition.position)
        bottomNavigation.setOnNavigationItemSelectedListener(this)
    

    private fun initFragment(savedInstanceState: Bundle?)
    
        savedInstanceState ?: switchFragment(BottomNavigationPosition.ONE)
    private fun switchFragment(navPosition: BottomNavigationPosition): Boolean 
        return supportFragmentManager.findFragment(navPosition).let 
            if (it.isAdded) return false
            supportFragmentManager.detach() // Extension function
            supportFragmentManager.attach(it, navPosition.getTag()) // Extension function
            supportFragmentManager.executePendingTransactions()
        
    
    private fun FragmentManager.findFragment(position: BottomNavigationPosition): Fragment
    
        return findFragmentByTag(position.getTag()) ?: position.createFragment()
    

TestOneFragment

 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? 
    val testName= arguments!!.getString("name")
....

错误

kotlin.KotlinNullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)

【问题讨论】:

您可以分享正确的日志,例如您在哪里获得 NPE,并尝试添加更多代码细节,例如您在哪个函数中传递/访问数据等。 你什么时候调用参数!!.getString("name")?同时,尽量避免在代码中强制展开(使用!!)。 @AdrianComan 感谢您的评论。如果我这样做了,那么我的变量输出中就会出现空值。 val testName= arguments?.getString("name") 正确,因为参数为空,但是您在代码中何时何地调用它?您可以发布片段类的示例吗? 我在 onCreateView 函数中调用它。 【参考方案1】:

以下是用于创建FragmentsnewInstance 模式示例。

这是在companion object 中,这几乎只是一种表达“这些东西是静态的”的方式。

首先,您应该为您的Bundle 名称定义常量,这将有助于保持所有内容对齐。接下来,定义一个接受参数的newInstance 方法,例如name

在那里,您将创建您的Fragment 并返回它。这样,您的Activity 就不必担心Bundle 或其他任何事情。您所有的逻辑都在一个地方,用于存储/检索,都在您的Fragment 中。

class TestOneFragment 

    companion object 
        const val ARG_NAME = "name"


        fun newInstance(name: String): TestOneFragment 
            val fragment = TestOneFragment()

            val bundle = Bundle().apply 
                putString(ARG_NAME, name)
            

            fragment.arguments = bundle

            return fragment
        
    

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? 
        val name = arguments?.getString(ARG_NAME)
        // ...
    

现在,您可以通过执行以下操作轻松获取您的Fragment

class Test : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener 

    override fun onCreate(savedInstanceState: Bundle?)
    
        super.onCreate(savedInstanceState)
        // ...

        val name = intent.getStringExtra("name")

        // Creating the new Fragment with the name passed in.
        val fragment = TestFragment.newInstance(name)
    


希望对您有所帮助!

【讨论】:

感谢您的评论。你能解释一下关于 MyActivity 代码的更多信息吗?我不确定在哪里写那段代码,比如在活动中还是在片段中 @JoshJo - MyActivity 代码进入您所在的任何Activity。假设您在您的MainActivity 上,并且您想显示您的TestOneFragment,您的MainActivity可以调用TestOneFragment.newInstance("name"),准备好Fragment,然后随心所欲地显示它。 如果您编辑您的问题以包括您将如何在您的MainActivty 中显示您的Fragment,我将编辑我的答案更具体。 我正在寻找另一个方向。我需要将活动值放入片段中。 MainActivity---->TestOneFragment 是的,我明白了。 MainActivty 有一些数据,您想用这些数据创建一个新的Fragment。对吗?

如何在 Codeigniter 中将值从视图传递到模型

】如何在Codeigniter中将值从视图传递到模型【英文标题】:HowtopassavaluefromviewtomodelinCodeIgniter【发布时间】:2014-02-1700:03:43【问题描述】:我想编辑卡在这里的检索用户是我的代码我在模型中有一个函数可以选择所有用户publicfuncti... 查看详情

如何在 QWebEngineView 中将值从 QML 传递到 JavaScript

】如何在QWebEngineView中将值从QML传递到JavaScript【英文标题】:HowtopassvaluefromQMLtoJavaScriptinQWebEngineView【发布时间】:2017-05-0910:27:26【问题描述】:DataManager是一个类,我可以通过以下代码在QML中访问它(Qt版本5.8.0)。DataManager*d=new... 查看详情

在java中将Arraylist值从servlet传递到JSP?

】在java中将Arraylist值从servlet传递到JSP?【英文标题】:PassingArraylistvaluesfromservlettoJSPinjava?【发布时间】:2017-03-1810:12:03【问题描述】:我正在尝试显示我在java中放置在Arraylist中的值,并将其传递给JSP页面并将其显示在表格行中... 查看详情

在 Kotlin 中将接口作为参数传递

】在Kotlin中将接口作为参数传递【英文标题】:PassinterfaceasparameterinKotlin【发布时间】:2017-05-2916:57:16【问题描述】:我想像这样传递一个接口作为参数:classTestfunmain()test()//howcanIpasshere?funtest(handler:Handler)//dosomethinginterfaceHandlerfu... 查看详情

在 Laravel Livewire 中将值从一个页面传递到另一个页面

】在LaravelLivewire中将值从一个页面传递到另一个页面【英文标题】:PassingavaluefromonepagetoanotherinLaravelLivewire【发布时间】:2021-06-0803:58:27【问题描述】:我是LivewireLaravel的新手,我有一个关于如何将值从一个页面传递到另一个页... 查看详情

在ionic 3中将标签文本的值从html传递到.ts?

】在ionic3中将标签文本的值从html传递到.ts?【英文标题】:Passvalueoflabeltextfromhtmlto.tsinionic3?【发布时间】:2019-01-1800:29:00【问题描述】:我是ionic新手,谁能告诉我如何将标签文本的值从html传递到.ts文件...我的代码是<divclass="... 查看详情

在qt中将值从一个按钮传递给另一个按钮

】在qt中将值从一个按钮传递给另一个按钮【英文标题】:PassingavaluefromoneButtontootherinqt【发布时间】:2019-07-0912:01:22【问题描述】:我想将on_pushButton_clicked中的QFile数据类型“input_file”传递给on_pushButton_2_clicked。voidMainWindow::on_pus... 查看详情

在角度js中将值从一个控件传递到另一个控件[重复]

】在角度js中将值从一个控件传递到另一个控件[重复]【英文标题】:Passingvaluefromonecontroltoanotherinangularjs[duplicate]【发布时间】:2013-06-2607:58:52【问题描述】:我正在编写一个程序来将文本框中的文本显示到一个框中。这是使用An... 查看详情

如何在swift 3中将布尔值从表格视图单元格类传递给表格视图类?

】如何在swift3中将布尔值从表格视图单元格类传递给表格视图类?【英文标题】:howtopassboolvaluefromtableviewcellclasstotableviewclassinswift3?【发布时间】:2017-09-0705:21:19【问题描述】:在这里,我正在使用委托将我的布尔值从表格视图... 查看详情

如何在单个 JQM 中将值从一个页面传递到另一个页面

】如何在单个JQM中将值从一个页面传递到另一个页面【英文标题】:HowtopassvaluesfromonepagetoanotherinsingleJQM【发布时间】:2013-03-1407:11:32【问题描述】:我使用pageinit加载页面并使用localstorage全局存储参数$(\'#testpage\').live(\'pageinit\',f... 查看详情

无法在android中将值从一个类传递给另一个类

】无法在android中将值从一个类传递给另一个类【英文标题】:Unabletopassavaluefromoneclasstoanotherinandroid【发布时间】:2014-02-2602:01:36【问题描述】:我面临一个问题:一个值没有从一个类转移到另一个类。该值是在一个类中选取的... 查看详情

在android中将值从一个窗口传递到另一个窗口

】在android中将值从一个窗口传递到另一个窗口【英文标题】:Passingvaluefromonewindowtotheanotherinandroid【发布时间】:2011-08-0200:02:39【问题描述】:我想将用户在第一个窗口中插入的值显示到下一个窗口。我在第一个窗口中接受用户... 查看详情

在 Asp.net MVC 中将值从视图传递到控制器

】在Asp.netMVC中将值从视图传递到控制器【英文标题】:PassValuefromViewToControllerinAsp.netMVC【发布时间】:2013-02-2115:47:37【问题描述】:我正在尝试将消息传递给另一个视图(实际上是同一个控制器)我可以做得很好,但是对我来说... 查看详情

如何在 Angular 2+ 中将值从 ts 文件传递​​到同一组件中的 scss 文件?

】如何在Angular2+中将值从ts文件传递​​到同一组件中的scss文件?【英文标题】:Howtopassvaluefromtsfiletoscssfileinsamecomponentinangular2+?【发布时间】:2018-08-2901:44:39【问题描述】:这是我的组件exportclassmyComponentimplementsonInitprivateoutageCo... 查看详情

如何将值从基本适配器传递到 Android 中的 Activity

】如何将值从基本适配器传递到Android中的Activity【英文标题】:HowtopassvaluefrombaseadaptertoActivityinAndroid【发布时间】:2015-12-1216:20:45【问题描述】:我在可展开的列表视图标题中添加了一个按钮。单击按钮时,我需要将值从适配器... 查看详情

如何在 Swift 中将值从自定义单元格设置/传递到视图控制器

】如何在Swift中将值从自定义单元格设置/传递到视图控制器【英文标题】:Howtoset/passvaluefromacustomcelltoaviewcontrollerinSwift【发布时间】:2014-09-1008:17:52【问题描述】:在我的程序中,视图控制器下的UITableView的自定义UITableCell中有... 查看详情

在 SWIFT 语言的 Storyboard 中将值从一个 ViewController 传递到另一个 ViewController

】在SWIFT语言的Storyboard中将值从一个ViewController传递到另一个ViewController【英文标题】:PassingvaluefromoneViewControllertoanotherinStoryboardinSWIFTLanguage【发布时间】:2014-06-2708:43:55【问题描述】:我用Swift语言开始项目。应用程序几乎完成... 查看详情

如何在iphone中将值从一个标签栏传递到另一个标签栏

】如何在iphone中将值从一个标签栏传递到另一个标签栏【英文标题】:Howtopassavaluefromonetabbartoanotheriniphone【发布时间】:2011-07-2912:11:12【问题描述】:我正在开发一个标签栏应用程序。在第一个标签中显示一个文本。有一个保存... 查看详情