当前位置: 首页 > ops >正文

kotlin - 2个Activity实现平行视图,使用SplitPairFilter

kotlin - 2个Activity实现平行视图,使用SplitPairFilter

一、创建API33的平板模拟器才支持
二、这是代码实现,也可以使用xml实现,参考官网(连接VPN):
1、(底部使用 activity 嵌入和 Material Design 构建列表-详情布局)https://developer.android.com/develop/ui/views/layout/activity-embedding?hl=zh-cn
2、(demo)https://developer.android.com/codelabs/large-screens/activity-embedding?hl=zh-cn#4

导入:
implementation 'androidx.window:window:1.2.0'
implementation 'androidx.startup:startup-runtime:1.2.0'    

AndroidManifest.xml添加:
<property
android:name="android.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED"
android:value="true" />

<provider android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false">
<!-- SplitInitializer的文件下的包名和applicationId配置不一样了. -->
<meta-data android:name="com.example.androidkotlindemo2.pad.parallet2.SplitInitializer"
android:value="androidx.startup" />
</provider>

使用打开:

startActivity(Intent(this, ParalletListActivity::class.java))

package com.example.androidkotlindemo2.pad.parallet
import android.content.Intent
import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.ListView
import androidx.appcompat.app.AppCompatActivity
import com.example.androidkotlindemo2.R/*** Author : wn* Email : maoning20080809@163.com* Date : 2025/8/31 14:21* Description :*/
class ParalletListActivity : AppCompatActivity() {private lateinit var listView: ListViewoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.parallet_activity_list)// 初始化分屏管理器ParalletSplitManager.create(this)listView = findViewById(R.id.listView)val items = mutableListOf<String>()for(i in 0..20){items.add("Item ${i}")}val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, items)listView.adapter = adapterlistView.setOnItemClickListener { _, _, position, _ ->val intent = Intent(this, ParalletDetailActivity::class.java).apply {putExtra("ITEM_ID", position)}startActivity(intent)}}
}

package com.example.androidkotlindemo2.pad.paralletimport android.content.ComponentName
import android.content.Context
import android.content.Intent
import androidx.window.embedding.*/*** Author : wn* Email : maoning20080809@163.com* Date : 2025/8/31 14:10* Description :*/
//在Application#onCreate方法中调用
class ParalletSplitManager {companion object {fun create(context: Context) {//创建一个分屏对过滤器,将 ListActivity 和 DetailActivity 标识为共享分屏的 activityval splitPairFilter = SplitPairFilter(ComponentName(context, ParalletListActivity::class.java),ComponentName(context, ParalletDetailActivity::class.java),null)//将过滤条件添加到过滤条件集val filterSet = setOf(splitPairFilter)//为分屏创建布局属性val splitAttributes = SplitAttributes.Builder().apply {setSplitType(SplitAttributes.SplitType.ratio(0.20f))setLayoutDirection(SplitAttributes.LayoutDirection.LEFT_TO_RIGHT)}.build()//构建分屏对规则val splitPairRule = SplitPairRule.Builder(filterSet).apply {setDefaultSplitAttributes(splitAttributes)setMaxAspectRatioInPortrait(EmbeddingAspectRatio.ratio(1.5f))setMinWidthDp(540)setMinSmallestWidthDp(460)// 主Activity随副Activity一起finishsetFinishPrimaryWithSecondary(SplitRule.FinishBehavior.ALWAYS)// 副Activity随主Activity一起finishsetFinishSecondaryWithPrimary(SplitRule.FinishBehavior.ALWAYS)setClearTop(true)}.build()//获取 WindowManager RuleController 的单例实例并添加规则val ruleController = RuleController.getInstance(context)ruleController.addRule(splitPairRule)//创建占位规则val placeholderActivityFilter = ActivityFilter(ComponentName(context, ParalletListActivity::class.java),null)val placeholderActivityFilterSet = setOf(placeholderActivityFilter)val splitPlaceholderRule = SplitPlaceholderRule.Builder(placeholderActivityFilterSet,Intent(context, ParalletPlaceholderActivity::class.java)).apply {setDefaultSplitAttributes(splitAttributes)setMaxAspectRatioInPortrait(EmbeddingAspectRatio.ratio(1.5f))setMinWidthDp(540)setMinSmallestWidthDp(460)setFinishPrimaryWithPlaceholder(SplitRule.FinishBehavior.ALWAYS)}.build()ruleController.addRule(splitPlaceholderRule)//创建拒绝分屏activity规则val summaryActivityFilter = ActivityFilter(ComponentName(context, ParalletSummaryActivity::class.java),null)val summaryActivityFilterSet = setOf(summaryActivityFilter)val activityRule =ActivityRule.Builder(summaryActivityFilterSet).setAlwaysExpand(true).build()ruleController.addRule(activityRule)}}
}

package com.example.androidkotlindemo2.pad.paralletimport android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.example.androidkotlindemo2.R/*** Author : wn* Email : maoning20080809@163.com* Date : 2025/8/31 14:22* Description :*/
class ParalletDetailActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.parallet_activity_detail)val itemId = intent.getIntExtra("ITEM_ID", 0)val textView = findViewById<TextView>(R.id.textView)textView.text = "Details for Item $itemId"}
}

package com.example.androidkotlindemo2.pad.paralletimport android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.example.androidkotlindemo2.R/*** Author : wn* Email : maoning20080809@163.com* Date : 2025/8/31 14:22* Description :*/
class ParalletPlaceholderActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.parallet_activity_placeholder)val textView = findViewById<TextView>(R.id.textView)textView.text = "Placeholder Activity"}
}

package com.example.androidkotlindemo2.pad.paralletimport android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.example.androidkotlindemo2.R/*** Author : wn* Email : maoning20080809@163.com* Date : 2025/8/31 14:23* Description :*/
class ParalletSummaryActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.parallet_activity_summary)val textView = findViewById<TextView>(R.id.textView)textView.text = "Summary Activity - Always Expanded"}
}

parallet_activity_list.xml布局:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:app="http://schemas.android.com/apk/res-auto"android:orientation="horizontal"><ListViewandroid:id="@+id/listView"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toStartOf="@+id/parallet_list_divide"/><TextViewandroid:id="@+id/parallet_list_divide"android:layout_width="6dp"android:layout_height="match_parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toTopOf="parent"android:background="@color/blue"/>
</androidx.constraintlayout.widget.ConstraintLayout>

parallet_activity_detail.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"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="@color/red"android:textSize="30sp" /></LinearLayout>
parallet_activity_placeholder.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:background="#E0E0E0"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="24sp" /></LinearLayout>

parallet_activity_summary.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:background="#FFF9C4"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="24sp" /></LinearLayout>

http://www.xdnf.cn/news/19259.html

相关文章:

  • 网络流量分析——使用Wireshark进行分析
  • Shell脚本编程——变量用法详解
  • Ruoyi-vue-plus-5.x第二篇MyBatis-Plus数据持久层技术:2.2 分页与性能优化
  • DAY17-新世纪DL(DeepLearning/深度学习)战士:Q(机器学习策略)2
  • AI 应用 图文 解说 (二) -- 百度智能云 ASR LIM TTS 语音AI助手源码
  • 自定义AXI_PWM_v1.0——ZYNQ学习笔记15
  • Spring Task快速上手
  • Maven学习笔记01
  • 【stm32】对射式红外传感器计次以及旋转编码器计次
  • SpringBoot 自研运行时 SQL 调用树,3 分钟定位慢 SQL!
  • 用产品经理的思维,重构AI时代的增长Playbook
  • 企业数据湖:从混沌到秩序的分层设计与治理策略
  • 11.1.5 实现文件删除,共享和共享下载排行榜
  • 分布式测试平台ITP:让自动化测试更高效、更稳定
  • SW - 用装配图的方式组合多个子零件然后转换成为零件,可维护性好
  • 组件通信终极指南:从Props Drilling到Context API
  • react-virtualized React 应用中高效渲染大型列表和表格数据的库
  • 扣子(coze)实践指南进阶篇——创建工作流,并将工作流接入智能体
  • 2025年8月个人工作生活总结
  • [Windows] 某音下载工具——自用
  • Selenium 等待机制:编写稳定可靠的自动化脚本
  • Kubernetes中kubeadm、kubectl、kubelet的区别与作用
  • 动态规划入门(三):一些经典动态规划模型
  • arnold图像加密(猫脸变换)
  • 一个从7zip中分离出来的高压缩比文本压缩工具ppmd
  • 文件系统深度解析:从核心概念到代码实践
  • 【MLLM】多模态理解Ovis2.5模型和训练流程(更新中)
  • 手写MyBatis第43弹:插件拦截原理与四大可拦截对象详解
  • Shell脚本编程入门:从基础语法到流程控制
  • USB4 vs USB3.0:一场接口技术的革命性飞跃