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类,然 ...
随机推荐
- gen_server terminate与trap_exit
不论是新手还是熟手,写gen_server时常会遇到terminate/2,有时执行,有时却不执行的困惑. 比如stackoverflow中的Handling the cleanup of the g ...
- switch窗口句柄
Set<String> windows = browser.getWebDriver().getWindowHandles(); //获得所有窗口句柄 for (String string ...
- 简化异常处理的Throwables类
简化异常处理的Throwables类 有时候, 当我们我们捕获异常, 并且像把这个异常传递到下一个try/catch块中.Guava提供了一个异常处理工具类, 可以简单地捕获和重新抛出多个异常.例如: ...
- BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元
BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元 题意: 我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1.一个元素相邻的元素包括它本身,及他上下左右的4个元素(如果 ...
- bootstrap 选项卡的使用
1.页面中的tab 在做项目的时候用到了切换选项卡显示不同图表页面的 需求,如下图 就直接使用了bootstrapd的选项卡 学习源头: http://www.runoob.com/bootstrap ...
- 正则表达式(Regular expressions)使用笔记
Regular expressions are a powerful language for matching text patterns. This page gives a basic intr ...
- mysql获取表中日期的年月日时分秒
SELECT year(callTheRollTime) from schedule_account 获取年 SELECT month(callTheRollTime) from schedule_a ...
- 启动链码报rpc error: code = Unimplemented desc = unknown service protos.ChaincodeSupport start error
参考链接:https://stackoverflow.com/questions/48007519/unimplemented-desc-unknown-service-protos-chaincod ...
- 由dubbo服务禁用system.gc而引起的思考
我一直都有一个疑问,丰巢业务服务的生产环境jvm参数设置是禁止system.gc的,也就是开启设置:-XX:+DisableExplicitGC,但是生产环境却从来没有出现过堆外内存溢出的情况.说明一 ...
- 解决SpannableString在Android组件间传递时显示失效的问题
问题:在A activity中传递一个SpannableString到B activity中,并最终传递到B activity中的TextView中,但是没有展示出Span效果. 解决:阅读TextV ...