自定义Dialog(一)
Dialog是一种提示用户做决定的小窗口,它一般不会布满整个屏幕,它可以请求用户在程序处理之前做一动作。比如:当退出应用的时候,可以提示用户是否真的需要退出应用,等等。
android提供了Dialog一些默认布局和样式,在一些的情况下,它不满足需求,那么,我们就需要自定义Dialog了。当然我们没有必要自己实现,可以对Dialog的Style进行一些定制,就可以很容易达到我们的需求。
下面就做一个简单的例子:
自定义的一个Dialog的style:
<style name="popupDialog" parent="@android:style/Theme.Dialog"> <item name="android:windowFrame">@null</item><!-- 边框 --> <item name="android:windowIsFloating">true</item><!-- 是否悬浮在activity上 false: dialog 布满整个屏幕, true,显示指定大小--> <item name="android:windowIsTranslucent">true</item><!-- 半透明 --> <item name="android:windowNoTitle">true</item><!-- 无标题 false 的时候,在没有给定title的情况下,会比true的情况显示要长(title显示了,没有内容而已),--> <item name="android:windowBackground">@drawable/skin2_dialog_bottom</item><!-- 背景透明 背景颜色--> <item name="android:backgroundDimEnabled">true</item><!-- 模糊 false: 整个界面不会有遮罩层--> <item name="android:backgroundDimAmount">0.6</item><!-- 灰度 当android:backgroundDimEnabled=true时,这个参数才有用,值越大,遮罩层颜色越深。--> <item name="android:windowAnimationStyle">@style/dialog_animation</item><!-- 弹出或者进入时的动画效果 --> <item name="android:windowContentOverlay">@null</item><!-- 对话框是否有遮盖 --> <item name="android:colorBackgroundCacheHint">@null</item><!-- 背景缓存颜色 --> </style>
@drawable/skin2_dialog_bottom:
@style/dialog_animation:
<style name="dialog_animation"> <item name="android:windowEnterAnimation">@anim/fading_in</item> <item name="android:windowExitAnimation">@anim/fading_out</item> </style>
@anim/fading_in:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:duration="500" android:fromAlpha="0.1" android:toAlpha="1.0" /> </set>
@anim/fading_out:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:duration="500" android:fromAlpha="1.0" android:toAlpha="0.1" /> </set>MainActivity:
package com.hualu.dialog; import android.app.Activity; import android.app.Dialog; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { private Button custom_style ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); custom_style = (Button)findViewById(R.id.custom_style) ; custom_style.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { verifyDialog("custom_style verify") ; } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } private void verifyDialog(String msg) { final Dialog dialog = new Dialog(MainActivity.this, R.style.popupDialog); dialog.setContentView(R.layout.verify_dialog); dialog.setCanceledOnTouchOutside(false); dialog.setCancelable(false); TextView message = (TextView)dialog.getWindow().findViewById(R.id.messageTxt); Button okBtn = (Button)dialog.getWindow().findViewById(R.id.dismissBtn); message.setText(msg); okBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(dialog!=null && dialog.isShowing()) { dialog.dismiss(); } } }); if(dialog!=null && !dialog.isShowing()) { dialog.show(); } } }verify_dialog:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/messageTxt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="57dp" android:text="TextView" /> <Button android:id="@+id/dismissBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/messageTxt" android:layout_centerHorizontal="true" android:layout_marginTop="45dp" android:text="Button" /> </RelativeLayout>