如何使Dialog像Activity一样随心所欲的使用?

如何使Dialog像Activity一样随心所欲的使用?
android中的Dialog像是寄生在Activity中,在弹出Dialog时,因受到系统风格定义,导致Dialog怎么也不能如意,那么今天就来探讨下Dialog的使用。

要完全自定义一个Dialog,那么就不要extends AlertDialog,我们在使用Activity时,先准备一个布局文件xxx.xml,所有控件大小都可以在布局文件中写好。其实Dialog也可以这么做。

实现步骤:
     1、准备好布局文件: 
     2、组织布局中的控件动作,写成一个ViewHolder,我这里写的是TimeViewHolder,构造函数中要两个参数:Context和View,这个                                                       ViewHolder与Activity的ViewHolder不一样,因为Activity是带布局的,所以可以不要View这个参数。这个View可以看作是一个布局,所有的控件都以它为载体
public TimeViewHolder(Context activity, View view) {
     this.activity = activity;        
     this.root = view;
    }
     2、准备好一套风格:这个风格文件定义在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>
             < item name ="android:windowBackground" >@null </ item> <!--除去背景色-->
         </style >
     3、在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 );//在onCreate方法中,指定布局文件,因上面指定了风格,所以这个
                                                    //Dialog的大小位置全都会因这个layout决定,所以你想怎样就怎样
                    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( "ytmfdw""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();//Dialog创建完成后,要显示的
     4、在ViewHolder中使用Dialog的布局中的控件:
   private View root ;
     private TextView tv_time_date ;
     public TimeViewHolder(Context activity, View view) {
         this .activity = activity;
         this .root = view;
         tvTimerManager = TvTimerManager.getInstance();
    }

     public void findViews() {
         tv_time_date = (TextView) root .findViewById(R.id. tv_time_date);
        loadDataToUI();
    }
          
     5、收工
          
     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章