NormalDialogFragmentDemo【普通页面的DialogFragment】
版权声明:本文为HaiyuKing原创文章,转载请注明出处!
前言
该Demo主要演示DialogFragment作为普通页面,显示全屏和状态栏下方的效果以及动画效果。
效果图
代码分析
@Override
public void onStart() {
super.onStart(); if(mTag.equals(TAG_FULLSCREEN)){//全屏显示
//设置对话框的宽高,必须在onStart中
Window window = this.getDialog().getWindow();
window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);//全屏(盖住状态栏)
window.setGravity(Gravity.BOTTOM);//设置在底部
//打开的动画效果--从底部向上
window.setWindowAnimations(R.style.bottomsheetdialog_animation);
}else{
//从我的场景列表界面中设置按钮打开的
//设置对话框的宽高,必须在onStart中
DisplayMetrics metrics = new DisplayMetrics();
this.getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
Window window = this.getDialog().getWindow();
if(getStatusBarHeight(mContext) <= 96){
window.setLayout(metrics.widthPixels, metrics.heightPixels - getStatusBarHeight(mContext));
}else{
window.setLayout(metrics.widthPixels, this.getDialog().getWindow().getAttributes().height);//适配红米6pro
}
window.setGravity(Gravity.BOTTOM);//设置在底部
//打开的动画效果--从底部向上
window.setWindowAnimations(R.style.bottomsheetdialog_animation);
}
}
使用步骤
一、项目组织结构图
注意事项:
1、 导入类文件后需要change包名以及重新import R文件路径
2、 Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖
二、导入步骤
因为这个demo不是封装某个功能,所以这里只是简单说一下关键的文件。
PreviewDialog文件
package com.why.project.normaldialogfragmentdemo.dialog; import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.WebView;
import android.webkit.WebViewClient; import com.why.project.normaldialogfragmentdemo.R; /**
* Created by HaiyuKing
* Used
*/ public class PreviewDialog extends BaseDialogFragment{
private static final String TAG = PreviewDialog.class.getSimpleName(); public static final String TAG_FULLSCREEN = "fullScreen";//全屏
public static final String TAG_BELOWSTATUEBAR = "belowStatusBar";//状态栏下方 /**View实例*/
private View myView;
/**context实例*/
private Context mContext;
/**标记:用来代表是从哪个界面打开的这个对话框*/
private String mTag; private WebView mWebView; public static PreviewDialog getInstance(Context mContext, Bundle bundle)
{
PreviewDialog previewDialog = new PreviewDialog();
previewDialog.mContext = mContext;
return previewDialog;
} @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_NoTitleBar_Fullscreen);//全屏(在状态栏底下)
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(0));//设置背景为透明,并且没有标题
getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏
//设置窗体全屏
getDialog().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); myView = inflater.inflate(R.layout.dialog_preview, container, false);
/*this.getDialog().setOnKeyListener(new DialogInterface.OnKeyListener()
{
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event){
if (keyCode == KeyEvent.KEYCODE_BACK) {
LogUtil.w(TAG, "onKey");
dismiss();
return true; // return true是中断事件,那么下面的就接受不到按键信息了
}else
{
return false; //在return false的时候 才会事件继续向下传递。
}
}
});*/
return myView;
} @Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
//初始化控件以及设置
initView();
//初始化数据
initDatas();
initEvents();
} /**
* 设置宽度和高度值,以及打开的动画效果
*/
@Override
public void onStart() {
super.onStart(); if(mTag.equals(TAG_FULLSCREEN)){//全屏显示
//设置对话框的宽高,必须在onStart中
Window window = this.getDialog().getWindow();
window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);//全屏(盖住状态栏)
window.setGravity(Gravity.BOTTOM);//设置在底部
//打开的动画效果--从底部向上
window.setWindowAnimations(R.style.bottomsheetdialog_animation);
}else{
//从我的场景列表界面中设置按钮打开的
//设置对话框的宽高,必须在onStart中
DisplayMetrics metrics = new DisplayMetrics();
this.getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
Window window = this.getDialog().getWindow();
if(getStatusBarHeight(mContext) <= 96){
window.setLayout(metrics.widthPixels, metrics.heightPixels - getStatusBarHeight(mContext));
}else{
window.setLayout(metrics.widthPixels, this.getDialog().getWindow().getAttributes().height);//适配红米6pro
}
window.setGravity(Gravity.BOTTOM);//设置在底部
//打开的动画效果--从底部向上
window.setWindowAnimations(R.style.bottomsheetdialog_animation);
}
} /**获取状态栏的高度*/
private int getStatusBarHeight(Context context) {
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
return context.getResources().getDimensionPixelSize(resourceId);
}
@Override
public void onDestroy()
{
//销毁webview控件
mWebView.removeAllViews();
mWebView.destroy();
super.onDestroy();
} /**实例化控件*/
private void initView() {
mWebView = myView.findViewById(R.id.web_view);
mWebView.setWebViewClient(new WebViewClient() {
/**
* 重写此方法表明点击网页内的链接由自己处理,而不是新开Android的系统browser中响应该链接。
*/
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url) {
//webView.loadUrl(url);
return false;
}
});
}
/**
* 初始化数据:tag标记、标题
*/
private void initDatas() {
mTag = this.getTag(); mWebView.loadUrl("http://www.baidu.com");
} /**
* 初始化监听事件
*/
private void initEvents() { } @Override
public void dismiss() {
super.dismiss();
} }
动画效果
三、使用方法
package com.why.project.normaldialogfragmentdemo; import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button; import com.why.project.normaldialogfragmentdemo.dialog.PreviewDialog; public class MainActivity extends AppCompatActivity { private Button btn_open_full;
private Button btn_open; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initViews();
initEvents();
} private void initViews() {
btn_open_full = findViewById(R.id.btn_open_full);
btn_open = findViewById(R.id.btn_open);
} private void initEvents() {
btn_open_full.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//打开预览界面
Bundle bundle = new Bundle();
PreviewDialog previewDialog = PreviewDialog.getInstance(MainActivity.this,bundle);
previewDialog.show(getSupportFragmentManager(),PreviewDialog.TAG_FULLSCREEN);
}
}); btn_open.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//打开预览界面
Bundle bundle = new Bundle();
PreviewDialog previewDialog = PreviewDialog.getInstance(MainActivity.this,bundle);
previewDialog.show(getSupportFragmentManager(),PreviewDialog.TAG_BELOWSTATUEBAR);
}
});
}
}
混淆配置
无
参考资料
暂时空缺
项目demo下载地址
https://github.com/haiyuKing/NormalDialogFragmentDemo
NormalDialogFragmentDemo【普通页面的DialogFragment】的更多相关文章
- JS魔法堂:定义页面的Dispose方法——[before]unload事件启示录
前言 最近实施的同事报障,说用户审批流程后直接关闭浏览器,操作十余次后系统就报用户会话数超过上限,咨询4A同事后得知登陆后需要显式调用登出API才能清理4A端,否则必然会超出会话上限. 即使在页面 ...
- JavaScript写在Html页面的<head></head>中
JavaScript写在Html页面的<head></head>中 ----------------- <html> <head> <style ...
- 如何将页面的<br/>在Excel中正确换行
在页面的<br />导致导出Excel中是会以多行的方式显示,达不到页面在一个单元格中进行换行,为此我们有以下两种方式: 1.CSS样式方式 <br style='mso-data- ...
- Form提交是会刷新页面的
今天发现如果页面中有form,点击提交按钮是会刷新页面的,为了禁止页面刷新行为,可以这么做: <form class="form-horizontal" id="u ...
- CSS3-基于浮动的布局,响应式WEB设计,定位网页上的元素,设计打印页面的css技术
基于浮动的布局: 1.除非图片设置了宽度,否则始终应该要对浮动的图片设置一个宽度,这样可以让浏览器给其他内容腾出环绕的空间 2.当侧边栏的高度与主内容区的高度不一致的时候,可以用个margin进行调整 ...
- html页面的head标签下
head区是指首页html代码的<head>和</head>之间的内容. 必须加入的标签 1.公司版权注释 <!--- the site is designed b ...
- javascript 如何访问 action或者controller 传给 jsp 页面的值
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...
- 将ECSHOP会员注册页面的Email修改成非必填项
将ECSHOP会员注册页面的Email修改成非必填项 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2011-07-29 有人说,在后台的 “会员注册项设置 ”里面 ...
- [BS-10] 统一设置app所有页面的“返回”按钮样式
统一设置app所有页面的“返回”按钮样式 如果想统一设置app所有页面的“返回”按钮样式,首先自定义WZNavigationController类继承UINavigationController类,然 ...
随机推荐
- python3[爬虫实战] 使用selenium,xpath爬取京东手机
使用selenium ,可能感觉用的并不是很深刻吧,可能是用scrapy用多了的缘故吧.不过selenium确实强大,很多反爬虫的都可以用selenium来解决掉吧. 思路: 入口: 关键字搜索入口 ...
- Python eval 函数妙用
eval 功能:将字符串str当成有效的表达式来求值并返回计算结果. 语法: eval(source, globals, locals) -> value 参数: source:一个Python ...
- 如何把word中的图片怎么导出来呢?
在办公使用word的过程中你可能经常会遇到这个问题:插入到word中的图片找不到导出来的方法,是不是很郁闷呢,别急,今天咱们研究一下把word中的图片导出来的方法(把"我的"变成你 ...
- BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法
BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法 Description B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 Input 一行 ...
- BZOJ_4003_[JLOI2015]城池攻占_可并堆
BZOJ_4003_[JLOI2015]城池攻占_可并堆 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 ...
- Django运算表达式与Q对象/F对象
Django运算表达式与Q对象/F对象 1 模型查询 概述: 1 查询集:表示从数据库中获取的对象的集合 2 查询集可以有多个过滤器,通过 逻辑运算符连接 3 过滤器就是一个函数,基于所给的参数限制查 ...
- 【毕业】-《伯恩茅斯大学毕业证书》BU一模一样原件
☞伯恩茅斯大学毕业证书[微/Q:2544033233◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归 ...
- XSS过滤JAVA过滤器filter 防止常见SQL注入
Java项目中XSS过滤器的使用方法. 简单介绍: XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩 ...
- 使用CompletableFuture实现异步编程
在开发中会碰到一种场景,如下 Object result1 = service1.func1();//执行80ms Object result2 =service2.func2();//执行50ms ...
- SpaceSyntax【空间句法】之DepthMapX学习:第二篇 输出了什么东西 与 核心概念
这节比较枯燥,都是原理,不过也有干货.这篇能不能听懂,就决定是否入门...所以,加油吧 博客园/B站/知乎/CSDN @秋意正寒 转载请在文头注明本文地址 本篇讲空间句法的几个核心概念,有一些也是重 ...