当Fragment遇见PopWindow

2024-02-02 03:58
文章标签 fragment 遇见 popwindow

本文主要是介绍当Fragment遇见PopWindow,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述:

页签1控制Fragment1,页签2控制Fragmeng2。

Fragment1和Fragment2 上各有一个按钮,要求点击按钮弹出弹出框。

我们要求点击外部弹出框消失。

问题来了:当Fragment1 弹出popWindow 时,点击页签2,popwindow 消失了,但是fragment2没有切换。

原因:我们设置了setOutsideTouchable(true)。

什么意思呢,如何设置了了true,那么弹窗外的触摸事件将会分配给window。就是说导航签的触摸事件被window消费了,所以页签拿不到点击事件。

解决思路:

setOutsideTouchable(false)。那么并发症来了,当popwindow 处于showing状态时,点击页签外部都不生效。

事件是怎么传递的,我们能否自定义事件?

首先明白事件是怎么传递的:

事件由Activity--->Window-->DecorView-->ViewGroup-->View 一层一层分发下去。

ViewGrop 和View 的相同点是:都有dispathTouchEvent 和onTouchevent 方法。不同点是View 没有 onInterceptTouchEvent 方法。

灵感来了,我们可以在Activity的dispatchTouchEvent 中动手脚。

首先:popwindow的事件不会经过Activity 进行分发。

@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {int x = (int) ev.getRawX();//点击的x坐标int y = (int) ev.getRawY();//点击的y坐标if (fragment1!= null) {if (fragment1.mPopWindow != null && fragment1.mPopWindow.isShowing()) {fragment1.mPopWindow.dismiss();//是否点击当行页签if (clickInBottomButton(x, y)) {//事件交由actiivty分发处理,最终会默认达到页签return super.dispatchTouchEvent(ev);} else {//事件不进行分发,如:我们不希望点击fragment1中列表中item,进行页面跳转return false;}}}if (fragment2!= null) {if (fragment2.mPopWindow != null && fragment2.mPopWindow.isShowing()) {fragment2.mPopWindow.dismiss();if (clickInBottomButton(x, y)) {return super.dispatchTouchEvent(ev);} else {return false;}}}return super.dispatchTouchEvent(ev);}

点击排除区域:

RadioButton radioButton1 = findViewById(R.id.radio_button1);
private Rect fragment1ButtonReact= new Rect();
radioButton1.getGlobalVisibleRect(fragment1ButtonReact);//获取底部按钮区域
 /****排除点击区域* @param x* @param y* @return*/public boolean clickInBottomButton(int x, int y) {if (clickInRect(x, y, fragment1ButtonReact)) {return true;}if (clickInRect(x, y, fragment2ButtonReact)) {return true;}return false;}

 

这篇关于当Fragment遇见PopWindow的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/669400

相关文章

ViewPager+fragment实现切换页面(一)

如今的很多应用中都是下面有一排按钮,点击可以切换页面,滑动也可以切换页面。下面就来简单的实现这个功能。 思路 首先肯定是会用到viewpager这个控件,为了能够向下兼容,最好用v4包下的viewpager,Activity要继承FragmentActivity 其次用一个集合来存储所有的fragment页面在设置viewpager的适配器时,把存储fragment页面的list集合传入ada

安卓中的fragment与viewPager的使用问题的解决

最近使用viewPager,结合fragment使用,发现fragment的周期将不符合他的原有的周期流程,多个fragment将会产生错位问题。       通过研究相关代码,发现fragment的切换实际调用的函数为setUserVisibleHint,通过在其中重写方法,将会达到fragment正确切换的效果。       public void setUserVisible

Kafka 已落伍,转角遇见 Pulsar!

自 LinkedIn 2011 年创建了 Apache Kafka 后,这款消息系统一度成为大规模消息系统的唯一选择。为什么呢?因为这些消息系统每天需要传递数百万条消息,消息规模确实很庞大(2018 年 Twitter 推文平均每天 500 万条,用户数平均每天为 1 亿)。那时,我们没有 MOM 系统来处理基于大量订阅的流数据能力。所以,很多大牌公司,像 LinkedIn、Yahoo、Twit

Activity被回收导致其内部的Fragment

方式一:   MainActivity重写onSaveInstanceState方法,将super.onSaveInstanceState(outState);注释掉,让其不再保存Fragment的状态,达到其随着MainActivity一起被回收的效果! 方式二: @Overrideprotected void onSaveInstanceState(Bundle outSta

删除文件夹遇见错误0x80070091目录不是空的

用java代码转移文件夹的时候发生了一点错误,导致递归生成了很多文件夹,删除文件夹的时候遇见错误0x80070091目录不是空的 有点恐慌,不会被我搞坏了吧。 一开始以为是权限问题,用命令"rd /s /q xxx"强删也不行。重启电脑再删除还是报这个错误。 搜了一下,看见有说往最后一个文件夹放一个txt文件,再删除就可以了。 用java程序放了一个(代码星火写的) import jav

Android - 总结Activity与Fragment打开的时候获取组件的大小

Activity中获取 组件大小        代码: @Overridepublic void onWindowFocusChanged(boolean hasFocus) {// TODO Auto-generated method stubsuper.onWindowFocusChanged(hasFocus);Log.d("TAG", "A-button1-->"+button1);L

fragment懒加载问题

public class LazyBaseFragment extends BasePermissionFragment {private boolean mHasLoadedOnce = false;//子类重写该方法 进行懒加载public void onLazyLoad() {}private boolean isLazy;/** * 请用viewPager第1个fragment

Android基础——Fragment详解

文章目录 1 Fragment的产生与介绍1.1 Fragment的生命周期1.2 Fragment的生命周期分析 2 Fragment的使用2.1 静态使用Fragment2.2动态使用Fragment 3 Fragment的管理3.1 FragmentManager3.2 FragmentTransaction3.3 Fragment间传递参数 1 Fragment的产生与介

android面试:Fragment 和 Activity 有什么区别?它们之间又有什么关系?

在Android开发中,Fragment和Activity是两个重要的组件,它们各自有不同的特性和用途。 区别 定义: Activity:是一个用户界面组件,代表一个单一的屏幕,用户可以与之交互。每个Activity都有自己的生命周期。Fragment:是一个可重用的UI组件,通常是Activity的一部分。Fragment可以在Activity中嵌套和组合,允许更灵活的UI设计。 生命周

Android 动态更新Viewpager+fragment完美解决方案

最近遇到个问题,一直没有找到很好的解决方案,今天终于解决了。 Viewpager嵌套多个Fragment 现在我要改变fragment中的数据。 这个非常的简单,网上有很多答案都能解决。 改变Viewpager的数量,也就是说我要动态的增加或者删除Viewpager的页面数量。 这个就非常操蛋了。 查遍资料,才找到解决办法。写下来备忘。 从FragmentPagerAdapter的运行机制