在Android开发中经常需要弹出Dialog显示信息,如果选取系统自带的Dialog,风格的确多样,但是感觉效果总会不尽如人意,那么现在可以尝试按照所想的风格样式来自定义Dialog。
1.先准备布局文件。
2.写一个ViewHolder,构造函数带两个参数:Context和View,这个ViewHolder与Activity的ViewHolder是不一样,这个View可以看作是一个布局,所有的控件都以它为载体。
public TimeViewHolder(Dialog activity, View view) {
this.activity = activity;
this.root = view;
}
3.设计风格样式:这个风格文件定义在res/values/styles.xml中,当然可以写到其他风格文件中。
< style name= "picture_mode" parent ="@android:Theme.Dialog" >
< item name ="android:windowFrame" >@null </ item>
< item name ="android:windowIsFloating" >true </ item>
< item name ="android:windowIsTranslucent" >false </ item>
< item name ="android:windowNoTitle" >true </ item> <!--除去title-->
< item name ="android:windowContentOverlay" >@null </ item>
< item name ="android:backgroundDimEnabled" >false </ item> <!--如果为true,Activity会变黑-->
<!-- < item name ="android:windowBackground" >@null </ item> 除去背景色-->
< item name ="android:windowBackground">@android:color/transparent</item> <!--除去背景色-->
</style >
4.在Activity中创建Dialog:
Dialog timeDialog = new Dialog( mActivity,
R.style. picture_mode) {//创建Dialog时,带一个Content参数:mActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout. time);
View mView=getWindow().getDecorView();//关键在这里,这个View,是你根据xml中的id来找对应控件的。
if (timeViewHolder == null) {
timeViewHolder = new TimeViewHolder(mActivity ,mView);
}
}
@Override
protected void onStart() {//在这个方法中,你可以实现一些交互动作
// TODO Auto-generated method stub
super.onStart();
Log. i("Dialog", "timeDialog onStart");
timeViewHolder.findViews();
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {//按键动作,
// TODO Auto-generated method stub
return super.dispatchKeyEvent(event);
}
};
timeDialog.setOnDismissListener( new OnDismissListener() {//当Dialog消失时,做一些处理
//因为这个Dialog出现时,我把Activity隐藏了,
//所以在Dialog消失时,我要把Activity显示出来
@Override
public void onDismiss(DialogInterface dialog) {
// TODO Auto-generated method stub
linearlayout_tvset_menu.setVisibility(View.VISIBLE);//Activity显示出来
linearlayout_set_time.requestFocus();
timeViewHolder = null ;
}
});
timeDialog.show();
5.在ViewHolder中使用Dialog的布局中的控件:
private Dialog mDialg ;
private TextView tv_time_date;
public TimeViewHolder(Dialog dialog) {
tvTimerManager = TvTimerManager.getInstance();
}
public void findViews() {
tv_time_date = (TextView) mDialg.findViewById(R.id.tv_time_date);
loadDataToUI();
}