Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android學習Tabhost、gallery、listview、imageswitcher

Android學習Tabhost、gallery、listview、imageswitcher

編輯:關於Android編程

Tabhost控件又稱分頁控件,在很多的開發語言中都存在。它可以擁有多個標簽頁,每個標簽頁可以擁有不同的內容。android中,一個標簽頁可以放 一個view或者一個activity。TabHost是標簽控件類的核心類,也是標簽的集合。   1.tabhost定義   android控件中有封裝好的tab控件,直接拖一個到xml文件中。下面的代碼都是tab控件自己生成的。     復制代碼  1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  2     xmlns:tools="http://schemas.android.com/tools"  3     android:layout_width="fill_parent"  4     android:layout_height="fill_parent"  5     android:paddingBottom="@dimen/activity_vertical_margin"  6     android:paddingLeft="@dimen/activity_horizontal_margin"  7     android:paddingRight="@dimen/activity_horizontal_margin"  8     android:paddingTop="@dimen/activity_vertical_margin"  9     tools:context=".MainActivity" > 10  11     <TabHost 12         android:id="@android:id/tabhost" 13         android:layout_width="fill_parent" 14         android:layout_height="fill_parent" 15         android:layout_alignParentLeft="true" 16         android:layout_alignParentTop="true" > 17  18         <LinearLayout 19             android:layout_width="match_parent" 20             android:layout_height="match_parent" 21             android:orientation="vertical" > 22  23             <TabWidget 24                 android:id="@android:id/tabs" 25                 android:layout_width="match_parent" 26                 android:layout_height="wrap_content" > 27             </TabWidget> 28  29             <FrameLayout 30                 android:id="@android:id/tabcontent" 31                 android:layout_width="match_parent" 32                 android:layout_height="match_parent" > 33  34                 <LinearLayout 35                     android:id="@+id/tab1" 36                     android:layout_width="match_parent" 37                     android:layout_height="match_parent" 38                     android:orientation="vertical" > 39  40                 </LinearLayout> 41  42                 <LinearLayout 43                     android:id="@+id/tab2" 44                     android:layout_width="match_parent" 45                     android:layout_height="match_parent" 46                     android:orientation="vertical" > 47  48                 </LinearLayout> 49  50                 <LinearLayout 51                     android:id="@+id/tab3" 52                     android:layout_width="match_parent" 53                     android:layout_height="match_parent" 54                     android:orientation="vertical" > 55  56                 </LinearLayout> 57             </FrameLayout> 58         </LinearLayout> 59     </TabHost> 60  61 </RelativeLayout> 復制代碼 在後台,可以通過tabhost.addtab方法添加分頁。本例添加了3個標簽,並且為其中的兩個綁定了不同的activity。     1 TabHost tabhost=this.getTabHost(); 2         LayoutInflater.from(this).inflate(R.layout.activity_main,tabhost.getTabContentView(),true); 3         tabhost.addTab(tabhost.newTabSpec("tab1").setIndicator("撥號").setContent(new Intent(this,MyGallery.class))); 4         tabhost.addTab(tabhost.newTabSpec("tab2").setIndicator("記錄").setContent(new Intent(this,RatingListActivity.class))); 5         tabhost.addTab(tabhost.newTabSpec("tab3").setIndicator("聯系人").setContent(R.id.tab3)); 2.MyGalleryxml   Gallery是相冊控件,它可以水平或者垂直浏覽多張圖片。imgageswitcher控件可以用來以動畫的方式切換圖片。本例將imageswitcher和gallery控件相結合。gallery存放多張圖片,而imageswitcher來顯示圖片。   首先來看xml文檔的定義。   xml文檔定義的很簡單,只是包含一個布局控件、一個gallery和imageswitcher。     復制代碼  1     Gallery gallery;  2     ImageSwitcher imgwch;  3     //設置圖片資源的id  4     private int[] imgIds={R.drawable.imgs1,R.drawable.imgs2,R.drawable.imgs3,R.drawable.imgs4,R.drawable.imgs5,R.drawable.imgs6,R.drawable.imgs7};  5     public void onCreate(Bundle savebundle)  6     {  7         super.onCreate(savebundle);  8         setContentView(R.layout.imgswitch);  9          imgwch=(ImageSwitcher)findViewById(R.id.imgswitcher1); 10         imgwch.setFactory(this); 11         //設置imageswitcher的圖片動畫顯示 12         imgwch.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in)); 13         imgwch.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out)); 14         gallery=(Gallery)findViewById(R.id.gallery); 15         //定義相冊資源的適配器 16         ImageAdapter adapter=new ImageAdapter(this); 17         gallery.setAdapter(adapter); 18         gallery.setOnItemClickListener(new OnItemClickListener() { 19  20             @Override 21             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 22                     long arg3) { 23                 // TODO Auto-generated method stub 24                 //設置imageswitcher的資源id,這裡的數組下標示經過處理的,目的是為了能夠循環顯示圖像 25                 imgwch.setBackgroundResource(imgIds[arg2%imgIds.length]); 26             } 27         }); 28     } 29     //定義imageswitcher的顯示對象 30     public View makeView() {   31         ImageView imageView = new ImageView(this);   32         imageView.setBackgroundColor(Color.TRANSPARENT); 33         imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); 34         imageView.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)); 35         return imageView;   36     } 37     public class ImageAdapter extends BaseAdapter 38     { 39         int mgallerybackground; 40         private Context context; 41         public ImageAdapter(Context context) 42         { 43             this.context=context; 44             //設置相冊圖像的顯示風格 45             TypedArray typed=obtainStyledAttributes(R.styleable.Gallery); 46             mgallerybackground=typed.getResourceId(R.styleable.Gallery_android_galleryItemBackground, 0); 47             typed.recycle(); 48         } 49         @Override 50         public int getCount() { 51             // TODO Auto-generated method stub 52             //可以循環浏覽圖像 53             return Integer.MAX_VALUE; 54         } 55  56         @Override 57         public Object getItem(int position) { 58             // TODO Auto-generated method stub 59             return null; 60         } 61  62         @Override 63         public long getItemId(int position) { 64             // TODO Auto-generated method stub 65             return 0; 66         } 67  68         @Override 69         public View getView(int position, View convertView, ViewGroup parent) { 70             // TODO Auto-generated method stub 71             //設置圖像的顯示風格和顯示資源 72             ImageView img1=new ImageView(context); 73          74             img1.setScaleType(ImageView.ScaleType.FIT_XY); 75             img1.setLayoutParams(new Gallery.LayoutParams(136,88)); 76             img1.setImageResource(imgIds[position%imgIds.length]); 77             img1.setBackgroundResource(mgallerybackground); 78             return img1; 79         } 復制代碼 這裡為相冊指定了資源,並設置了顯示的風格。也為imageswitcher設置了顯示的對象,以及動畫的淡入和淡出。   通過以上的代碼,我們可以單擊“撥號”,即可顯示gallery頁,同時,imageswitcher可以隨著gallery浏覽對象的變化而變化。   3.RatingList   本例是實現基於RatingBar和Listview的打分應用。     復制代碼  1 <?xml version="1.0" encoding="utf-8"?>  2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  3     android:layout_width="fill_parent"  4     android:layout_height="fill_parent"  5     android:orientation="vertical" >  6       7 <ListView  8     android:id="@+id/lvrating"  9     android:layout_width="fill_parent" 10     android:layout_height="wrap_content" > 11  12 </ListView> 13 </LinearLayout> 復制代碼 這個xml文檔用來定義顯示的列表,有listview構成。下面需要定義listview的item項。     復制代碼  1 <?xml version="1.0" encoding="utf-8"?>  2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  3     android:layout_width="fill_parent"  4     android:layout_height="wrap_content"  5     android:gravity="center_vertical"  6     android:orientation="horizontal" >  7   8 <ImageView  9     android:id="@+id/ivLogo" 10     android:layout_width="60dp" 11     android:layout_height="60dp" 12     android:paddingLeft="5dp" 13     android:src="@drawable/ic_launcher" /> 14  15 <RelativeLayout 16     android:layout_width="wrap_content" 17     android:layout_height="wrap_content" 18     android:layout_gravity="right" 19     android:orientation="vertical" 20     android:padding="10dp" > 21  22 <TextView 23     android:id="@+id/tvApplicationName" 24     android:layout_width="wrap_content" 25     android:layout_height="wrap_content" 26     android:textSize="16dp" /> 27  28 <TextView 29     android:id="@+id/tvAuthor" 30     android:layout_width="wrap_content" 31     android:layout_height="wrap_content" 32     android:layout_below="@id/tvApplicationName" 33     android:textSize="14dp" /> 34  35 </RelativeLayout> 36  37 <RelativeLayout 38     android:layout_width="fill_parent" 39     android:layout_height="wrap_content" 40     android:gravity="right" 41     android:padding="10dp" 42     android:orientation="vertical" > 43  44     <TextView 45         android:id="@+id/tvRating" 46         android:layout_width="wrap_content" 47         android:layout_height="wrap_content" 48         android:text="5.0" /> 49  50     <RatingBar 51         android:id="@+id/ratingbar" 52         style="?android:attr/ratingBarStyleSmall" 53         android:layout_width="wrap_content" 54         android:layout_height="wrap_content" 55         android:layout_below="@id/tvRating" 56         android:numStars="5" /> 57  58 </RelativeLayout> 59 </LinearLayout> 復制代碼 對於listview的使用方法,大家都應該很清楚的。一般定義復雜的列表顯示,都需要通過listview以及item組成。在後台可以通過simpleadapter或者baseadapter來綁定數據。     復制代碼  1 public void onCreate(Bundle savedbundle)  2     {  3         super.onCreate(savedbundle);  4         setContentView(R.layout.listv);  5         ListView listview=(ListView)findViewById(R.id.lvrating);  6         final MyBaseadapter adapter=new MyBaseadapter(this);  7               8         listview.setAdapter(adapter);  9         listview.setOnItemClickListener(new OnItemClickListener() { 10  11             @Override 12             public void onItemClick(AdapterView<?> arg0, View arg1, final int arg2, 13                     long arg3) { 14                 // TODO Auto-generated method stub 15                 View myView=getLayoutInflater().inflate(R.layout.rating, null); 16                 final RatingBar ratingbar=(RatingBar)myView.findViewById(R.id.ratingBar1); 17                 ratingbar.setRating(applicationrating[arg2]); 18                 new AlertDialog.Builder(RatingListActivity.this).setTitle(applicationNames[arg2]).setMessage("給城市打分").setView(myView) 19                 .setPositiveButton("確定", new OnClickListener() { 20                      21                     @Override 22                     public void onClick(DialogInterface dialog, int which) { 23                         // TODO Auto-generated method stub 24                         adapter.setRating(arg2, ratingbar.getRating()); 25                     } 26                 }).setNegativeButton("取消", null).show(); 27             } 28         }); 29     } 復制代碼 在oncreate方法中為listview綁定數據,並設置listview的監聽事件。MyBaseadapter類繼承BaseAdapter類。     復制代碼  1 public class MyBaseadapter extends BaseAdapter  2     {  3   4         private Context context;  5         public MyBaseadapter(Context context)  6         {  7             this.context=context;  8         }  9         @Override 10         public int getCount() { 11             // TODO Auto-generated method stub 12             return resIds.length; 13         } 14  15         @Override 16         public Object getItem(int position) { 17             // TODO Auto-generated method stub 18             return null; 19         } 20  21         @Override 22         public long getItemId(int position) { 23             // TODO Auto-generated method stub 24             return 0; 25         } 26  27         @Override 28         public View getView(int position, View convertView, ViewGroup parent) { 29             // TODO Auto-generated method stub 30             TextView tvapplicationname; 31             if(convertView==null) 32             { 33 //對於這裡的使用,真的有太多的方法,這裡是為了要或者我們定義的那個item.xml。 34                 convertView=LayoutInflater.from(context).inflate(R.layout.ratinglist, null); 35             } 36              tvapplicationname=(TextView)convertView.findViewById(R.id.tvApplicationName); 37             tvapplicationname.setText(applicationNames[position]); 38             ImageView ivlogo=(ImageView)convertView.findViewById(R.id.ivLogo); 39             ivlogo.setImageResource(resIds[position]); 40             TextView tvauthor=(TextView)convertView.findViewById(R.id.tvAuthor); 41             tvauthor.setText(authors[position]); 42             TextView tvrating=(TextView)convertView.findViewById(R.id.tvRating); 43             tvrating.setText(String.valueOf(applicationrating[position])); 44             RatingBar ratingbar=(RatingBar)convertView.findViewById(R.id.ratingbar); 45             ratingbar.setRating(applicationrating[position]); 46             return convertView; 47         } 48         public void setRating(int position,float rating) 49         { 50             applicationrating[position]=rating; 51             notifyDataSetChanged(); 52         } 53          54     } 復制代碼 BaseAdapter中getView方法使用容易出錯,經常會出現獲取不到xml文檔的情況,主要是Layoutinflater.inflate的使用。這裡在獲取view對象後,然後為view中的每個控件賦值。最後將這個view返回。這裡返回的是listview的每一個item。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved