Ⅰ android 怎样设置dialog的背景
[html]viewplainprint?
<itemname="android:windowFrame">@null</item>
Ⅱ android怎么修改系统dialog风格
1、编写一个文本样式。
DIALOG的标题是一个textview,在sytles.xml中,添加如下代码来设置你自己的文本样式:
?
<style name="DialogWindowTitle">
<item name="android:textSize">22sp</item>
<item name="android:textColor">@color/font_dark_grey</item>
</style>
2、设置对话框的标题主题。
上面的标题文本并不能直接设置为对话框的标题样式。 我们还需要编写一个表示标题的主题的style,在这里指定标题的文本样式。代码如下:
?
<style name="DialogWindowTitle.DeviceDefault">
<item name="android:maxLines">1</item>
<item name="android:scrollHorizontally">true</item>
<item name="android:textAppearance">@style/DialogWindowTitle</item>
</style>
3、设置对话框主题。
接下来,我们编写我们的对话框主题,在这里指定标题的主题。由于一些属性并不是public的,所以我们需要继承自原来的某个style,代码如下:
?
<!--Dialog主题-->
<style name="Theme.DeviceDefault.Dialog" parent="@android:style/Theme.DeviceDefault.Light.Dialog">
<item name="android:windowTitleStyle">@style/DialogWindowTitle.DeviceDefault</item>
</style>
4、自定义App的主题。
接下来,我们需要在我们的App theme中指定我们的对话框使用这种主题,所以需要定义一个App theme。同样由于App theme的许多属性并不是public的(比如下面要提到的标题下面的那条蓝线),所以我们要继承自一个原生的style。这里我根据程序需要选择了Theme.Holo.Light.NoActionBar,代码如下:
?
<style name="ParkingTheme" parent="@android:style/Theme.Holo.Light.NoActionBar">
<item name="android:dialogTheme">@style/Theme.DeviceDefault.Dialog</item>
</style>
5、指定App主题。
最后一步,我们需要在AndroidManifest.xml文件中,指定我们的app主题。这步很简单,只需要在application标签中指定android:theme的值即可,如下:
?
android:theme="@style/ParkingTheme"
不过这只是指定了Dialog的主题。如果是通过AlertDialog创建出来的对话框,主题还是原来的。所以我们还需要以下步骤。
7、编写AlertDialog主题。
我们无法直接继承系统主题里的AlertDialog的style。如把parent指定为Theme.DeviceDefault.Dialog.Alert,Theme.Holo.Dialog.Alert,Theme.DeviceDefault.Light.Dialog.Alert或Theme.Holo.Light.Dialog.Alert,都会导致编译不过。所以我们需要继承自Dialog的style。在这里我以Theme.Holo.Light.Dialog为例,代码如下:
<!--AlderDialog主题-->
<style name="Theme.DeviceDefault.Dialog.Alert" parent="@android:style/Theme.Holo.Light.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowTitleStyle">@style/DialogWindowTitle.DeviceDefault</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
<item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
</style>
在这里我参考了原生的alertDialog的style,设定了窗口背景为透明,以及windowContentOverlay为null这两个重要属性,否则你会看到在AlertDialog下面还有一层对话框的背景,或者是对话框的背景遮住了所有内容这样的问题存在。
8、指定AlertDialog的主题。
我们需要在第4步所说的自定义的AppTheme中,添加一行代码来指定要使用的AlertDialog的style,代码如下:
?
<item name="android:alertDialogTheme">@style/Theme.DeviceDefault.Dialog.Alert</item>
9、修改标题下面的蓝色线。
如果你修改了对话框的主题颜色,那么标题下面的蓝色的线肯定会让你很郁闷。如果对话框较少,你可以选择隐藏标题,然后自定义一个包含了标题的View来设置为对话框的内容。但是如果你的对话框有许多种,而且本来都是可以调用原来的API就来生成的话,要去定义这么多个带标题的view,这样做下来心里肯定是很纠结的。
标题下面的蓝色的线,并不是在Dialog或AlertDialog中设置或通过它们的style中定义的。它是定义在各种风格的dialog的layout当中,然后再在AppTheme里面指定dialog的对应属性。遗憾的是,目前我看到这几个相关属性还不是public的,不能自己设置,所以只有通过java代码来实现了。
表示这条蓝色的线的叫做titleDivider,我们可以通过getResources()的API来获取它的IP,然后设置颜色。代码如下:
?
public static final void dialogTitleLineColor(Dialog dialog, int color) {
Context context = dialog.getContext();
int divierId = context.getResources().getIdentifier("android:id/titleDivider", null, null);
View divider = dialog.findViewById(divierId);
divider.setBackgroundColor(color);
Ⅲ android dialog 怎么设置全屏
默认的Dialog是不能全屏的。也就是怎么设置Dialog的Layout都没用的。
面给出实现Dialog实现全屏的两种方式:
1、代码实现。这中方法相对比较简单
首先继承Dialig,然后再构造函数中添加
super(context, android.R.style.Theme);
setOwnerActivity((Activity)context);
2、XML实现
首先,在values文件中添加一个XML文件,
其次,在XML文件中设置一个style然后,添加如下代码: <style name="Dialog_Fullscreen"> <item name="android:windowFullscreen">true</item> <item name="android:windowNoTitle">true</item> </style> 最后,在代码里设置Dialog的Theme Dialog dialog = new Dialog(this, R.style.Dialog_Fullscreen);
dialog.setContentView(R.layout.main);
dialog.show();
Ⅳ android Dialog怎样自定义属性
你只要继承Dialog,然后加个xm样式
就可以了
样式:
<style
name="myDialogTheme"
parent="android:Theme.Dialog">
<!--
除去title
-->
<item
name="android:windowNoTitle">true</item>
</style>
重写Dialog
public
class
Mdi
extends
Dialog
{
public
Mdi(Context
context)
{
super(context);
}
public
Mdi(Context
context,int
style)
{
super(context,
style);
}
public
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.mdi);
}
}
引用
Mdi
mdi
=
new
Mdi(FActivity.this,
R.style.myDialogTheme);
mdi.show();
Ⅳ 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样式
黑色的这个dialog是系统默认的样式,白色的是android4.0以上自带的一个样式,需要在manifest的application中引用@android:style/Theme.Holo.Light这个样式
Ⅶ android使用百度地图3.0版本怎样实现自定义弹出窗口功能
基本原理就是用ItemizedOverlay来添加附加物,在OnTap方法中向MapView上添加一个自定义的View(如果已存在就直接设为可见),下面具体来介绍我的实现方法:
一、自定义覆盖物类:MyPopupOverlay,这个类是最关键的一个类ItemizedOverlay,用于设置Marker,并定义Marker的点击事件,弹出窗口,至于弹出窗口的内容,则通过定义Listener,放到Activity中去构造。如果没有特殊需求,这个类不需要做什么改动。代码如下,popupLinear这个对象,就是加到地图上的自定义View:
<OverlayItem>{
privateContextcontext=null;
//这是弹出窗口,包括内容部分还有下面那个小三角
=null;
//这是弹出窗口的内容部分
private
ViewpopupView=null;
privateMapViewmapView=null;
private
Projectionprojection=null;
//这是弹出窗口内容部分使用的layoutId,在Activity中设置
privateintlayoutId=
0;
//是否使用网络带有A-J字样的Marker
=
false;
privateint[]defaultMarkerIds={
R.drawable.icon_marka,
R.drawable.icon_markb,
R.drawable.icon_markc,
R.drawable.icon_markd,
R.drawable.icon_marke,
R.drawable.icon_markf,
R.drawable.icon_markg,
R.drawable.icon_markh,
R.drawable.icon_marki,
R.drawable.icon_markj,};
//这个Listener用于在Marker被点击时让Activity填充PopupView的内容
private
OnTapListeneronTapListener=null;
publicMyPopupOverlay(Contextcontext,Drawablemarker,MapViewmMapView)
{
super(marker,mMapView);
this.context=
context;
this.popupLinear=newLinearLayout(context);
this.mapView=mMapView;
popupLinear.setOrientation(LinearLayout.VERTICAL);
popupLinear.setVisibility(View.GONE);
projection=
mapView.getProjection();
}
@Override
publicbooleanonTap(GeoPointpt,MapViewmMapView)
{
//点击窗口以外的区域时,当前窗口关闭
if(popupLinear!=null&&
popupLinear.getVisibility()==View.VISIBLE){
LayoutParamslp=
(LayoutParams)popupLinear.getLayoutParams();
PointtapP=new
Point();
projection.toPixels(pt,tapP);
PointpopP
=newPoint();
projection.toPixels(lp.point,
popP);
intxMin=popP.x-lp.width/2+lp.x;
intyMin=popP.y-lp.height+lp.y;
intxMax=popP.x+
lp.width/2+lp.x;
intyMax=popP.y+lp.y;
if
(tapP.x<xMin||tapP.y<yMin||tapP.x>xMax
||tapP.y>yMax)
popupLinear.setVisibility(View.GONE);
}
return
false;
}
@Override
protectedbooleanonTap(inti){
//
点击Marker时,该Marker滑动到地图中央偏下的位置,并显示Popup窗口
OverlayItemitem=
getItem(i);
if(popupView==null){
//
如果popupView还没有创建,则构造popupLinear
if
(!createPopupView()){
returntrue;
}
}
if(onTapListener==null)
return
true;
popupLinear.setVisibility(View.VISIBLE);
onTapListener.onTap(i,popupView);
popupLinear.measure(0,0);
intviewWidth=
popupLinear.getMeasuredWidth();
intviewHeight=
popupLinear.getMeasuredHeight();
LayoutParamslayoutParams=newLayoutParams(viewWidth,
viewHeight,
item.getPoint(),0,-60,
LayoutParams.BOTTOM_CENTER);
layoutParams.mode=
LayoutParams.MODE_MAP;
popupLinear.setLayoutParams(layoutParams);
Pointp=new
Point();
projection.toPixels(item.getPoint(),p);
p.y=
p.y-viewHeight/2;
GeoPointpoint=projection.fromPixels(p.x,
p.y);
mapView.getController().animateTo(point);
return
true;
}
privatebooleancreatePopupView(){
//TODOAuto-generated
methodstub
if(layoutId==0)
return
false;
popupView=LayoutInflater.from(context).inflate(layoutId,
null);
popupView.setBackgroundResource(R.drawable.popupborder);
ImageView
dialogStyle=newImageView(context);
dialogStyle.setImageDrawable(context.getResources().getDrawable(
R.drawable.iw_tail));
popupLinear.addView(popupView);
android.widget.LinearLayout.LayoutParamslp=new
android.widget.LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
lp.topMargin=
-2;
lp.leftMargin=60;
popupLinear.addView(dialogStyle,
lp);
mapView.addView(popupLinear);
returntrue;
}
@Override
publicvoidaddItem(List<OverlayItem>items)
{
//TODOAuto-generatedmethodstub
intstartIndex=
getAllItem().size();
for(OverlayItemitem:items){
if(startIndex>=defaultMarkerIds.length)
startIndex=
defaultMarkerIds.length-1;
if(useDefaultMarker&&
item.getMarker()==null){
item.setMarker(context.getResources().getDrawable(
defaultMarkerIds[startIndex++]));
}
}
super.addItem(items);
}
@Override
publicvoidaddItem(OverlayItemitem){
//
TODOAuto-generatedmethodstub
//
重载这两个addItem方法,主要用于设置自己默认的Marker
intindex=
getAllItem().size();
if(index>=
defaultMarkerIds.length)
index=defaultMarkerIds.length-
1;
if(useDefaultMarker&&item.getMarker()==
null){
item.setMarker(context.getResources().getDrawable(
defaultMarkerIds[getAllItem().size()]));
}
super.addItem(item);
}
publicvoidsetLayoutId(intlayoutId){
this.layoutId=
layoutId;
}
publicvoidsetUseDefaultMarker(booleanuseDefaultMarker){
this.useDefaultMarker=useDefaultMarker;
}
publicvoidsetOnTapListener(OnTapListeneronTapListener){
this.onTapListener=onTapListener;
}
publicinterfaceOnTapListener{
publicvoidonTap(intindex,
ViewpopupView);
}
}
二、MainActivity,这是主界面,用来显示地图,创建MyPopupOverlay对象,在使用我写的MyPopupOverlay这个类时,需要遵循以下步骤:
创建MyPopupOverlay对象,构造函数为public MyPopupOverlay(Context context, Drawable marker, MapView mMapView),四个参数分别为当前的上下文、通用的Marker(这是ItemizedOverlay需要的,当不设置Marker时的默认Marker)以及网络地图对象。
设置自定义的弹出窗口内容的布局文件ID,使用的方法为public void setLayoutId(int layoutId)。
设置是使用自定义的Marker,还是预先写好的带有A-J字样的网络地图原装Marker,使用的方法为public void setUseDefaultMarker(boolean useDefaultMarker),只有当这个值为true且没有调用OverlayItem的setMarker方法为特定点设置Marker时,才使用原装Marker。
创建Marker所在的点,即分别创建一个个OverlayItem,然后调用public void addItem(OverlayItem item)或public void addItem(List<OverlayItem> items)方法来把这些OverlayItem添加到自定义的附加层上去。
为MyPopupOverlay对象添加onTap事件,当Marker被点击时,填充弹出窗口中的内容(也就是第2条中layoutId布局中的内容),设置方法为public void setOnTapListener(OnTapListener onTapListener),OnTapListener是定义在MyPopupOverlay中的接口,实现这个接口需要覆写public void onTap(int index, View popupView)方法,其中,index表示被点击的Marker(确切地说是OverlayItem)的索引,popupView是使用layoutId这个布局的View,也就是弹出窗口除了下面的小三角之外的部分。
把这个MyPopupOverlay对象添加到地图上去:mMapView.getOverlays().add(myOverlay);mMapView.refresh();
Ⅷ 如何自定义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复杂很多,有好的设计思路欢迎交流。