Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android打造個性十足的組件技術之復合組件

Android打造個性十足的組件技術之復合組件

編輯:Android開發實例

在Android中,我們可以通過繼承View來打造完全如我們所願的組件,但是,有的時候,我們需要的組件是一個由現有的幾個組件的組合實現的,那麼我們就可以利用組件合成技術,呵呵,這個名字我自己起的。

在Android中打造復合組件,其實只需要繼承Layout或者其子類,比如LinearLayout等,然後在其中定義需要完成該功能的現有的幾個組件。

然後定義一個監聽器(就是一個簡單的接口,暴露給用戶使用,獲取返回的數據,給用戶使用)

本文通過使用兩個Spinner來打造一個省份城市信息聯動的選擇控件,省份和城市信息的聯動是開發中經常遇到的,這裡我們看看使用組件合成技術如何簡單巧妙的實現該功能。本例是雛形,強大的功能待大家完善。

閒話少說,直接上實例:

1、自定義一個CitySpinner,代碼:

 

  1. package org.widget.spinner;  
  2. import java.util.ArrayList;  
  3. import java.util.HashMap;  
  4. import android.content.Context;  
  5. import android.util.AttributeSet;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.widget.AdapterView;  
  9. import android.widget.ArrayAdapter;  
  10. import android.widget.LinearLayout;  
  11. import android.widget.Spinner;  
  12. /**  
  13.  * 自定義復合組件,實現省份城市聯動Spinner組件  
  14.  * 定義復合組件通常繼承自Layout,不必重寫onDraw,onMesure等方法,除非有特殊的需求  
  15.  * @author Administrator  
  16.  *  
  17.  */ 
  18. public class CitySpinner extends LinearLayout {  
  19.       
  20.     private Context context;  
  21.       
  22.     private Spinner mProvinceSpinner, mCitySpinner;  
  23.       
  24.     private HashMap<String, ArrayList<String>> proCities; //存放數據  
  25.       
  26.     private ArrayList<String> provinces;  
  27.       
  28.     private OnCitySelectListener cityListener;  
  29.       
  30.       
  31.     private AdapterView.OnItemSelectedListener provinceSelectListener = new AdapterView.OnItemSelectedListener() {  
  32.         @Override 
  33.         public void onItemSelected(AdapterView<?> p, View v, int position,  
  34.                 long id) {  
  35.             // 在選擇了一個省份後,我們需要更新對應的城市列表  
  36.             String currProvince = (String)p.getItemAtPosition(position);  
  37.             switchCity(currProvince);  
  38.               
  39.         }  
  40.         @Override 
  41.         public void onNothingSelected(AdapterView<?> arg0) {  
  42.             // TODO Auto-generated method stub  
  43.               
  44.         }  
  45.     };  
  46.       
  47.     private AdapterView.OnItemSelectedListener citySelectListener = new AdapterView.OnItemSelectedListener() {  
  48.         @Override 
  49.         public void onItemSelected(AdapterView<?> p, View v, int position,  
  50.                 long id) {  
  51.               
  52.             if(cityListener != null){  
  53.                 //這裡獲取當前選擇的省份和城市  
  54.                 String province = (String)mProvinceSpinner.getSelectedItem();  
  55.                 String city = (String)p.getItemAtPosition(position);  
  56.                 cityListener.onCitySelected(province, city);  
  57.             }  
  58.               
  59.         }  
  60.         @Override 
  61.         public void onNothingSelected(AdapterView<?> arg0) {  
  62.             // TODO Auto-generated method stub  
  63.             //Do nothing;  
  64.         }  
  65.     };  
  66.       
  67.       
  68.     public CitySpinner(Context context, HashMap<String, ArrayList<String>> data){  
  69.         super(context);  
  70.         this.context = context;   
  71.         if(data != null){  
  72.             init(data);  
  73.         }  
  74.     }  
  75.       
  76.     public CitySpinner(Context context, HashMap<String, ArrayList<String>> data, AttributeSet attrs){  
  77.         super(context, attrs);  
  78.         this.context = context;   
  79.         if(data != null){  
  80.             init(data);  
  81.         }         
  82.     }     
  83.       
  84.     private void init(HashMap<String, ArrayList<String>> data){  
  85.         this.setOrientation(HORIZONTAL); //水平布局  
  86.         this.setWeightSum(0.5f);  
  87.         //然後設置省份Spinner的數據  
  88.           
  89.         //首先,我們直接在代碼中定義組件  
  90. //      mProvinceSpinner = new Spinner(context);  
  91. //      mCitySpinner = new Spinner(context);  
  92.         //我們看看從xml文件中獲取  
  93.         View v = LayoutInflater.from(context).inflate(R.layout.city, null);  
  94.         mProvinceSpinner = (Spinner)v.findViewById(R.id.province);  
  95.         mCitySpinner = (Spinner)v.findViewById(R.id.city);  
  96.         //在將這兩個組件添加到新的LinearLayout中時,需要首先將這兩個組件從原來的Layout中刪除  
  97.         LinearLayout temp = (LinearLayout)v.findViewById(R.id.layout_city);  
  98.         temp.removeAllViews();  
  99.         //添加監聽  
  100.         mProvinceSpinner.setOnItemSelectedListener(provinceSelectListener);  
  101.         mCitySpinner.setOnItemSelectedListener(citySelectListener);  
  102.           
  103.         //如何對其進行定制布局格式呢??待解決  
  104.         this.proCities = data;  
  105.         initProvince();  
  106.           
  107.         this.addView(mProvinceSpinner,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);  
  108.         this.addView(mCitySpinner,LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);          
  109.     }  
  110.       
  111.     //初始化省份信息  
  112.     private void initProvince(){  
  113.         provinces = new ArrayList<String>();  
  114.         Object[] temps = proCities.keySet().toArray();  
  115.         for(int i=0; i<temps.length; i++){  
  116.             provinces.add((String)temps[i]);  
  117.         }  
  118.         ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item,provinces);  
  119.         adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);  
  120.         mProvinceSpinner.setAdapter(adapter);         
  121.     }  
  122.       
  123.     //根據當前指定的省份更新對應的城市信息  
  124.     private void switchCity(String currProvince){  
  125.           
  126.         ArrayList<String> cities = proCities.get(currProvince);  
  127.           
  128.         ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item,cities);  
  129.         adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);  
  130.         mCitySpinner.setAdapter(adapter);         
  131.     }  
  132.     public Spinner getmProvinceSpinner() {  
  133.         return mProvinceSpinner;  
  134.     }  
  135.     public void setmProvinceSpinner(Spinner mProvinceSpinner) {  
  136.         this.mProvinceSpinner = mProvinceSpinner;  
  137.     }  
  138.     public Spinner getmCitySpinner() {  
  139.         return mCitySpinner;  
  140.     }  
  141.     public void setmCitySpinner(Spinner mCitySpinner) {  
  142.         this.mCitySpinner = mCitySpinner;  
  143.     }  
  144.       
  145.     public void setOnCitySelectListener(OnCitySelectListener listener){  
  146.         this.cityListener = listener;  
  147.     }  
  148. }  
  149.  

2、該代碼中使用到了一個監聽器OnCitySelectListener,其實就是一個簡單的接口,在用戶使用的時候,由用戶來具體實現。

 

  1. /**  
  2.  * 選擇事件監聽器  
  3.  * @author Administrator  
  4.  *  
  5.  */ 
  6. public interface OnCitySelectListener {  
  7.       
  8.     public void onCitySelected(String province, String city);  

3、測試代碼,目前不能再配置文件中使用該控件,只能在代碼中使用,如何使其能在配置文件中使用,也很簡單。後期待完成。代碼:

 

  1. package demo.spinner;  
  2. import java.util.ArrayList;  
  3. import java.util.HashMap;  
  4. import android.app.Activity;  
  5. import android.os.Bundle;  
  6. import android.widget.LinearLayout;  
  7. import android.widget.Toast;  
  8. public class DemoActivity extends Activity {  
  9.     /** Called when the activity is first created. */ 
  10.       
  11.     @Override 
  12.     public void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.main);  
  15.         HashMap<String, ArrayList<String>> data = new HashMap<String, ArrayList<String>>();  
  16.         for(int i=0; i<5; i++){  
  17.             ArrayList<String> cities = new ArrayList<String>();  
  18.             for(int j=0; j<5; j++){  
  19.                 cities.add("cities"+i+j);  
  20.             }  
  21.             data.put("province"+i, cities);  
  22.         }  
  23.         final CitySpinner spinner = new CitySpinner(this, data);  
  24.         LinearLayout layout = (LinearLayout)this.findViewById(R.id.layout_demo);  
  25.         layout.addView(spinner);          
  26.         //CitySpinner spinner = (CitySpinner)this.findViewById(R.id.city_spinner);//在布局文件中加入,目前不行,待完善  
  27.         spinner.setOnCitySelectListener(new OnCitySelectListener() {  
  28.               
  29.             @Override 
  30.             public void onCitySelected(String province, String city) {  
  31.                 //   
  32.                 Toast.makeText(DemoActivity.this, "當前省市:"+province+city, Toast.LENGTH_LONG).show();  
  33.             }  
  34.         });  
  35.           
  36.     }  

可以看到,組件合成技術,如此簡單而已!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved