androiddialog位置
① Android dialog 遮住输入框的解决思路
在工作中经常会遇到弹出的dialog有输入框的情况,屏幕大了还好,屏幕小了之后就特别容易出现输入框被软键盘遮住的情况,下面就是我在实际想中中遇到的
从上图可以看出输入框已经看不到了,遇到这种情况的第一个思路都是在dialog的style中添加
<item name="android:windowSoftInputMode">adjustPan</item>,我也试了下基本上没用。然后换了个猜键思路,既然软键盘弹出来了,为什么不能让dialog向上移动同样的距离呢。思路有了,下面就是把他实现了。
首先就是要计算软键盘的高度,由于google并没有给出具体的方法来计算软键盘的高度,这时候我们就只能根据布局的高度变化来计算了。首先需要计算出屏幕的bottom坐标,然后监控布局的变动判断变动后的bottom和初始的bottom的差值,一般肉眼观察软键盘的高度差不多做兆早是屏幕高度的1/3,所以就假设bottom往上移动了屏幕的1/3的距离就认为软件盘弹出来纯雀了,当然也可以根据其他值来判断,下面贴出具体方法:
/**
* activity中判断软键盘是否显示
* @param activity
* */
fun isKeyboardShowing(activity: Activity): Boolean {
val screenHeight = activity.window!!.decorView.height.toDouble()
//获取view的可见区域
val rect = Rect()
activity.window!!.decorView.getWindowVisibleDisplayFrame(rect)
return (2.0 /3.0) * screenHeight > rect.bottom.toDouble()
}
接下来我们来计算出软件盘的高度,经过我在多个测试机上实验发现初始时bottom就是屏幕的高度,下面是计算键盘高度的具体方法
/**
* activity中计算软键盘的高度
* @param activity
* */
fun getKeyboardHeight(activity: Activity): Int {
val displayMetrics = DisplayMetrics()
activity.windowManager.defaultDisplay.getMetrics(displayMetrics)
val screenHeight = displayMetrics.heightPixels
val rect = Rect()
activity.window!!.decorView.getWindowVisibleDisplayFrame(rect)
return screenHeight - rect.bottom
}
有了高度之后一切就好办了我们只需要在软键盘弹出来的时候把dialog往上移动就行,在移动方式上我选择了设置LayoutParams的方式,开始时想设置底部margin的,结果发现没作用,dialog一点不移动,最后只好设置上边的margin为负值
if (SoftUtils.isKeyboardShowing(context)) {
val lp =mRootView.layoutParams as ViewGroup.MarginLayoutParams
if (lp.topMargin ==0) {
lp.topMargin = -SoftUtils.getKeyboardHeight(context)
if (mRootView.height
lp.height =mRootOriginHeight
}
mRootView.layoutParams = lp
}
}else {
if (mRootOriginHeight ==0) {
mRootOriginHeight =mRootView.height
}
val lp =mRootView.layoutParams as ViewGroup.MarginLayoutParams
if (lp.topMargin <0) {
lp.topMargin =0
mRootView.layoutParams = lp
}
}
其中mRootView是dialog最外层的布局。在这里面比较重要的一点监测方式,在哪里监测软键盘的弹出动作,在activity中可以监测onWindowFocusChanged方法,但是如果封装了dialog的话,dialog中的onWindowFocusChanged并不会起作用,在这里我选择了使用ViewTreeObserver和监听,通过给mRootView的ViewTreeObserver添加addOnGlobalLayoutListener来实时判断,下面是完整的方法
private fun setSpace() {
val treeObserver =mRootView.viewTreeObserver
treeObserver.addOnGlobalLayoutListener{
if (SoftUtils.isKeyboardShowing(context)) {
val lp =mRootView.layoutParams as ViewGroup.MarginLayoutParams
if (lp.topMargin ==0) {
lp.topMargin = -SoftUtils.getKeyboardHeight(context)
if (mRootView.height
lp.height =mRootOriginHeight
}
mRootView.layoutParams = lp
}
}else {
if (mRootOriginHeight ==0) {
mRootOriginHeight =mRootView.height
}
val lp =mRootView.layoutParams as ViewGroup.MarginLayoutParams
if (lp.topMargin <0) {
lp.topMargin =0
mRootView.layoutParams = lp
}
}
}
}
在这里当软键盘弹出的时候重新设置了下dialog的高度,因为有时候软键盘的弹出会使dialog的高度压缩,所以弹出的时候重新设置下就好了。
这就是我的一个解决思路,当然完全按这个写的话当输入框较多时也可能出问题,最上层的输入框跑屏幕之外去了,这种情况下我们只需要根据输入框的位置动态的计算dialog需要往上移动的距离就行,不要一直设置为计算出来的软键盘的高度。
下图是解决之后的UI
② android设置dialog在第几层显示
android中dialog都是弹出的对话框,没有第几层这个概念,只有dialog有级别。
具体实现代码:
1.创建对象框
AlertDialog.Builder builder = new Builder(context);
builder.setTitle("请输入"); //设置对话框标题
builder.setIcon(android.R.drawable.btn_star); //设置对话框标题前的图标
2.创建EditText输入框
final EditText edit = new EditText(context);
3.将输入框赋值给Dialog,并增加确定取消按键
builder.setView(edit);
builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "你输入的是: " + edit.getText().toString(), Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "你点了取消", Toast.LENGTH_SHORT).show();
}
});
4.设置常用api,并show弹出
builder.setCancelable(true); //设置按钮是否可以按返回键取消,false则不可以取消
AlertDialog dialog = builder.create(); //创建对话框
dialog.setCanceledOnTouchOutside(true); //设置弹出框失去焦点是否隐藏,即点击屏蔽其它地方是否隐藏
dialog.show();
③ 如何让Android弹出一个Dialog,这个Dialog只有一个图片,点击任意位置后消失
自定义dialog 写了类继承dialog 然后重写 onTouchEvent方法 getAction() 然后选择判断这个 action case: ACTION_DOWN 或者 ACTION_MOVE 事件的时候 cancel() return true 就好了
④ android 6.0权限dialog不再显示后怎么设置
android 6.0权限dialog不再显示后,设置方法如下:
打开手机设置页面。
向上滑动屏幕,找到应用程序。
点击应用程序,进入应用程序设置界面。
点击屏幕右上角的齿轮状设置按钮,进入配置应用界面。
点击上方的应用权限,进入应用权限具体设置界面。
以位置权限为例,点击上图的位置权限,就列出了所有需要位置权限的应用。
⑤ androiddialog点击没有反应鸿蒙
androiddialog点击没有反应鸿蒙
有可能使散拍用了杀毒软件,就在杀毒软件里面开启。如果手机自带的杀毒软件就在设置里面高级选项或者显示里面,每个手机开启方式不一样的。手机打开悬浮窗管理1、打开手机,选择冲姿羡“设置”。
2、选择“通知和状态栏”。
3、选择“通知智能管理”。册滑
4、找到想要进行设置的应用程序
⑥ android Dialog如何实现点击某一处,Dialog就显示地那个地方
如果真要这含激样做,那你就不要用Dialog了,使用PopupWindow自己写个类似对话框的View放进去散老野,然后PopupWindow可以设置显示的具体位置坐标,这样就满冲喊足你的要求了
⑦ Android Dialog 设置Margin方式总结
在日常开发中,总是会遇到各种Dialog的使用,调整根据UI设计的不同,会经常调整Dialog在屏幕中的位置,这篇文章主要介绍,在使用 DialogFragment 时设置Margin的几种方式。
如下是最后实现的效果:
设置两边margin效果:
设置顶部margin效果:
全屏的Dialog设置顶部Margin:
这个比较容易,主要就是设置一个高度wrap_content,宽度match_parent的dialog,然后在dialog的布局中设置margin就可以了。
如下是xml文件:
然后在DialogFragment的onResume里对Window做一些处理:
这种情况margin可以通过 WindowManager.LayoutParams 的 verticalMargin 属性来实现。 verticalMargin 和xml里面设置的layout_margin不一样, verticalMargin 是通过设置一个0-1的float变量,来标识margin在屏幕中的占比。
如下是在DialogFragment的onResume中的处理:
xml文件(和1的类似,没有什么特别):
这里如果使用2中的方法,没有任何效果。这里使用另外一种方式实现-- insetDrawable 。
这里的实现是在xml里面写一个 <inset> :
在DialogFragment的onResume方法中:
⑧ 如何自定义Android Dialog的样式
如何自定义Android Dialog的样式? Android 中自定义Dialog的样式,主要是通过自定义的xml,然后载入到dialog的背景中,如下步骤:
1、自定义Dialog
final Dialog dialog = new Dialog(this, R.style.Theme_dialog);
2、窗口布局
View contentView = LayoutInflater.from(this).inflate(R.layout.select_list_dialog,null);
3、把设定好的窗口布局放到dialog中
dialog.setContentView(contentView);
4、设定点选视窗空白处取消会话
dialog.setCanceledOnTouchOutside(true);
5、具体的操作
ListView msgView = (ListView)contentView.findViewById(R.id.listview_flow_list);
6、展示视窗
dialog.show();例:final Dialog dialog = new Dialog(this,R.style.Theme_dialog);View contentView =LayoutInflater.from(this).inflate(R.layout.select_list_dialog, null);dialog.setContentView(contentView);dialog.setCanceledOnTouchOutside(true);ListView msgView = (ListView)contentView.findViewById(R.id.listview_flow_list);TextView titleText = (TextView)contentView.findViewById(R.id.title);titleText.setText("请选择银行卡");SelectBankCardDialogAdapter adapter =new SelectBankCardDialogAdapter(this, mBankcardList);msgView.setAdapter(adapter);msgView.setOnItemClickListener(newOnItemClickListener() {@Overridepublic void onItemClick(AdapterViewparent, View view, int position, long id) {Toast.makeText(RechargeFlowToMobileActivity.this, position+"",0).show();mSelectCard =mBankcardList.get(position);String area = mSelectCard.getBank_card();mCardNumberText.setText(area);dialog.di *** iss();}});Button closeBtn = (Button)contentView.findViewById(R.id.close);closeBtn.setClickable(true);closeBtn.setOnClickListener(newView.OnClickListener() {@Overridepublic void onClick(View v) {dialog.di *** iss();}});dialog.show();
以上就是在Android开发自定义dialog样式的方法和步骤,android很多的控制元件都提供了接口或者方法进行样式的定义和修改。
如何自定义android Button样式
返回部落格列表
转 android自定义button样式
sumpower
释出时间: 2014/02/25 19:56
阅读: 4162
收藏: 0
点赞: 0
评论: 0
摘要
android自定义button样式
在Android开发应用中,预设的Button是由系统渲染和管理大小的。而我们看到的成功的移动应用,都是有着酷炫的外观和使用体验的。因此,我们在开发产品的时候,需要对预设按钮进行美化。在本篇里,笔者结合在应用开发中的经验,探讨一下自定义背景的按钮、自定义形状按钮的实现方法。
首先看实现效果截图:
自定义背景的按钮目前有2种方式实现,向量和点阵图。
1. 向量图形绘制的方式
向量图形绘制的方式实现简单,适合对于按钮形状和图案要求不高的场合。步骤如下:
(a) 使用xml定义一个圆角矩形,外围轮廓线实线、内填充渐变色,xml程式码如下。
view plain
bg_alibuybutton_default.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="地址">
<item>
<shape android:shape="rectangle">
<solid android:color="#FFEC7600" />
<corners
android:LeftRadius="5dip"
android:RightRadius="5dip"
android:bottomLeftRadius="5dip"
android:bottomRightRadius="5dip" />
</shape>
</item>
<item android:="1px" android:bottom="1px" android:left="1px" android:right="1px">
<shape>
<gradient
android:startColor="#FFEC7600" android:endColor="#FFFED69E"
android:type="linear" android:angle="90"
android:centerX="0.5" android:centerY="0.5" />
<corners
android:LeftRadius="5dip"
android:RightRadius="5dip"
android:bottomLeftRadius="5dip"
android:bottomRightRadius="5dip" />
</shape>
</item>
</layer-list>
同样定义bg_alibuybutton_pressed.xml和bg_alibuybutton_selected.xml,内容相同,就是渐变颜色不同,用于按钮按下后的背景变化效果。
(b) 定义按钮按下后的效果变化描述档案drawable/bg_alibuybutton.xml,程式码如下。
view plain
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="地址">
<item android:state_pressed="true"
android:drawable="@drawable/bg_alibuybutton_pressed" />
<item android:state_focused="true"
android:drawable="@drawable/bg_alibuybutton_selected" />
<item android:drawable="@drawable/bg_alibuybutton_default" />
</selector>
(c) 在你需要的接口定义档案中,如layout/main.xml中定义一个Button控制元件。
view plain
<Button
android:layout_width="120dip"
android:layout_height="40dip"
android:text="向量背景按钮" android:background="@drawable/bg_alibuybutton" />
这样,自定义背景的按钮就可以使用了,在实现onClick方法后就可以响应操作。
android自带的样式比较难看,如何能够自定义按钮的样式,使其显示的跟美工设计的效果一样,现与大家分享下
在layout中新增2个按钮,从下图中可以看出在按钮中呼叫了style和android:background属性,这两个属性一个是自定义样式,一个是给按钮新增背景图片
展开res目录,可以看到在values目录下有styles.xml档案,该档案用于自定义样式,双击开启
标注的是我自定义的样式,name为BtnStyle,当按钮呼叫自定义样式的时候访问这个name
在button中呼叫自定义样式的方法,比较简单
如何往按钮中新增自定义图片,使按钮看起来更漂亮些,因不同手机分辨率不同,那必然牵扯到图片的拉伸,在android系统下有个很好的技术“九宫格“,可以对图片进行处理,只对区域性进行拉伸,给工具目录储存在android\sdk\tools\draw9patch.bat,经过该工具处理的图片以.9.png结尾,放到drawable资料夹中
在Button中通过android:background属性载入图片的方法,至此我们自定义的按钮样式也就完成了,当然这只是个引子,在具体的专案工程中实现的效果要比这个demo复杂很多,有好的设计思路欢迎交流。
⑨ Android Dialog如何显示在空间的下面
Android中Alertdialog是没有直接显示在指定控件下的API的,你可以使用PopupWindow来实现显示在指定控件下面的需求。PopupWindow不仅能显示在指定位置,还可以指定显示和消失的动画,不必限定死必须用哪个控件,只需要实现需求即可。
PopupWindow 是一个可以显示在当前 Activity 之上的浮动容器,PopupWindow 弹出的位置是能够改变的,按照有无偏移量,可以分为无偏移和有偏移两种;按照参照对象的不同又可以分为两种:相对某个控件(Anchor 锚点)的位置和在父容器内部的相对位置。
java">LayoutInflatermLayoutInflater=(LayoutInflater)context.getSystemService(LAYOUT_INFLATER_SERVICE);
ViewcontentView=mLayoutInflater.inflate(R.layout.pop,null)
//R.layout.pop为PopupWindow的布局文件
PopupWindowpop=newPopupWindow(contentView,LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
pop.setBackgroundDrawable(newBitmapDrawable());
//指定PopupWindow的背景
pop.setFocusable(true);
//指定PopupWindow显示在你指定的view下
pop.showAsDropDown(your_view);
⑩ android 设置dialog大小、位置、动画
dialogAnim
scale_in.xml
scale_out.xml