如何使用安全参数将数据从导航抽屉传递到活动?

     2023-04-18     162

关键词:

【中文标题】如何使用安全参数将数据从导航抽屉传递到活动?【英文标题】:How to pass data from the navigationdrawer to Activity using safe-args? 【发布时间】:2019-10-06 21:34:34 【问题描述】:

假设我们有一个这样的项目:

class MainActivity : AppCompatActivity() 
    private lateinit var drawerLayout: DrawerLayout
    private lateinit var appBarConfiguration : AppBarConfiguration

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        drawerLayout = binding.drawerLayout
        val navController = this.findNavController(R.id.myNavHostFragment)
        NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)
        appBarConfiguration = AppBarConfiguration(navController.graph, drawerLayout)
        // prevent nav gesture if not on start destination
        navController.addOnDestinationChangedListener  nc: NavController, nd: NavDestination, bundle: Bundle? ->
            if (nd.id == nc.graph.startDestination) 
                drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
             else 
                drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
            
        
        NavigationUI.setupWithNavController(binding.navView, navController)
    

一个简单项目的链接:https://github.com/udacity/andfun-kotlin-android-trivia/blob/Step.11-Solution-Adding-Animation/app/src/main/java/com/example/android/navigation/MainActivity.kt

我的 navGraph 文件包含片段和一个 Activity,如果用户从导航抽屉中选择它的标题,我想去的地方。我想向这个 Activity 发送一些数据。如何使用安全参数来做到这一点?

我正在使用:

apply plugin: "androidx.navigation.safeargs"

implementation 'androidx.navigation:navigation-fragment:2.0.0'

implementation 'androidx.navigation:navigation-ui:2.0.0'

【问题讨论】:

您可能需要重新考虑您的逻辑,因为使用菜单仅指定用于导航的 id 而不是操作;用于 SafeArgs。因此,要么您以普通包的形式传递数据并使用安全参数检索,要么重新考虑您的结构。 “菜单仅指定导航的 id 而不是操作” - 不正确。如果 id 引用了一个动作,那么这个动作实际上会被使用。 【参考方案1】:

首先,您必须转到导航图并为活动目的地指定一个参数。这可以通过设计 UI 或像这样的 XML 来完成;

<navigation>
    <activity android:id="@+id/someActivity">
        <argument
            android:name="isEditMode"
            app:argType="boolean"
            android:defaultValue="false" />
    </activity>
</navigation>

这个 sn-p 假设您正在向活动传递一个布尔值。

此时,您可以构建项目,以便生成所有需要的文件。

然后在负责启动活动的任何导航菜单项的 onClick 中,传入数据;

override boolean onNavigationItemSelected(menuItem: menuItem) 

    val id = menuItem.itemId

    when (id) 

       R.id.openActivity -> 
            val bundle = bundleOf("isEditMode" to false) 
            findNavController().navigate(R.id.someActivity, bundle)
       
    
    return true

然后在你的activity中,安全获取pass数据为;

val safeArguments: MyActivityArgs by navArgs()
val isEditMode = safeArgs.isEditMode)

【讨论】:

我需要在不使用onNavigationItemSelected 的情况下完成它,因为它已经用图形和导航控制器完成了。最后,我以编程方式将数据添加为默认值NavArgument isDemoTrueArgument = new NavArgument.Builder().setType(NavType.BoolType).setDefaultValue(true).build(); NavGraph graph = navController.getGraph(); NavDestination demoDestination = graph.findNode(R.id.nav_demo); demoDestination.addArgument("is_demo", isDemoTrueArgument);【参考方案2】:

在 MainActivity 的 onCreate 方法中使用:

val navController = this.findNavController(R.id.myNavHostFragment)

navController.addOnDestinationChangedListener  controller, destination, arguments ->
    when(destination.id) 
        R.id.caixaFragment -> 
            var myVar = someMethodThatBringsMyVarValue()
            val argument = NavArgument.Builder().setDefaultValue(mayVar).build()
            destination.addArgument("idMes", argument)
        
    

我从 this question 的 Ayxan Haqverdili 那里得到的

【讨论】:

如何将数据从一个屏幕传递到抽屉?

】如何将数据从一个屏幕传递到抽屉?【英文标题】:Howtopassdatafromonescreentothedrawer?【发布时间】:2020-02-2706:19:35【问题描述】:我有一个屏幕,我想将数据从该屏幕传递到抽屉。我的抽屉类如下所示:classInitDrawerextendsStatelessWid... 查看详情

更新基本导航抽屉活动的参数

...上下文:我想在他登录后将userId传递给片段UserFragment。我使用了一个新项目Android类型“导航抽屉活动”。我使用LiveData,所以当用户登录时,我的livedata的观察者会从MainActivity更新idUse 查看详情

如何从导航抽屉启动活动?

】如何从导航抽屉启动活动?【英文标题】:HowtolaunchactivityfromNavigationDrawer?【发布时间】:2014-06-3020:25:10【问题描述】:所以我在这里搜索了有关导航抽屉的分配,当我被指向另一个人问题的答案中的教程时。我这样做了。我... 查看详情

如何将值从片段/活动传递到 xml?

】如何将值从片段/活动传递到xml?【英文标题】:Howtopassvaluefromafragment/activitytoxml?【发布时间】:2022-01-0403:51:29【问题描述】:所以我知道可以在活动和片段之间使用intent传递数据,但是有没有办法将值传递给某些XML文件?说... 查看详情

线程安全地将数据从服务传递到活动 - Android

...18【问题描述】:我正在开发XMPP聊天应用程序,并且正在使用aSmack。我有一个保存XMPP连接、注册名册和数据包侦听器等的服务。目前,我的服务登录然后调用connection.getRoster()并在Singleton 查看详情

将导航抽屉活动扩展到其他活动

...扩展该活动并按照此问题Link中给出的答案在所有活动中使用菜单,但我的测试应用程序不断崩溃,这是我的代码:BaseActivity.javapublicclassBaseActivityex 查看详情

将(打开/关闭)按钮添加到(打开/关闭)导航抽屉的活动

...述】:我目前正在从android网站了解NavigationDrawer,我正在使用他们的示例http://developer.android.com/training/i 查看详情

如何在底部导航片段(或导航抽屉)之间传递数据?

】如何在底部导航片段(或导航抽屉)之间传递数据?【英文标题】:HowtopassdatabetweenBottomNavigationfragments(orNavigationDrawer)?【发布时间】:2020-09-2419:12:29【问题描述】:我有一种情况,我在androiddev方面不够好,无法实现在底部导... 查看详情

如何使用数据库将大量数据从一个活动传递到android中的另一个活动

】如何使用数据库将大量数据从一个活动传递到android中的另一个活动【英文标题】:Howtopasslargesetofdatasfromoneactivitytoanotheractivityinandroidusingdatabase【发布时间】:2021-01-2023:46:38【问题描述】:我有一个json文件,其中包含大量数据... 查看详情

如何使用菜单按钮将数据从活动传递到android中的片段?

】如何使用菜单按钮将数据从活动传递到android中的片段?【英文标题】:Howtopassdatafromactivitytofragmentinandroidusingmenubutton?【发布时间】:2020-07-2011:59:03【问题描述】:我有这些活动:登录活动主活动个人资料活动MainActivity包含4个... 查看详情

如何在导航抽屉活动模板中的片段之间传递字符串变量

】如何在导航抽屉活动模板中的片段之间传递字符串变量【英文标题】:Howtopassstringvariablebetweenfragmentsinnavigationdraweractivitytemplate【发布时间】:2021-12-2807:49:04【问题描述】:告诉我如何在AndroidStudio4.0.1中的导航抽屉活动模板的... 查看详情

导航抽屉异步任务

...5-11-0603:04:35【问题描述】:我想公开我的问题,我想知道如何解决它。在我的应用程序中,我正在使用一个活动,进行简单的登录,启动一个asyncTask。在这个任务结束时,用户被重定向到另一个活动,这是应用程序的主活动。后... 查看详情

如何在不使用片段的情况下访问所有活动中的导航抽屉?

】如何在不使用片段的情况下访问所有活动中的导航抽屉?【英文标题】:Howtoaccessnavigationdrawerinallactivitieswithoutusingfragments?【发布时间】:2014-03-2907:27:47【问题描述】:我想在所有活动中访问导航抽屉。我不想使用片段。相反... 查看详情

想要使用片段从导航抽屉活动移动到另一个屏幕,以在所有屏幕上显示抽屉(代码片段)

我正在尝试最后两天在我的抽屉活动旁边添加片段,以便在整个应用程序中看到导航抽屉。我已尝试过stackoverflow和其他许多方法,但仍然没有成功。然后我必须从第一个片段移动到第二个片段,依此类推,直到需要导航抽屉。... 查看详情

如何将数据从活动传递到正在运行的服务

】如何将数据从活动传递到正在运行的服务【英文标题】:howtopassdatafromactivitytorunningservice【发布时间】:2017-09-2921:47:29【问题描述】:我想定期向服务器发送数据,为此我正在使用后台Service,但我想在数据更新时发送,以及我... 查看详情

如何将数据从一个活动传递到android中的另一个活动片段? [复制]

】如何将数据从一个活动传递到android中的另一个活动片段?[复制]【英文标题】:Howtopassdatafromoneactivitytootheractivityfragmentinandroid?[duplicate]【发布时间】:2018-04-2306:52:40【问题描述】:我已经将一些键和值数据从一个活动传递到另... 查看详情

如何将数据从main活动传递到另一个活动(代码片段)

我想将用户输入的名称和号码传递给我的Android应用程序中的FakeRinger类。我在putExtra()的意图中使用了fab.setOnClickListener方法。这是我在MainActivity中使用的代码publicclassMainActivityextendsAppCompatActivitypublicstaticfinalStringLOG_TAG="MainActivit 查看详情

导航抽屉活动:在按钮单击时从片段移动到片段

...重叠。当我点击按钮时,主页和幻灯片片段都会显示。我使用HomeFragment.java中的按钮从主页片段切换到幻灯片片段的代码public 查看详情