我的 Android 应用程序中有一项 Activity 可处理多个 View /fragment 的替换。此 Activity 还有一个抽屉导航,用于导航到顶级 fragment 。您可以从顶级 fragment 导航到详细 fragment 。
始终可以通过从左侧滑入来访问抽屉导航。如果当前 fragment 是顶级 fragment ,抽屉导航也可以通过操作栏访问。如果当前 fragment 是细节级 fragment ,您可以通过操作栏(或按后退按钮)向后导航。
假设我有 3 个可以通过抽屉导航访问的顶级 fragment 。
fragment [1], fragment [2], fragment [3]
从 fragment[1],您可以导航到详细级别 fragment[1.1]。
现在用户想要从当前 fragment[1.1] 直接导航到顶级 fragment[3]。用户只需在抽屉导航中滑动并单击 fragment[3] 的项目。
现在,如果用户点击后退按钮,应用程序应该关闭(因为它导航到顶级 fragment )。因此,每次用户导航到顶级 fragment 时,都应清除后台堆栈。为了检查我是否应该显示抽屉指示器,我正在读取 getBackStackEntryCount() 值并将其与 0 进行比较。
作为总结。我想从细节级 fragment 导航到任何顶级 fragment 并清除后台堆栈。
问题:
当我通过执行
清除后台堆栈时
getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);,
fragment 事务被反向重放(例如,将 fragment[1] 替换为 fragment[1.1])。而且我不希望它们被重播。我在onCreateView,onViewCreated,onStart,..中有很多初始化,还启动了获取数据的任务。我想跳过这一切。只需将详细级别 View 替换为一个新的顶层 View ,该顶层 View 还不在后台堆栈中。
我找不到任何解决方案来清除后台堆栈而不弹出事务。
有没有一个干净的解决方案来处理这个问题?我是否必须实现自己的 backstack-behavior?
编辑: YouTube 应用程序的行为也是如此。当您从细节导航到顶层时,后台堆栈将被清除。但是他们如何在不重放 fragment 事务的情况下清除后台堆栈?
感谢您的回答。
最佳答案
我认为你的问题是你在循环中弹出 fragment - 我猜。我通常将 fragment 插入 fragment 堆栈并指定自定义动画 - 比如说从右侧滑入新 fragment ,弹出它时我们会向右滑出。现在 - 如果您的用户已导航到 fragment 1,然后是 1.1,然后是 1.2 等,并且您希望在用户单击操作栏中的主页按钮时导航回 1 - 为您的 fragment 1 事务指定一个名称。您执行弹出操作时使用该名称。还可以考虑使用 popBackStack 函数而不是 popBackStackImmediate。
关于android - 清除后台堆栈并用顶级 fragment 替换当前 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23341648/
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
如何找到调用此方法的位置?defto_xml(options={})binding.pryoptions=options.to_hifoptions&&options.respond_to?(:to_h)serializable_hash(options).to_xml(options)end 最佳答案 键入caller。这将返回当前调用堆栈。文档:Kernel#caller.例子[0]%rspecspec10/16|===================================================62=====
两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio
我是ruby的新手,我认为重新构建一个我用C#编写的简单聊天程序是个好主意。我正在使用Ruby2.0.0MRI(Matz的Ruby实现)。问题是我想在服务器运行时为简单的服务器命令提供I/O。这是从示例中获取的服务器。我添加了使用gets()获取输入的命令方法。我希望此方法在后台作为线程运行,但该线程正在阻塞另一个线程。require'socket'#Getsocketsfromstdlibserver=TCPServer.open(2000)#Sockettolistenonport2000defcommandsx=1whilex==1exitProgram=gets.chomp
假设我在Store的模型中有这个非常简单的方法:defgeocode_addressloc=Store.geocode(address)self.lat=loc.latself.lng=loc.lngend如果我想编写一些不受地理编码服务影响的测试脚本,这些脚本可能已关闭、有限制或取决于我的互联网连接,我该如何模拟地理编码服务?如果我可以将地理编码对象传递到该方法中,那将很容易,但我不知道在这种情况下该怎么做。谢谢!特里斯坦 最佳答案 使用内置模拟和stub的rspecs,你可以做这样的事情:setupdo@subject=MyCl
我有很多这样的文档:foo_1foo_2foo_3bar_1foo_4...我想通过获取foo_[X]的所有实例并将它们中的每一个替换为foo_[X+1]来转换它们。在这个例子中:foo_2foo_3foo_4bar_1foo_5...我可以用gsub和一个block来做到这一点吗?如果不是,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但我觉得有一些正则表达式技巧值得学习。 最佳答案 我(完全)不懂Ruby,但类似这样的东西应该可以工作:"foo_1foo_2".gsub(/(foo_)(\d+)/