一 、背景

使用自定义DialogFragment实现弹窗效果时,边缘透明图片作为背景图片,依然存在不透明背景;

QQ截图20180428154111.png

修复后:

QQ截图20180428153910.png

二、实现

因为项目中多个地方使用到DialogFragment,所以稍作了一下封装:

import android.app.Dialog;

import android.graphics.Color;

import android.graphics.drawable.ColorDrawable;

import android.os.Bundle;

import android.support.annotation.Nullable;

import android.support.v4.app.DialogFragment;

import android.support.v7.app.AlertDialog;

import android.util.DisplayMetrics;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import butterknife.ButterKnife;

import butterknife.Unbinder;

/**

* Created by Ljt on 2018/4/27

*/

public abstract class BaseDislogFragment extends DialogFragment {

private boolean isShow = false;

private Unbinder unbinder;

public boolean isShow() {

return isShow;

}

public void setShow(boolean show) {

isShow = show;

}

/**

* 显示弹窗信息

* @param savedInstanceState

* @param builder

*/

protected abstract void displayDialog(Bundle savedInstanceState, AlertDialog.Builder builder);

/**

* 设置布局文件

* @return

*/

protected abstract int getLayoutId();

protected abstract boolean isCanceledOnTouchOutside();

protected abstract boolean isTransparent();

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

View rootView = super.onCreateView(inflater, container, savedInstanceState);

return rootView;

}

@Override

public void onStart() {

super.onStart();

if (isTransparent()) {

//设置背景半透明

DisplayMetrics dm = new DisplayMetrics();

getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);

getDialog().getWindow().setLayout(dm.widthPixels, getDialog().getWindow().getAttributes().height);

getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

}

//getDialog().setCancelable(false);//这个会屏蔽掉返回键

getDialog().setCanceledOnTouchOutside(isCanceledOnTouchOutside());

}

@Override

public Dialog onCreateDialog(Bundle savedInstanceState) {

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

LayoutInflater inflater = getActivity().getLayoutInflater();

final View view = inflater.inflate(getLayoutId(), null);

unbinder = ButterKnife.bind(this, view);

builder.setView(view);

displayDialog(savedInstanceState,builder);

return builder.create();

}

@Override

public void onDestroyView() {

super.onDestroyView();

unbinder.unbind();

}

public void dismissDialog() {

if (isShow) {

this.dismiss();

}

}

}

所以事实上,这里最终使用的还是使用onCreateDialog()方法返回AlertDialog来呈现自定义布局弹窗;

主要的实现背景透明效果,使用如下代码:

DisplayMetrics dm = new DisplayMetrics();

getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);

getDialog().getWindow().setLayout(dm.widthPixels, getDialog().getWindow().getAttributes().height);

getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

BaseDialogFragment的子类使用起来就只关注与具体差异的实现就好了:

import android.os.Bundle;

import android.support.v4.app.FragmentManager;

import android.view.View;

import android.widget.ImageView;

import android.widget.RelativeLayout;

import android.widget.TextView;

//这里删除了部分带有APP报名路径的类的导入

import butterknife.BindView;

/**

* Created by Ljt on 2018/4/26

*/

public class RewardDialogFragment extends BaseDislogFragment {

@BindView(R.id.img_reward_bg)

ImageView imgRewardBg;

@BindView(R.id.tv_reward_sum)

TextView tvRewardSum;

@BindView(R.id.tv_reward_receive)

TextView tvRewardReceive;

@BindView(R.id.rl_reward_content)

RelativeLayout rlRewardContent;

@BindView(R.id.img_reward_close)

ImageView imgRewardClose;

private Callback callback;

public interface Callback {

void onClose();

void onReceive();

}

public void setCallback(Callback pCallBack){

this.callback = pCallBack;

}

public void show(FragmentManager fragmentManager) {

if (this.isAdded())return;

show(fragmentManager, "RewardDialogFragment");

setShow(false);

Settings.setFirstReward(false);

}

@Override

protected void displayDialog(Bundle savedInstanceState, android.support.v7.app.AlertDialog.Builder builder) {

imgRewardClose.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if (callback != null)callback.onClose();

dismiss();

}

});

tvRewardReceive.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if (callback != null)callback.onReceive();

dismiss();

}

});

}

@Override

protected int getLayoutId() {

return R.layout.fragment_dialog_reward;

}

@Override

protected boolean isCanceledOnTouchOutside() {

return false;

}

@Override

protected boolean isTransparent() {

return true;

}

@Override

public void onDestroy() {

super.onDestroy();

callback = null;

}

}

!!!请确认当中的AlertDialog使用android.support.v7.app.AlertDialog下的;否则在Android 5.0以下版本,依然是不透明。

android fragment 设置透明,DialogFragment背景透明设置相关推荐

  1. android如何设置透明字体颜色,android TextView文字透明度跟背景透明度设置

    当前位置: 我的异常网 » Android » android TextView文字透明度跟背景透明度设置 android TextView文字透明度跟背景透明度设置 www.myexceptions ...

  2. Thress.js设置背景色及背景透明

    Thress.js默认背景 Thress.js默认背景色为黑色 设置Thress.js背景颜色 场景 想要自行定义Thress.js模型的背景颜色 实现 this.renderer = new THR ...

  3. html控件透明与背景透明

    html控件透明与背景透明 如何实现一个控件的半透明效果? IE中关于半透明和透明控件的一些说明 .大家在有些时候希望自己做的控件是半透明或透明的,就像半透明的窗体一样,我经过一段时间的查询,发现这个 ...

  4. 【最全IDEA个性化教程】idea设置主题+恢复主题默认设置+设置选中代码颜色+关键字颜色+设置字体大小、样式、颜色+设置背景颜色、图片+设置导航栏背景颜色+设置控制台字体样式及背景+常用快捷键)

    目录 下载设置主题样式+恢复主题默认设置 1 个性化代码段 1.1设置颜色 设置光标颜色 自定义图片做背景 修改代码段的颜色和背景颜色 选中代码块颜色修改,修改括号颜色 1.2 设置字体大小.格式 1 ...

  5. Android设置窗体Activity背景透明

    为什么80%的码农都做不了架构师?>>>    背景透明 style.xml <item name="android:windowBackground"&g ...

  6. Axure 教程 | 设置文本框背景透明

    在AXURE软件中,部件样式可以编辑,但有时却无法满足所有个性化原型的需求.例如文本框部件,可以设置是否隐藏边框,但即使隐藏边框之后,文本框还会有白色的背景. 当界面需要一个无背景色的输入框时,对于完 ...

  7. android textview背景透明度,Android TextView文字透明度和背景透明度设置

    textview1.setTextColor(Color.argb(255, 0, 255, 0)); //文字透明度 控件设为半透明: 控件名.getBackground().setAlpha(in ...

  8. Android手写签名 附带背景图设置

    android手写签名的demo网上其实有很多,但是大多没考虑到签名用在哪里的问题,所以就需要背景图设置,保存电子签名的时候  会连同背景图一起保存   这才达到了电子签名的效果,背景可以放置合同,请 ...

  9. 怎么给HTML文件加背景,设置文件夹背景,如何设置文件夹背景颜色

    电脑桌面的背景是可以进行自定义设置的,那么大家知道,电脑文件夹的背景也是可以进行设置和更换的吗?很多人的文件都是有背景的,这样看起来会非常的有个性,不会闲得很单调. 电脑的文件夹背景可以设置一些自己喜 ...

  10. C++ MFC深入详解之----设置控件背景透明

    首先要添加OnCtlColor函数 1.该函数在VC++中的添加方法为:快捷键Ctrl+W或右击空白处打开ClassWizard对话框(也可以菜单->view->ClassWizard), ...

最新文章

  1. Linux下代码运行不了?看这里设置环境变量
  2. Horticulture Research 模式图的手稿
  3. 蒙特卡洛积分与重要性采样详解
  4. 销售单据条件价格明细表
  5. read web.config
  6. C++ __gnu_pbds(hash,可并堆,平衡树)
  7. easyui树形菜单实现
  8. sap 供应商表_财务人员学习SAP的路线图
  9. LeetCode 2032. 至少在两个数组中出现的值(哈希/位运算)
  10. 如何用Apache POI操作Excel文件-----如何用Apache POI 画一个离散图
  11. UVa11988-破损的键盘 Broken Keyboard
  12. Oracle系列:(22)视图
  13. 禁用Windows 10系统更新
  14. Shopee Games 游戏引擎演进之路
  15. wordpress单独html页面,wordpress独立留言板页面
  16. 什么是模式、什么是模式识别、模式识别的方法、过程
  17. Qt示例程序打开失败,出现一个感叹号图标
  18. 片上总线学习之Wishbone
  19. 已解决NameError: name ‘XXX‘ is not defined
  20. openni2结构简介

热门文章

  1. 手机通讯录html模板,手机通讯录导模板
  2. 不错的Unity教程
  3. oa是计算机辅助系统吗,oa是管理系统吗
  4. 旅游信息管理系统的设计与实现
  5. HeapSnap工具原理及其应用
  6. vue zxing 实现一维码、二维码扫描可移动端h5使用代码亲测可用
  7. 小学生c语言编程入门教程_学生编程语言
  8. 苹果耳机无线真假测试软件,辨别苹果耳机真伪,看完这篇就够了
  9. C++数据结构之图的储存结构——十字链表
  10. 利用ajaxSubmit()实现Form表单submit()提交后的回调函数