Android 首页实时浮窗(动态设置Margin)以及本人体验inflate的各种坑(方式广播重复绘制)

35 篇文章 0 订阅

首先在我们日常开发中会经常遇到给某某页面添加一个实时的浮窗(给你一个开始时间与结束时间,点击叉号第二天再展示),时间判断这里就就不说了以前的博客里面有,那么我们就需要添加一个布局了我的一开始是怎么做的

本人错误1.
直接插入布局 如果数据不是实时也无所谓,但是数据是实时的,就会出现一个问题就是,在前后台切换时第二次切换回来广播通知展示但是点击事件会出现无效的现象(本人推测可以能是需要添加一个容器来addview)

View inflate = LayoutInflater.from(getActivity()).inflate(com.sina.weibo.sdk.R.layout.floating_window_views, this);

本人错误2.
那么好既然这样不好使我试试用getWindow().getDecorView().getRootView()(Window)
会不会出现点击事件无效,这回呢 点击事件可以好嘛 ! 见到太阳了 但是又会出现布局移动不了(这个时候布局的操作基本无效)的问题那就得用LayoutParams了呗在动态的设置Margin 请看代码2. 这次可以移动了当前手机也移动到了想要的位置但是还是不行换成其他手机位置偏了

代码1.

View rootView = getActivity().getWindow().getDecorView().getRootView();
ViewGroup contentView = getActivity().findViewById(android.R.id.content);
View inflate = LayoutInflater.from(getActivity()).inflate(com.sina.weibo.sdk.R.layout.floating_window_views, null);
contentView.removeView(inflate);

代码2.

View rootView = getActivity().getWindow().getDecorView().getRootView();
ViewGroup contentView = getActivity().findViewById(android.R.id.content);
View inflate = LayoutInflater.from(getActivity()).inflate(com.sina.weibo.sdk.R.layout.floating_window_views, null);
LinearLayout.LayoutParams param=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
param.setMargins(10,1700,10,10);
contentView.removeView(inflate,param);

本人错误3.
换手机位置就会偏这个时候就要进行动态的获取屏幕的高度减去buttonbar了这回位置可以了但是还会出现一个问题就是这个浮窗啊 不仅在首页也显示 在其他页面还显示崩溃了这是个啥

View rootView = getActivity().getWindow().getDecorView().getRootView();
ViewGroup contentView =rootView.findViewById(android.R.id.content);
View inflate = LayoutInflater.from(getActivity()).inflate(com.sina.weibo.sdk.R.layout.floating_window_views, null);
LinearLayout.LayoutParams param=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
Display display = getActivity().getWindowManager().getDefaultDisplay();
            int height = display.getHeight();
            param.setMargins(10,height-350,10,10);
 contentView.addView(inflate,param);
          

经历来四次悲伤
最终代码
解决方式 首先删除View rootView = getActivity().getWindow().getDecorView().getRootView();
然后就是判断上下文 全部问题解决
//如果彻底解决布局重叠问题需要判断布局是否创建如果inflate

  if (TAGS == 0) {
            TAGS = 1;
 ViewGroup contentView = getActivity().findViewById(android.R.id.content);
 if(inflate!=null){
   inflate = LayoutInflater.from(getActivity()).inflate(com.sina.weibo.sdk.R.layout.floating_w
 }else{
    contentView.removeView(inflate);
 }
indow_views, null);
            LinearLayout.LayoutParams param=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            Display display = getActivity().getWindowManager().getDefaultDisplay();
            int height = display.getHeight();
            param.setMargins(10,height-350,10,10);
            //获取图片id
            floating_img = inflate.findViewById(R.id.floating_img);
            //叉号
            close_window_img = inflate.findViewById(R.id.close_window_img);
            //浮窗
            small_window_layout = inflate.findViewById(R.id.small_window_layout);
            //根据服务端显示或者隐藏首页浮窗
            rel_img = inflate.findViewById(R.id.Rel_img);
            //获取sp里面存储的json数据
            String json = SharePrefManager.getDefaultSystemInstance(getContext()).getString(KEY_VISITOR_GUIDE_JSON_DATAS, "");
            //只在首页模块展示
            if (getActivity() instanceof HomeActivity && getContext() instanceof HomeActivity){
                contentView.addView(inflate,param);
            }else {
                contentView.removeView(inflate);
            }
            //天际小叉号逻辑(一天内不进行展示)
            close_window_img.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View view) {
                    //是否点击差号
                    SharePrefManager.getDefaultSystemInstance(getContext()).putBoolean(KEY_ISCHECKOUT_WONDOW_CAHAHAO, true);
                    //点击时存入时间
                    long currentTime = System.currentTimeMillis();
                    SharePrefManager.getDefaultSystemInstance(getContext()).putLong(KET_CANCEL_TIME_WINDOW, currentTime);//记住cancel时间
                    //在这里用sp进行记录是否关闭
                    rel_img.setVisibility(GONE);
                    close_window_img.setVisibility(GONE);
                     //为力浮窗实时效果需要用广播监听前后台设置tag来防止重复绘制
                    TAGS = 0;
                    inflate=null;
                }
            });
    }

最后多一句嘴就是当广播走到的时候会进行再次绘制这样你的布局就会叠加这个时候你需要设置一个变量,默认等一0当进入方法的时候就将变量的变成1当点击事件点击完成后设置为0
private static int TAGS = 0;
if(TAGS==0){
TAGS=1;
why.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View view) {
代表执行完毕
TAGS=0;
}
}
}

不要用启动模式或者加锁没有用的
886

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王鑫林呀!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>