Android:单Activity多Fragment,Navigation实现Fragment跳转,Fragment之间通过ViewModel共享数据

news2025/1/12 2:57:43

单Activity多Fragment,Navigation实现Fragment跳转,Fragment之间通过ViewModel共享数据

  • 1、MainActivity
  • 2、HomeFragment, DetailFragment
    • 2.1、HomeFragment
    • 2.2、DetailFragment
  • 3、MyViewModel
  • 参考

1、MainActivity

1、activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/fragmentContainerView"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/nav_graph" />
</androidx.constraintlayout.widget.ConstraintLayout>

2、MainActivity

/**
 * kotlin_jetpack_navigation
 * 使用navigation  + dataBinding + viewModel
 * 三个fragment共享一个viewModel中的数据,在NavigationView中显示
 */
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

2、HomeFragment, DetailFragment

  • FragmentA:包括SeekBar和一个按钮,点击button跳转到FragmentB
  • FragmentB:SeekBar加一和减一操作的按钮,一个返回FragmentA的按钮,即经过加减操作以后,在FragmentA上显示加减的结果。

在这里插入图片描述
nav_graph.xml

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@id/homeFragment">

    <fragment
        android:id="@+id/detailFragment"
        android:name="cn.hk.navigation3.DetailFragment"
        android:label="fragment_detail"
        tools:layout="@layout/fragment_detail" >
        <action
            android:id="@+id/action_detailFragment_to_homeFragment"
            app:destination="@id/homeFragment" />
    </fragment>
    <fragment
        android:id="@+id/homeFragment"
        android:name="cn.hk.navigation3.HomeFragment"
        android:label="fragment_home"
        tools:layout="@layout/fragment_home" >
        <action
            android:id="@+id/action_homeFragment_to_detailFragment"
            app:destination="@id/detailFragment" />
    </fragment>
</navigation>

2.1、HomeFragment

在这里插入图片描述1、fragment_home.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="data"
            type="cn.hk.navigation3.MyViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".HomeFragment">


        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_begin="320dp"
            app:layout_constraintGuide_percent="0.5" />

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(data.number)}"
            android:textSize="20sp"
            app:layout_constraintBottom_toTopOf="@+id/guideline"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@+id/guideline" />

        <SeekBar
            android:id="@+id/seekBar"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toTopOf="@+id/textView"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

2、HomeFragment

class HomeFragment : Fragment() {


    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
//        val myViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
        val myViewModel by activityViewModels<MyViewModel>()
        val binding = DataBindingUtil.inflate<FragmentHomeBinding>(
            inflater, R.layout.fragment_home, container, false
        )
        binding.also {
            it.data = myViewModel
            it.lifecycleOwner = activity
            it.button.setOnClickListener { v ->
                val controller = Navigation.findNavController(v)
                controller.navigate(R.id.action_homeFragment_to_detailFragment)
            }
            myViewModel.get().value?.also { numberValue ->
                it.seekBar.progress = numberValue
            }
            it.seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
                override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) {
                   myViewModel.set(p1)
                }

                override fun onStartTrackingTouch(p0: SeekBar?) {
                }

                override fun onStopTrackingTouch(p0: SeekBar?) {
                }

            })
        }

        return binding.root
    }

2.2、DetailFragment

在这里插入图片描述1、fragment_detail.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="data"
            type="cn.hk.navigation3.MyViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".DetailFragment">


        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_begin="320dp"
            app:layout_constraintGuide_percent="0.5" />

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(data.number)}"
            android:textSize="20sp"
            app:layout_constraintBottom_toTopOf="@+id/guideline"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <Button
            android:id="@+id/add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="add"
            android:onClick="@{()->data.count(1)}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/jian"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@+id/guideline" />

        <Button
            android:id="@+id/jian"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="cut"
            android:onClick="@{()->data.count(-1)}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toEndOf="@+id/add"
            app:layout_constraintTop_toTopOf="@+id/guideline" />

        <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="返回"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/add" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

2、DetailFragment

class DetailFragment : Fragment() {


    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
//      val myViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
        val myViewModel by activityViewModels<MyViewModel>()
        val binding = DataBindingUtil.inflate<FragmentDetailBinding>(
            inflater,
            R.layout.fragment_detail,
            container,
            false
        )
        binding.also {
            it.data = myViewModel
            it.lifecycleOwner = activity
            it.button3.setOnClickListener { v ->
                val controller = Navigation.findNavController(v)
                controller.navigate(R.id.action_detailFragment_to_homeFragment)
            }
        }
        return binding.root
    }

}

3、MyViewModel

class MyViewModel : ViewModel() {
    var number: MutableLiveData<Int> = MutableLiveData(0)

    fun get() = number

    fun set(result: Int) {
        number.value = result
    }


    fun count(x: Int) {
        number.value = number.value?.plus(x)
        if (number.value!! < 0)
            number.value = 0
    }
}

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/24825.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ovs-vswitchd的启动分析

ovs-vswitchd的启动分析&#xff08;无修改源码&#xff09; &#xff08;一&#xff09;主要数据结构和概念了解 1.概念 在 OVS 中, 有几个非常重要的概念&#xff1a; Bridge: Bridge 代表一个以太网交换机&#xff08;Switch&#xff09;&#xff0c;一个主机中可以创建一…

Metabase学习教程:提问-4

Metabase中的表连接 如何在简单和自定义问题中使用查询编辑器连接Metabase中的表。 当涉及到分析数据时&#xff0c;必须要使用连接是一个事实&#xff0c;在Metabase&#xff0c;我们试图使您的问题的答案尽可能简单&#xff0c;即使这需要一些更复杂的策略。在本文中&#…

Spring中拦截器重复注册的问题排查

注册器JpushInterceptor 功能&#xff1a;新版的Java推送服务&#xff0c;将部分请求转发到老版node 查看日志发现拦截器日志重复 同一个链路&#xff0c;发现&#xff0c;经过同一个拦截器两次 debug发现注册器重复注册 第一个通过registry.addInterceptor注册 是通过We…

组合数学总结

文章目录三、递推关系3.1 常系数线性递推关系特征根法1.齐次递推关系2.非齐次方程母函数方法三、递推关系 3.1 常系数线性递推关系 k阶齐次递推关系&#xff1a;anc1an−1c2an−2...ckan−k0&#xff0c;ck≠0(3.1.1)k阶非齐次递推关系&#xff1a;anc1an−1c2an−2...ckan−kf…

SpringCloud微服务(四)——Nacos服务注册和配置中心

SpringCloud Alibaba Nacos服务注册和配置中心 Spring Cloud Netflix Projects Entering Mainterance Mode SpringCloud Alibaba&#xff1a; 服务限流降级&#xff1a;默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 Rocke…

在 UltraEdit v15.00 及更高版本中添加用于语法高亮的 wordfile丨使用教程

UltraEdit原生支持开箱即用的最常用编程和标记语言的语法突出显示。但是&#xff0c;我们也有数百个其他语言的单词文件&#xff0c;而且很容易找到并添加您需要的语言&#xff01;重要提示&#xff1a;此电源提示适用于运行 UltraEdit v15.00或 UEStudio v09.10及更高版本的用…

rosjava零散

笔者之前想在非ros环境下使用通信&#xff0c;了解到rosjava可以实现&#xff0c;不过后来换成了rosbridge&#xff0c;也搜集了一些rosjava的资料&#xff0c;放在这里供参考(没时间整理了&#xff0c;格式较乱请见谅) 安装方式&#xff1a;sudo apt-get install ros-indigo-…

Blind Backdoors in Deep Learning Models 论文笔记

#论文笔记# 1. 论文信息 论文名称Blind Backdoors in Deep Learning Models作者Eugene Bagdasaryan Vitaly Shmatikov Cornell Tech出版社USENIX Security Symposium 2021 &#xff08;网安A类会议&#xff09;pdf论文主页 本地PDF代码pytoch_Backdoors_101 2. introduction …

《第一行代码》核心知识点:Android简介

前言 自本文开始&#xff0c;我将更新《第一行代码 Android 第2版.pdf》&#xff0c;&#xff08;提取码&#xff1a;n5ag &#xff09; 核心要点系列&#xff0c;通过阅读本系列文章可以帮助有Android基础的开发人员&#xff0c;去除冗余的基础讲解&#xff0c;直击核心知识点…

GEE开发之Modis_ET数据分析和获取

GEE开发之Modis_ET数据获取1 ET(蒸散量)2 MOD16A2(500米/8天)2.1 MOD16A2下的所有指数2.2 ET影像获取和查看3 ET日数据下载(以MOD16A2为例)4 ET月数据下载(以MOD16A2为例)5 ET年数据下载(以MOD16A2为例)前言&#xff1a;主要介绍Modis下的ET数据的获取和下载&#xff08;日数据…

工厂模式【简单工厂+工厂+抽象工厂】总结

一、简单工厂模式 描述 简单工厂模式是属于创建型模式&#xff0c;又叫做静态工厂方法模式&#xff0c;但不属于23种GOF设计模式之一。简单工厂模式中专门定义一个简单工厂类来负责创建其他类的实例&#xff0c;被创建的实例通常都具有共同的父类。简单工厂类根据传入的参数&a…

wireshark工具详解、数据包抓取分析、使用教程

Wireshark界面 Wireshark查看数据捕获列表 数据包概要信息窗口&#xff1a;描述每个数据包的基本信息。如图&#xff0c;点击某行数据&#xff0c;即可在下方显示该数据包的信息。 1、数据包解析窗口&#xff1a;显示被选中的数据包的解析信息&#xff0c;包含每个数据包的整体…

通过request请求和servlet实现注册跳转界面案例及问题解决

案例&#xff1a;用户登录 * 用户登录案例需求&#xff1a; 1.编写login.html登录页面 username & password 两个输入框 2.使用Druid数据库连接池技术,操作mysql&#xff0c;day14数据库中user表 3.使用JdbcTemplate技术封装JDBC 4.登录成功跳转到Suc…

机器人操作系统ROS(19) 雷达和摄像头融合的资料

搜集的有关雷达和摄像头融合的资料。仅供参考&#xff1a; #1 传感器融合&#xff1a;激光雷达摄像头 摄像头产生的数据是2D图像&#xff0c;对于物体的形状和类别的感知精度较高。深度学习技术的成功起源于计算机视觉任务&#xff0c;很多成功的算法也是基于对图像数据的处理…

图神经网络 | Python基于图卷积的U-Net架构进行交通流量和速度的预测

图神经网络 | Python基于图卷积的U-Net架构进行交通流量和速度的预测 目录 图神经网络 | Python基于图卷积的U-Net架构进行交通流量和速度的预测效果分析基本描述程序实现核心概念参考资料效果分析 基本描述 此版本包含了训练和评估模型的代码,以预测Traffic4Cast挑战数据的交…

ssh-keygen和openssl的区别

OpenSSL OpenSSL是用于应用程序的软件库&#xff0c;该应用程序可保护计算机网络上的通信免遭窃听或需要识别另一方的身份&#xff0c;是SSL和TLS协议的开源实现。采用C语言作为开发语言&#xff0c;具备了跨平台的能力&#xff0c;支持Unix/Linux、Windows、Mac OS等多种平台…

力扣LeatCode算法题第9题-回文数

要求&#xff1a; //给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 //回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 //例如&#xff0c;1…

百世的数智化供应链凭何融入企业生命周期?

在供应链这个词出现前&#xff0c;供应链的本体就已经存在。 萨缪尔森说&#xff0c;现代经济生活的命脉是交换。当不同的物资、资金、信息在产业链上流动起来时&#xff0c;产业才能形成模型&#xff0c;经济才会有活力。然而&#xff0c;供应商增加、活动变多、地理距离拉长…

智慧气象解决方案-最新全套文件

智慧气象解决方案-最新全套文件一、建设背景二、建设架构传统气象所面临的挑战&#xff1a;1、气象数据大幅快速增长&#xff0c;导致计算能力不足2、人工智能应用不足&#xff0c;短临预报精度较低3、气象数据分散&#xff0c;数据融合困难4、气象服务方式单一&#xff0c;体验…

外卖项目04---菜品管理业务开发

效果展示: 目录 一、文件上传下载 50 1.1文件上传 50​编辑 1.2文件下载 1.3文件上传下载---文件上传代码实现1 1.4文件上传下载---文件上传代码实现2 1.5文件上传下载---文件下载代码实现 53 二、新增菜品 54 2.1需求分析 54 2.2数据模型 2.3新增菜品---代码开发--…