当前位置:  编程技术>移动开发
本页文章导读:
    ▪得到当前View的Bit地图        得到当前View的Bitmap View cv=Activity.getWindow().getDecorView(); Bitmap b = Bitmap.createBitmap(w,h, Bitmap.Config.RGB_565); Canvas c = new Canvas(b); cv.draw(c); 1 楼 liuborama 2010-08-30   Cannot make a s.........
    ▪ 兑现在AutoCompleteTextView(EditText)的框内嵌入label和button的效果        实现在AutoCompleteTextView(EditText)的框内嵌入label和button的效果         我在做登陆框的时候,想要做出让label和button嵌在EditText中的效果。             很简单,在写布局的时候父容器.........
    ▪ 利用反照控制AlertDialog,使其不自动关闭       利用反射控制AlertDialog,使其不自动关闭  众所周知,AlertDialog类用于显示对话框。关于AlertDialog的基本用法在这里就不详细介绍了,网上有很多,读者可以自己搜索。那么本文要介绍的是如.........

[1]得到当前View的Bit地图
    来源: 互联网  发布时间: 2014-02-18
得到当前View的Bitmap
View cv=Activity.getWindow().getDecorView();
Bitmap b = Bitmap.createBitmap(w,h, Bitmap.Config.RGB_565);
	    Canvas c = new Canvas(b);
	    cv.draw(c);
1 楼 liuborama 2010-08-30  
Cannot make a static reference to the non-static method getWindow() from the type Activity
使用2.2版本的SDK,第一句出现这个错误。。

    
[2] 兑现在AutoCompleteTextView(EditText)的框内嵌入label和button的效果
    来源: 互联网  发布时间: 2014-02-18
实现在AutoCompleteTextView(EditText)的框内嵌入label和button的效果
 
      我在做登陆框的时候,想要做出让label和button嵌在EditText中的效果。
     
      很简单,在写布局的时候父容器的布局方向为Horizontal,让label和AutoCompleteTextView两者left对齐,button和AutoCompleteTextView两者的right对齐,然后可以分别设置各自的margin,使他们位置能够匹配得更好。
      
       这样带来的新的问题:如果让用户在texiview中输入内容的时候,文字不会跑到button或者label后面去?很简单,只要设置textview的padding就行了~
       (当然 一般的EditText也可以~出来的效果就和QQ android的一样咯~ )

图中有真相:
                                        

代码说明,style是自己定义的长宽style,用android:layout_width和android:layout_height做是一模一样的。。。。
<RelativeLayout android:id="@+id/userNameContent"   
            android:orientation="horizontal" android:layout_width="260dip"
            android:layout_height="wrap_content"   
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="20dip">
		<AutoCompleteTextView android:id="@+id/username"
                  
                 android:singleLine="true"
		 android:layout_alignParentRight="true" 
                 android:paddingLeft="47dip" 
                 android:paddingRight="38dip"/>
		<TextView   
                  android:layout_alignLeft="@id/username"
                  android:layout_marginLeft="8dip"
                  android:text="@string/username" 
                  android:textColor="@color/label_in_textview" 
                  android:layout_centerVertical="true" 
                  android:textAppearance="?android:attr/textAppearanceMedium" />
		<ImageButton android:id="@+id/down" 
                 android:src="/blog_article/@drawable/down/index.html"
		 android:layout_height="30dip" 
                 android:layout_width="30dip"
		 android:background="@color/transparent"  
                 android:layout_alignRight="@id/username" 
                 android:layout_marginRight="8dip"               
                 android:layout_centerInParent="true" />
</RelativeLayout>

1 楼 andyjackson 2010-08-14  
你为什么这么屌
引用
2 楼 zhc0822 2010-08-14  
楼主利用简简单单的几句代码就实现了困扰我好久的效果。
感慨楼主解决问题的思路,真是化繁为简,佩服。
3 楼 yangjiantong 2011-12-04  
楼主,有点没看明白,如果我现在qq登陆那种效果,请问下那个点击ImageButton 后,下面弹出的提示内容是放在哪呢?

    
[3] 利用反照控制AlertDialog,使其不自动关闭
    来源: 互联网  发布时间: 2014-02-18
利用反射控制AlertDialog,使其不自动关闭

 众所周知,AlertDialog类用于显示对话框。关于AlertDialog的基本用法在这里就不详细介绍了,网上有很多,读者可以自己搜索。那么本文要介绍的是如何随心所欲地控制AlertDialog。
    现在我们来看看第一个需求:如果某个应用需要弹出一个对话框。当单击“确定“按钮时完成某些工作,如果这些工作失败,对话框不能关闭。而当成功完成工作后,则关闭对话框。当然,无论何程度情况,单击“取消”按钮都会关闭对话框。
    这个需求并不复杂,也并不过分(虽然我们可以自己弄个Activity来完成这个工作,也可在View上自己放按钮,但这显示有些大炮打蚊子了,如果对话框上只有一行文本,费这么多劲太不值了)。但使用过AlertDialog的读者都知道,无论单击的哪个按钮,无论按钮单击事件的执行情况如何,对话框是肯定要关闭的。也就是说,用户无法控制对话框的关闭动作。实际上,关闭对话框的动作已经在Android SDK写死了,并且未给使用者留有任何接口。但我的座右铭是“宇宙中没有什么是不能控制的”。
    既然要控制对放框的关闭行为,首先就得分析是哪些类、哪些代码使这个对话框关闭的。进入AlertDialog类的源代码。在AlertDialog中只定义了一个变量:mAlert。这个变量是AlertController类型。AlertController类是Android的内部类,在com.android.internal.app包中,无法通过普通的方式访问。也无法在Eclipse中通过按Ctrl键跟踪进源代码。但可以直接在Android源代码中找到AlertController.java。我们再回到AlertDialog类中。AlertDialog类实际上只是一个架子。象设置按钮、设置标题等工作都是由AlertController类完成的。因此,AlertController类才是关键。
    找到AlertController.java文件。打开后不要感到头晕哦,这个文件中的代码是很多地。不过这么多代码对本文的主题也没什么用处。下面就找一下控制按钮的代码。
    在AlertController类的开头就会看到如下的代码:

   View.OnClickListener mButtonHandler  =   new  View.OnClickListener() {
         public   void  onClick(View v) {
            Message m  =   null ;
             if  (v  ==  mButtonPositive  &&  mButtonPositiveMessage  !=   null ) {
                m  =  Message.obtain(mButtonPositiveMessage);
            }  else   if  (v  ==  mButtonNegative  &&  mButtonNegativeMessage  !=   null ) {
                m  =  Message.obtain(mButtonNegativeMessage);
            }  else   if  (v  ==  mButtonNeutral  &&  mButtonNeutralMessage  !=   null ) {
                m  =  Message.obtain(mButtonNeutralMessage);
            }
             if  (m  !=   null ) {
                m.sendToTarget();
            }

             //  Post a message so we dismiss after the above handlers are executed
            mHandler.obtainMessage(ButtonHandler.MSG_DISMISS_DIALOG, mDialogInterface)
                    .sendToTarget();
        }
    };


从这段代码中可以猜出来,前几行代码用来触发对话框中的三个按钮( Positive 、 Negative 和 Neutral )的单击事件,而最后的代码则用来关闭对话框(因为我们发现了 MSG_DISMISS_DIALOG 、猜出来的)。


mHandler.obtainMessage(ButtonHandler.MSG_DISMISS_DIALOG, mDialogInterface)
                    .sendToTarget();

上面的代码并不是直接来关闭对话框的,而是通过一个 Handler 来处理,代码如下:


     private   static   final   class  ButtonHandler  extends  Handler {
         //  Button clicks have Message.what as the BUTTON{1,2,3} constant
         private   static   final   int  MSG_DISMISS_DIALOG  =   1 ;
       
         private  WeakReference < DialogInterface >  mDialog;

         public  ButtonHandler(DialogInterface dialog) {
            mDialog  =   new  WeakReference < DialogInterface > (dialog);
        }

        @Override
         public   void  handleMessage(Message msg) {
             switch  (msg.what) {
               
                 case  DialogInterface.BUTTON_POSITIVE:
                 case  DialogInterface.BUTTON_NEGATIVE:
                 case  DialogInterface.BUTTON_NEUTRAL:
                    ((DialogInterface.OnClickListener) msg.obj).onClick(mDialog.get(), msg.what);
                     break ;
                   
                 case  MSG_DISMISS_DIALOG:
                    ((DialogInterface) msg.obj).dismiss();
            }
        }
    }

 


从上面代码的最后可以找到  ((DialogInterface) msg.obj).dismiss();。现在看了这么多源代码,我们来总结一下对话框按钮单击事件的处理过程。在AlertController处理对话框按钮时会为每一个按钮添加一个onclick事件。而这个事件类的对象实例就是上面的mButtonHandler。在这个单击事件中首先会通过发送消息的方式调用为按钮设置的单击事件(也就是通过setPositiveButton等方法的第二个参数设置的单击事件),在触发完按钮的单击事件后,会通过发送消息的方式调用dismiss方法来关闭对话框。而在AlertController类中定义了一个全局的mHandler变量。在AlertController类中通过ButtonHandler类来对象来为mHandler赋值。因此,我们只要使用我们自己Handler对象替换ButtonHandler就可以阻止调用dismiss方法来关闭对话框。下面先在自己的程序中建立一个新的ButtonHandler类(也可叫其他的名)。


class  ButtonHandler  extends  Handler
{

     private  WeakReference < DialogInterface >  mDialog;

     public  ButtonHandler(DialogInterface dialog)
    {
        mDialog  =   new  WeakReference < DialogInterface > (dialog);
    }

    @Override
     public   void  handleMessage(Message msg)
    {
         switch  (msg.what)
        {

             case  DialogInterface.BUTTON_POSITIVE:
             case  DialogInterface.BUTTON_NEGATIVE:
             case  DialogInterface.BUTTON_NEUTRAL:
                ((DialogInterface.OnClickListener) msg.obj).onClick(mDialog
                        .get(), msg.what);
                 break ;
        }
    }
}

 

 我们可以看到,上面的类和AlertController中的ButtonHandler类很像,只是支掉了switch语句的最后一个case子句(用于调用dismiss方法)和相关的代码。
    下面我们就要为AlertController中的mHandler重新赋值。由于mHandler是private变量,因此,在这里需要使用Java的反射技术来为mHandler赋值。由于在AlertDialog类中的mAlert变量同样也是private,因此,也需要使用同样的反射技术来获得mAlert变量。代码如下:


 先建立一个 AlertDialog 对象


AlertDialog alertDialog  =   new  AlertDialog.Builder( this )
        .setTitle( " abc " )
        .setMessage( " content " )
        .setIcon(R.drawable.icon)
        .setPositiveButton( “确定”,
                 new  OnClickListener()
                {
                    @Override
                     public   void  onClick(DialogInterface dialog,
                             int  which)
                    {

                    }
                }).setNegativeButton( " 取消 " ,  new  OnClickListener()
        {

            @Override
             public   void  onClick(DialogInterface dialog,  int  which)
            {
                dialog.dismiss();
            }
        }).create()
 

 

上面的对话框很普通,单击哪个按钮都会关闭对话框。下面在调用 show 方法之前来修改一个 mHandler 变量的值, OK ,下面我们就来见证奇迹的时刻。

         try 
        {
          
            Field field  =  alertDialog1.getClass().getDeclaredField( " mAlert " );
            field.setAccessible( true );
            //   获得mAlert变量的值
            Object obj  =  field.get(alertDialog1);
            field  =  obj.getClass().getDeclaredField( " mHandler " );
            field.setAccessible( true );
            //   修改mHandler变量的值,使用新的ButtonHandler类
            field.set(obj,  new  ButtonHandler(alertDialog1));
        }
         catch  (Exception e)
        {
        }
       //   显示对话框
      alertDialog.show();

  我们发现,如果加上try   catch语句,单击对话框中的确定按钮不会关闭对话框(除非在代码中调用dismiss方法),单击取消按钮则会关闭对话框(因为调用了dismiss方法)。如果去了try…catch代码段,对话框又会恢复正常了。
    虽然上面的代码已经解决了问题,但需要编写的代码仍然比较多,为此,我们也可采用另外一种方法来阻止关闭对话框。这种方法不需要定义任何的类。
    这种方法需要用点技巧。由于系统通过调用dismiss来关闭对话框,那么我们可以在dismiss方法上做点文章。在系统调用dismiss方法时会首先判断对话框是否已经关闭,如果对话框已经关闭了,就会退出dismiss方法而不再继续关闭对话框了。因此,我们可以欺骗一下系统,当调用dismiss方法时我们可以让系统以为对话框已经关闭(虽然对话框还没有关闭),这样dismiss方法就失效了,这样即使系统调用了dismiss方法也无法关闭对话框了。
    下面让我们回到AlertDialog的源代码中,再继续跟踪到AlertDialog的父类Dialog的源代码中。找到dismissDialog方法。实际上,dismiss方法是通过dismissDialog方法来关闭对话框的,dismissDialog方法的代码如下:

    private   void  dismissDialog() {
         if  (mDecor  ==   null ) {
             if  (Config.LOGV) Log.v(LOG_TAG,
                     " [Dialog] dismiss: already dismissed, ignore " );
             return ;
        }
         if  ( ! mShowing) {
             if  (Config.LOGV) Log.v(LOG_TAG,
                     " [Dialog] dismiss: not showing, ignore " );
             return ;
        }

        mWindowManager.removeView(mDecor);

        mDecor  =   null ;
        mWindow.closeAllPanels();
        onStop();
        mShowing  =   false ;
       
        sendDismissMessage();
    }


该方法后面的代码不用管它,先看 if(!mShowing){ … } 这段代码。这个 mShowing 变量就是判断对话框是否已关闭的。因此,我们在代码中通过设置这个变量就可以使系统认为对话框已经关闭,就不再继续关闭对话框了。由于 mShowing 也是 private 变量,因此,也需要反射技术来设置这个变量。我们可以在对话框按钮的单击事件中设置 mShowing ,代码如下:


try
{
    Field field  =  dialog.getClass()
            .getSuperclass().getDeclaredField(
                     " mShowing " );
    field.setAccessible( true );
     //   将mShowing变量设为false,表示对话框已关闭
    field.set(dialog,  false );
    dialog.dismiss();

}
catch  (Exception e)
{

}

 


将上面的代码加到哪个按钮的单击事件代码中,哪个按钮就再也无法关闭对话框了。如果要关闭对话框,只需再将 mShowing 设为 true 即可。要注意的是,在一个按钮里设置了 mShowing 变量,也会影响另一个按钮的关闭对话框功能,因此,需要在每一个按钮的单击事件里都设置 mShowing 变量的值。

1 楼 mengsina 2012-03-14  
看过,受益匪浅。
但是还有个更简单的办法。
1:将setPositiveButton方法的监听事件,赋值为空。
Builder builder = new AlertDialog.Builder(mContext).setPositiveButton(R.string.msip_dialog_button_download,null);
2:然后获取AlertDialog的实例。
alertDialog = builder.create;
3. 直接调用POSITIVEButton,并重写它的事件。这样就不会走你说的那些代码了。
Button button = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
button.setOnClickListener(positiveClick);

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3