自定义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>