实际项目开发中默认的Dialog样式无法满足需求,需要自定义Dialog及其布局,并响应布局中控件的事件。
上效果图:
1. 自定义TakePhotosDialog继承自Dialog:
public class TakePhotosDialog extends Dialog {
public TakePhotosDialog(Context context) {
super(context);
this.show();
}
public TakePhotosDialog(Context context, int theme) {
super(context, theme);
this.show();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_takephotos);
}
}
2. 自定义布局文件dialog_takephotos.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="120dp"
android:background="@drawable/bt_cirle_white_bg"
android:orientation="vertical">
<Button
android:id="@+id/bt_choose_picture"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@color/transparent"
android:text="相册选择"
android:textSize="14sp"/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/grey"/>
<Button
android:id="@+id/bt_take_picture"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@color/transparent"
android:text="拍照"
android:textSize="14sp"/>
</LinearLayout>
<Button
android:id="@+id/bt_cancel"
android:layout_width="match_parent"
android:layout_marginBottom="5dp"
android:layout_height="60dp"
android:layout_marginTop="12dp"
android:background="@drawable/bt_cirle_white_bg"
android:text="取消"
android:textSize="14sp"/>
</LinearLayout></span>
3. 在MainActivity中进行调用:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog);
Button btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog();
}
});
}
public void dialog() {
TakePhotosDialog dialog = new TakePhotosDialog(MainActivity.this,R.style.dialog_setting;//设置dialog的样式
Window window = dialog.getWindow();
window.setGravity(Gravity.BOTTOM);
window.setWindowAnimations(R.style.mystyle); // 添加动画
dialog.show();
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
params.width = (int) (display.getWidth());
dialog.getWindow().setAttributes(params);
Button choose_picture= (Button) dialog.findViewById(R.id.bt_choose_picture);
Button take_picture= (Button) dialog.findViewById(R.id.bt_take_picture);
Button cancel= (Button) dialog.findViewById(R.id.bt_cancel);
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
}
4.样式文件style.xml的内容如下:
<!--控制dialog进出动画-->
<style name="dialog_animation" parent="android:Animation">
<item name="@android:windowEnterAnimation">@anim/dialog_enter</item>
<!-- 进入时的动画 -->
<item name="@android:windowExitAnimation">@anim/dialog_exit</item>
<!-- 退出时的动画 -->
</style>
<style name="dialog_setting" parent="@android:style/Theme.Dialog">
<item name="android:windowNoTitle">true</item><!-- 无标题 -->
<item name="android:windowBackground">@color/transparent</item>//背景设置为透明
</style></span>
5.用到的动画文件如下,放到res/anim中
dialog_enter.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="600"
android:fromYDelta="100%p" />
</set>
dialog_exit.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="600"
android:toYDelta="100%p" />
</set>