无邪的消防车 · 每天担心电动车被盗?快用报警防盗锁试试_车锁 ...· 1 月前 · |
卖萌的自行车 · 呼吸过度番外未增删带翻译樱花漫画免费阅读「下 ...· 1 月前 · |
谈吐大方的伏特加 · 如何使用MySQL游标进行日期循环查询?_产 ...· 3 月前 · |
多情的莴苣 · 股改到底是什么?运营一家中超球队需要多少钱? ...· 4 月前 · |
完美的稀饭 · 【R语言数据导出txt】 ...· 4 月前 · |
if
(
mBottomSheetDialog
==
null
){
mBottomSheetDialog
=
new
BottomDialog
(
that
);
View
specView
=
initSpecView
();
// 这里只是用inflater将一个布局填充为了一View对象
.
setContentView
(
specView
);
}
mBottomSheetDialog
.
show
();
// 调用show方法就能展示了
mBottomSheetDialog
.
setOnDismissListener
(
new
DialogInterface
.
OnDismissListener
()
{
@Override
public
void
onDismiss
(
DialogInterface
dialog
)
{
mBottomSheetDialog
=
null
;
}
});
private
View
initSpecView
()
{
View
view
=
getLayoutInflater
().
inflate
(
R
.
layout
.
window_goods_choose
,
null
);
......
// 这里就是一些findViewById和对View 进行设置的操作
}
View
bottomSheet
=
findViewById
(
R
.
id
.
bottom_sheet
);
//这里需要注意的是:view必须是CoordinatorLayout的子类
behavior
=
BottomSheetBehavior
.
from
(
bottomSheet
);
//该View需要配置Hehavior属性,Android 的默认实现为:app:layout_behavior="@string/bottom_sheet_behavior"
behavior
.
setBottomSheetCallback
(
new
BottomSheetBehavior
.
BottomSheetCallback
()
{
//设置回调
@Override
public
void
onStateChanged
(
@NonNull
View
bottomSheet
,
int
newState
)
{
// React to state change
}
@Override
public
void
onSlide
(
@NonNull
View
bottomSheet
,
float
slideOffset
)
{
// React to dragging events
}
});
behavior
.
setState
(
BottomSheetBehavior
.
STATE_EXPANDED
);
// 展开
import
android
.
content
.
Context
;
import
android
.
os
.
Build
;
import
android
.
os
.
Bundle
;
import
android
.
support
.
annotation
.
LayoutRes
;
import
android
.
support
.
annotation
.
NonNull
;
import
android
.
support
.
annotation
.
StyleRes
;
import
android
.
support
.
design
.
widget
.
BottomSheetBehavior
;
import
android
.
support
.
design
.
widget
.
CoordinatorLayout
;
import
android
.
support
.
v7
.
app
.
AppCompatDialog
;
import
android
.
util
.
Log
;
import
android
.
util
.
TypedValue
;
import
android
.
view
.
View
;
import
android
.
view
.
ViewGroup
;
import
android
.
view
.
Window
;
import
android
.
widget
.
FrameLayout
;
import
java
.
lang
.
reflect
.
Field
;
/**
* Base class for {@link android.app.Dialog}s styled as a bottom sheet.
*/
public
class
MyDialog
extends
AppCompatDialog
{
private
BottomSheetBehavior
bottomSheetBehavior
;
public
MyDialog
(
@NonNull
Context
context
)
{
this
(
context
,
0
);
}
public
MyDialog
(
@NonNull
Context
context
,
@StyleRes
int
theme
)
{
super
(
context
,
getThemeResId
(
context
,
theme
));
// We hide the title bar for any style configuration. Otherwise, there will be a gap
// above the bottom sheet when it is expanded.
supportRequestWindowFeature
(
Window
.
FEATURE_NO_TITLE
);
}
protected
MyDialog
(
@NonNull
Context
context
,
boolean
cancelable
,
OnCancelListener
cancelListener
)
{
super
(
context
,
cancelable
,
cancelListener
);
supportRequestWindowFeature
(
Window
.
FEATURE_NO_TITLE
);
}
@Override
public
void
setContentView
(
@LayoutRes
int
layoutResId
)
{
super
.
setContentView
(
wrapInBottomSheet
(
layoutResId
,
null
,
null
));
}
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
getWindow
().
setLayout
(
ViewGroup
.
LayoutParams
.
MATCH_PARENT
,
ViewGroup
.
LayoutParams
.
MATCH_PARENT
);
}
@Override
public
void
setContentView
(
View
view
)
{
super
.
setContentView
(
wrapInBottomSheet
(
0
,
view
,
null
));
}
@Override
public
void
setContentView
(
View
view
,
ViewGroup
.
LayoutParams
params
)
{
super
.
setContentView
(
wrapInBottomSheet
(
0
,
view
,
params
));
}
private
View
wrapInBottomSheet
(
int
layoutResId
,
View
view
,
ViewGroup
.
LayoutParams
params
)
{
final
CoordinatorLayout
coordinator
=
(
CoordinatorLayout
)
View
.
inflate
(
getContext
(),
android
.
support
.
design
.
R
.
layout
.
design_bottom_sheet_dialog
,
null
);
if
(
layoutResId
!=
0
&&
view
==
null
)
{
view
=
getLayoutInflater
().
inflate
(
layoutResId
,
coordinator
,
false
);
}
FrameLayout
bottomSheet
=
(
FrameLayout
)
coordinator
.
findViewById
(
android
.
support
.
design
.
R
.
id
.
design_bottom_sheet
);
bottomSheetBehavior
=
BottomSheetBehavior
.
from
(
bottomSheet
);
bottomSheetBehavior
.
setBottomSheetCallback
(
mBottomSheetCallback
);
if
(
params
==
null
)
{
bottomSheet
.
addView
(
view
);
}
else
{
bottomSheet
.
addView
(
view
,
params
);
}
// We treat the CoordinatorLayout as outside the dialog though it is technically inside
if
(
shouldWindowCloseOnTouchOutside
())
{
coordinator
.
findViewById
(
android
.
support
.
design
.
R
.
id
.
touch_outside
).
setOnClickListener
(
new
View
.
OnClickListener
()
{
@Override
public
void
onClick
(
View
view
)
{
if
(
isShowing
())
{
cancel
();
}
}
});
}
return
coordinator
;
}
private
boolean
shouldWindowCloseOnTouchOutside
()
{
if
(
Build
.
VERSION
.
SDK_INT
<
11
)
{
return
true
;
}
TypedValue
value
=
new
TypedValue
();
//noinspection SimplifiableIfStatement
if
(
getContext
().
getTheme
()
.
resolveAttribute
(
android
.
R
.
attr
.
windowCloseOnTouchOutside
,
value
,
true
))
{
return
value
.
data
!=
0
;
}
return
false
;
}
private
static
int
getThemeResId
(
Context
context
,
int
themeId
)
{
if
(
themeId
==
0
)
{
// If the provided theme is 0, then retrieve the dialogTheme from our theme
TypedValue
outValue
=
new
TypedValue
();
if
(
context
.
getTheme
().
resolveAttribute
(
android
.
support
.
design
.
R
.
attr
.
bottomSheetDialogTheme
,
outValue
,
true
))
{
themeId
=
outValue
.
resourceId
;
}
else
{
// bottomSheetDialogTheme is not provided; we default to our light theme
themeId
=
android
.
support
.
design
.
R
.
style
.
Theme_Design_Light_BottomSheetDialog
;
}
}
return
themeId
;
}
private
BottomSheetBehavior
.
BottomSheetCallback
mBottomSheetCallback
=
new
BottomSheetBehavior
.
BottomSheetCallback
()
{
@Override
public
void
onStateChanged
(
@NonNull
View
bottomSheet
,
@BottomSheetBehavior
.
State
int
newState
)
{
if
(
newState
==
BottomSheetBehavior
.
STATE_HIDDEN
)
{
dismiss
();
}
}
@Override
public
void
onSlide
(
@NonNull
View
bottomSheet
,
float
slideOffset
)
{
}
};
@Override
protected
void
onStart
()
{
super
.
onStart
();
// 会有异常
// if (bottomSheetBehavior != null)
// bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
//暂时解决方法
try
{
Field
field
=
BottomSheetBehavior
.
class
.
getDeclaredField
(
"mState"
);
field
.
setAccessible
(
true
);
field
.
setInt
(
bottomSheetBehavior
,
BottomSheetBehavior
.
STATE_EXPANDED
);
}
catch
(
NoSuchFieldException
e
)
{
Log
.
e
(
"BottomSheetBehavior"
,
"Error setting BottomSheetBehavior initial state (1)"
,
e
);
}
catch
(
IllegalAccessException
e
)
{
Log
.
e
(
"BottomSheetBehavior"
,
"Error setting BottomSheetBehavior initial state (2)"
,
e
);
}
}
}
该种实现方式转自:http://blog.csdn.net/sunshine2050_csdn/article/details/50818197,非常感谢其贡献。
一、BottomSheetDialog简介用途:底部弹起的view或dialog。实现:其关键也是CoordinatorLayout与Behavior要求: 采用View的形式展示的话,用于展示的View必须具备如下两个要求: 1,View类必须支持嵌套滚动。 2,View类必须是CoordinatorLayout
import
android
.app.
Dialog
;
import
android
.content.Context;
import
android
.graphics.Color;
import
android
.graphics.drawable.ColorDrawable;
import
android
.os.Bundle;
import
android
.util.
工作日志记录,最近工作上有一个设计效果类似于
Bott
omSheet
Dialog
的效果,这里做了一个demo,记录下实现的效果和代码,方便以后可以参照一下:
注意:
使用
这个
Bott
omSheet
Dialog
时候要映入对应得MaterialDesign包,我这里是
android
x版本所有
使用
compile 'com.google.
android
.material:material:1.0....
extends AppCompat
Dialog
Base class for
Dialog
s styled as a
bott
om sheet
基于
Dialog
样式的一个底部对话框
先看看效果
对于弹出的内容完全由自己来掌控,想实现什么样子就实现什么样子,很灵活
使用
方法
Bott
omSheet
Dialog
来自design兼容包,
使用
需要添加依赖。
android
studio 添加依赖如下:
dependencies {
compile ‘com.
android
.support:des
dependencies {
implementation ' com.github.invissvenska:Modal
Bott
omSheet
Dialog
:VERSION '
在您的Activity或Fragment上实现Modal
Bott
omSheet
Dialog
Listener接口:
在Activi
底部对话框
心水很久的底部样式样式,同时在Google Play商店也见到过此样式,不过经过多次问询,没得到想要的结果。只好自己动手实现。
使用
Bott
omSheet
,支持滚动布局,同时底部布局不会因
Bott
omSheet
未显示全部内容而隐藏。
高度自定义
支持自定义标题布局(Toolbar ...),内容布局(列表,文字)和底部布局(按钮,
Bott
omAppBar)
底部布局自适应导航栏
只在类原生机器测试过,不保证支持国产定制系统
支持Activity形式的
Dialog
(
Bott
om
Dialog
Activity)
有上下文即可显示的条件
列表可操作list进行更新查看
支持监听列表
简单标题文字
Bott
om
Dialog
.builder( this ) {
title( " Hello " )
message(
buildString {
for (i in 0 .. 30 ) {
for (j in 0 .. i * 5 ) append
MD风格的底部弹窗,比自定义
dialog
或popupwindow
使用
更简单,功能也更强大。
其实细分来说,是
Bott
omSheet
、
Bott
omSheet
Dialog
、
Bott
omSheet
Dialog
Fragment
Bott
omSheet
与主界面同层级关系,可以事件触发,如果有设置显示高度的话,也可以拉出来,且不会影响主界面的交互。
<?xml version="1.0" encoding="utf-8"?>
<
android
x.
coordi
nat
or
layout
.
大家都知道IOS的很多菜单都是从底部弹出的,这种展示方式还是很好看的,而丑爆的
Android
默认弹框一直都是大家一定要摒弃的,那么我们
Android
如何做出相应效果的弹框。下面我们就介绍这种做法。
底部弹出框布局
dialog
_goods_sku_
layout
.xml
<?xml version="1.0" encoding="utf-8"?>
<Relative
Layout
...
Bott
omSheet
Dialog
Fragment是位于com.google.
android
.material包下的一个类.
Bott
omSheet
Dialog
Fragment 继承自AppCompat
Dialog
Fragment
AppCompat
Dialog
Fragment继承自
Dialog
Fragment
因为AppCompat
Dialog
Fragment 是一个特殊版本的
Dialog
Fragment, 所以其实可以看做
Bott
omSheet
Dialog
Fragment是直接继承于
Dialog
Fr
MD 风格的底部弹窗,比自定义
Dialog
或 PopupWindow
使用
更简单,功能也更强大,比如可以方便的实现拖拽关闭。 细分来说,分为
Bott
omSheet
、
Bott
omSheet
Dialog
、
Bott
omSheet
Dialog
Fragment。
Bott
omSheet
:依赖于
Coordi
nat
or
Layout
和
Bott
omSheet
Behavior
,需要将底部菜单作为
Coordi
nat
or
Layout
的子 View,并且有三个关键的属性需要其设置。
app:
layout
_beha.