在Android的界面开发,对于一些控件中的使用会使用到特殊的方法和机制。在界面开发部分的学习中,这些方法需要特别注意。现将其中的部分总结出来,便于查询。

1. 自定义对话框

    Android中对话框控件的定义和使用有些与众不同,需要利用AlertDialog.Builder类设置对话框的各属性,然后调用其creat()方法得到Dialog对象。调用Dialog对象的show()方法显示对话框。

    自定义对话框的原理是利用Builder对象的setView()方法,将一个View对象传入其中,这个View对象来自于自定义的作为对话框中布局的布局文件。自定义的View对象通过LayoutInflater对象获得。示例代码如下:

 

       
       
       
       
  1.        //获得布局解析 
  2.   LayoutInflater factory=LayoutInflater.from(three.this); 
  3.         //将布局的XML文件解析成为view对象 
  4.   final View dia=factory.inflate(R.layout.dialog, null); 
  5.         //获得对话框类内部类builder的对象 
  6.   AlertDialog.Builder builder=new AlertDialog.Builder(three.this); 
  7.         //在builder对象中设置对话框的属性 
  8.   builder.setTitle("登录提示"); 
  9.   builder.setView(dia); 
  10.   builder.setPositiveButton("确定"new DialogInterface.OnClickListener() {        
  11.   @Override 
  12.   public void onClick(DialogInterface dialog, int which) { 
  13.     // TODO Auto-generated method stub   
  14.     three.this.displayToast("登录成功!");                                        
  15.             } 
  16.         }); 
  17. builder.setNegativeButton("退出"new DialogInterface.OnClickListener() { 
  18.              
  19.             @Override 
  20.     public void onClick(DialogInterface dialog, int which) { 
  21.                 // TODO Auto-generated method stub 
  22.            three.this.finish();  
  23.          
  24.             } 
  25.         }); 
  26.         //初始化对话框 
  27.         Dialog dialog=builder.create(); 
  28.         //显示对话框 
  29.         dialog.show(); 
  30.          

 

2. BaseAdapter类的使用

    前面曾经使用过AraryAdapter、ListAdapter和SimpleCurAdapter,它的使用都很简单,就是获得适配器对象然后将数据源和布局参数作为构造方法的参数传递进去就行。以上三个类都是BaseAdapter的子类,自定义一个继承了BaseAdapter类的子类同样可以实现以上三个类的功能。具体代码如下:

 

       
       
       
       
  1. public class myAdapter extends BaseAdapter{ 
  2.  
  3.     private Context context; 
  4.      
  5. ArrayList> arrlist=new ArrayList>(); 
  6. HashMap map1 = new HashMap(); 
  7. HashMap map2 = new HashMap(); 
  8. HashMap map3 = new HashMap(); 
  9.      
  10.     public myAdapter(Context context){ 
  11.         map1.put("name","张三"); 
  12.         map1.put("id""1"); 
  13.         map2.put("name","李四"); 
  14.         map2.put("id""2"); 
  15.         map3.put("name","王五"); 
  16.         map3.put("id""3"); 
  17.         arrlist.add(map1); 
  18.         arrlist.add(map2); 
  19.         arrlist.add(map3); 
  20.         this.context=context;             
  21.     } 
  22.  
  23.     @Override 
  24.     public int getCount() { 
  25.         // TODO Auto-generated method stub 
  26.         return arrlist.size(); 
  27.     } 
  28.  
  29.     @Override 
  30.     public Object getItem(int position) { 
  31.         // TODO Auto-generated method stub 
  32.         return position; 
  33.     } 
  34.  
  35.     @Override 
  36.     public long getItemId(int position) { 
  37.         // TODO Auto-generated method stub 
  38.         return position; 
  39.     } 
  40.  
  41.     @Override 
  42. public View getView(int position, View convertView, ViewGroup parent) { 
  43.         // TODO Auto-generated method stub 
  44.     LayoutInflater layoutInf=LayoutInflater.from(context); 
  45.     View view=layoutInf.inflate(com.skip.R.layout.lt, null); 
  46.     HashMap map=arrlist.get(position); 
  47. TextView tx1=(TextView)view.findViewById(com.skip.R.id.widget28); 
  48. tx1.setText(map.get("name")); 
  49. TextView tx2=(TextView)view.findViewById(com.skip.R.id.widget29); 
  50.   tx2.setText(map.get("id")); 
  51.         return view; 
  52.     } 
  53.  

    在上面的类中,数据源是写死在类中的,可以是List,Cursor和数组,而在getView中是将数据绑定在控件上的操作,返回View对象。在子类中,重点就是实现getView()方法和数据源的定义,其他的方法直接按照方法功能返回所需数据即可。初始化该对象,并将上面的对象直接作为控件的适配器就可以直接使用。

    上段代码等同于如下代码:

 

       
       
       
       
  1. ArrayList> arrlist; 
  2. arrlist=new ArrayList>(); 
  3. HashMap map1 = new HashMap(); 
  4. HashMap map2 = new HashMap(); 
  5. HashMap map3 = new HashMap(); 
  6.         map1.put("name","张三"); 
  7.         map1.put("id""1"); 
  8.         map2.put("name","李四"); 
  9.         map2.put("id""2"); 
  10.         map3.put("name","王五"); 
  11.         map3.put("id""3"); 
  12.         arrlist.add(map1); 
  13.         arrlist.add(map2); 
  14.         arrlist.add(map3); 
  15. SimpleAdapter sada=new SimpleAdapter(this
  16. AdapyerAxarrlist, 
  17. android.R.layout.simple_list_item_2, 
  18.  new String[]{"name","id"},  
  19. new int[]{android.R.id.text2,android.R.id.text1}); 
  20.         ListView ls = (ListView)findViewById(R.id.list); 
  21.         ls.setAdapter(sada); 

    BaseAdapter作为抽象的父类,其数据源可以是任何一种,数据源和布局都是=可以自定义。SimpleAdapte作为BaseAdapter的子类,具有特定功能,它的数据源特定并由外部传入,使用起来相对方便。

    但是,BaseAdapter具有自己的优势,那就是可以将媒体文件作为数据源元素加载到适配器并更加详细的定义其布局,这是其子类无法做到的。代码如下:

 

       
       
       
       
  1. public class ImageAdapter extends BaseAdapter 
  2.     // 定义Context 
  3.     private Context     mContext;        
  4.     // 定义整型数组 即图片源 
  5.     private Integer[]   mImageIds =  
  6.     {                        
  7.             R.drawable.img1,  
  8.             R.drawable.img2,  
  9.             R.drawable.img3,  
  10.             R.drawable.img4,  
  11.             R.drawable.img5,  
  12.             R.drawable.img6,  
  13.             R.drawable.img7, 
  14.             R.drawable.img8,         
  15.     }; 
  16.  
  17.     // 声明 ImageAdapter 
  18.     public ImageAdapter(Context c) 
  19.     { 
  20.         mContext = c; 
  21.     } 
  22.  
  23.     // 获取图片的个数 
  24.     public int getCount() 
  25.     { 
  26.         return mImageIds.length; 
  27.     } 
  28.  
  29.     // 获取图片在库中的位置 
  30.     public Object getItem(int position) 
  31.     { 
  32.         return position; 
  33.     } 
  34.  
  35.     // 获取图片ID 
  36.     public long getItemId(int position) 
  37.     { 
  38.         return position; 
  39.     } 
  40.  
  41.     public View getView(int position, View convertView, ViewGroup parent) 
  42.     { 
  43.         ImageView p_w_picpathview = new ImageView(mContext); 
  44.  
  45.         // 给ImageView设置资源 
  46.         p_w_picpathview.setImageResource(mImageIds[position]); 
  47.         // 设置布局 图片120×120显示 
  48.         p_w_picpathview.setLayoutParams(new Gallery.LayoutParams(120120)); 
  49.         // 设置显示比例类型 
  50.         p_w_picpathview.setScaleType(ImageView.ScaleType.FIT_CENTER); 
  51.         return p_w_picpathview; 
  52.     } 

    使用BaseAdapter类对于那些需要详细定义布局的数据源具有很好的操作性,特别是对于图片这类属性较多的数据,一般在使用适配器时选择BaseAdapter。

3. ImageSwitcher的使用

ImageSwitcher可以实现图片的切换效果,它的使用并非很难,但是容易忽略ImageSwitch的对象需要利用setFactory()方法设置转换器每一页的View。在这个设置完成以后才可以添加数据源。使用代码如下:

 

       
       
       
       
  1. p_w_picpathswi=(ImageSwitcher)findViewById(R.id.imgswi); 
  2.         p_w_picpathswi.setFactory(new ViewSwitcher.ViewFactory() { 
  3.         //定义源的View   
  4.             @Override 
  5.             public View makeView() { 
  6.                 // TODO Auto-generated method stub 
  7.                 return new ImageView(three.this); 
  8.             } 
  9.         }); 
  10. //必须在设置了Factory之后才能设置图片源 
  11.   p_w_picpathswi.setImageResource(p_w_picpathlist[index]);