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

  在Android中,我們可以通過繼承View來打造完全如我們所願的組件,但是,有的時候,我們需要的組件是一個由現有的幾個組件的組合實現的,那麼我們就可以利用組件合成技術,呵呵,這個名字我自己起的。
  在Android中打造複合組件,其實只需要繼承Layout或者其子類,比如LinearLayout等,然後在其中定義需要完成該功能的現有的幾個組件。
  然後定義一個監聽器(就是一個簡單的接口,暴露給用戶使用,獲取返回的數據,給用戶使用)
  本文通過使用兩個Spinner來打造一個省份城市信息聯動的選擇控件,省份和城市信息的聯動是開發中經常遇到的,這裏我們看看使用組件合成技術如何簡單巧妙的實現該功能。本例是雛形,強大的功能待大家完善。
  閒話少說,直接上實例:
  1、自定義一個CitySpinner,代碼: package demo.spinner; import java.util.ArrayList; import java.util.HashMap; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.Spinner; /** * 自定義複合組件,實現省份城市聯動Spinner組件 * 定義複合組件通常繼承自Layout,不必重寫onDraw,onMesure等方法,除非有特殊的需求 * @author Administrator * */ public class CitySpinner extends LinearLayout { private Context context; private Spinner mProvinceSpinner, mCitySpinner; private HashMap> proCities; //存放數據 private ArrayList provinces; private OnCitySelectListener cityListener; private AdapterView.OnItemSelectedListener provinceSelectListener = new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView p, View v, int position, long id) { // 在選擇了一個省份後,我們需要更新對應的城市列表 String currProvince = (String)p.getItemAtPosition(position); ArrayList cities = proCities.get(currProvince); ArrayAdapter adapter = new ArrayAdapter(context, android.R.layout.simple_spinner_item,cities); adapter.setDropDownViewResource(android.R.layout.s imple_dropdown_item_1line); mCitySpinner.setAdapter(adapter); } @Override public void onNothingSelected(AdapterView arg0) { // TODO Auto-generated method stub } }; private AdapterView.OnItemSelectedListener citySelectListener = new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView p, View v, int position, long id) { if(cityListener != null){ //這裏獲取當前選擇的省份和城市 String province = (String)mProvinceSpinner.getSelectedItem(); String city = (String)p.getItemAtPosition(position); cityListener.onCitySelected(province, city); } } @Override public void onNothingSelected(AdapterView arg0) { // TODO Auto-generated method stub //Do nothing; } }; public CitySpinner(Context context, HashMap> data){ super(context); this.context = context; this.setOrientation(HORIZONTAL); //水平佈局 //然後設置省份Spinner的數據 mProvinceSpinner = new Spinner(context); mCitySpinner = new Spinner(context); //添加監聽 mProvinceSpinner.setOnItemSelectedListener(provinc eSelectListener); mCitySpinner.setOnItemSelectedListener(citySelectL istener); if(data != null){ this.proCities = data; provinces = new ArrayList(); Object[] temps = proCities.keySet().toArray(); for(int i=0; i adapter = new ArrayAdapter(context, android.R.layout.simple_spinner_item,provinces); adapter.setDropDownViewResource(android.R.layout.s imple_dropdown_item_1line); mProvinceSpinner.setAdapter(adapter); } this.addView(mProvinceSpinner,LayoutParams.WRAP_CO NTENT,LayoutParams.WRAP_CONTENT); this.addView(mCitySpinner,LayoutParams.WRAP_CONTEN T, LayoutParams.WRAP_CONTENT); } public CitySpinner(Context context, HashMap> data, AttributeSet attrs){ super(context, attrs); } public Spinner getmProvinceSpinner() { return mProvinceSpinner; } public void setmProvinceSpinner(Spinner mProvinceSpinner) { this.mProvinceSpinner = mProvinceSpinner; } public Spinner getmCitySpinner() { return mCitySpinner; } public void setmCitySpinner(Spinner mCitySpinner) { this.mCitySpinner = mCitySpinner; } public void setOnCitySelectListener(OnCitySelectListener listener){ this.cityListener = listener; } } 2、該代碼中使用到了一個監聽器OnCitySelectListener,其實就是一個簡單的接口,在用戶使用的時候,由用戶來具體實現。 /** * 選擇事件監聽器 * @author Administrator * */ public interface OnCitySelectListener { public void onCitySelected(String province, String city); } 3、測試代碼,目前不能再配置文件中使用該控件,只能在代碼中使用,如何使其能在配置文件中使用,也很簡單。後期待完成。代碼: package demo.spinner; import java.util.ArrayList; import java.util.HashMap; import android.app.Activity; import android.os.Bundle; import android.widget.LinearLayout; import android.widget.Toast; public class DemoActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); HashMap> data = new HashMap>(); for(int i=0; i cities = new ArrayList(); for(int j=0; j組件合成技術,如此簡單而已!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章