編輯:Android開發實例
在Android中,我們可以通過繼承View來打造完全如我們所願的組件,但是,有的時候,我們需要的組件是一個由現有的幾個組件的組合實現的,那麼我們就可以利用組件合成技術,呵呵,這個名字我自己起的。
在Android中打造復合組件,其實只需要繼承Layout或者其子類,比如LinearLayout等,然後在其中定義需要完成該功能的現有的幾個組件。
然後定義一個監聽器(就是一個簡單的接口,暴露給用戶使用,獲取返回的數據,給用戶使用)
本文通過使用兩個Spinner來打造一個省份城市信息聯動的選擇控件,省份和城市信息的聯動是開發中經常遇到的,這裡我們看看使用組件合成技術如何簡單巧妙的實現該功能。本例是雛形,強大的功能待大家完善。
閒話少說,直接上實例:
1、自定義一個CitySpinner,代碼:
- package org.widget.spinner;
- import java.util.ArrayList;
- import java.util.HashMap;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.view.LayoutInflater;
- 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<String, ArrayList<String>> proCities; //存放數據
- private ArrayList<String> 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);
- switchCity(currProvince);
- }
- @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<String, ArrayList<String>> data){
- super(context);
- this.context = context;
- if(data != null){
- init(data);
- }
- }
- public CitySpinner(Context context, HashMap<String, ArrayList<String>> data, AttributeSet attrs){
- super(context, attrs);
- this.context = context;
- if(data != null){
- init(data);
- }
- }
- private void init(HashMap<String, ArrayList<String>> data){
- this.setOrientation(HORIZONTAL); //水平布局
- this.setWeightSum(0.5f);
- //然後設置省份Spinner的數據
- //首先,我們直接在代碼中定義組件
- // mProvinceSpinner = new Spinner(context);
- // mCitySpinner = new Spinner(context);
- //我們看看從xml文件中獲取
- View v = LayoutInflater.from(context).inflate(R.layout.city, null);
- mProvinceSpinner = (Spinner)v.findViewById(R.id.province);
- mCitySpinner = (Spinner)v.findViewById(R.id.city);
- //在將這兩個組件添加到新的LinearLayout中時,需要首先將這兩個組件從原來的Layout中刪除
- LinearLayout temp = (LinearLayout)v.findViewById(R.id.layout_city);
- temp.removeAllViews();
- //添加監聽
- mProvinceSpinner.setOnItemSelectedListener(provinceSelectListener);
- mCitySpinner.setOnItemSelectedListener(citySelectListener);
- //如何對其進行定制布局格式呢??待解決
- this.proCities = data;
- initProvince();
- this.addView(mProvinceSpinner,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
- this.addView(mCitySpinner,LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
- }
- //初始化省份信息
- private void initProvince(){
- provinces = new ArrayList<String>();
- Object[] temps = proCities.keySet().toArray();
- for(int i=0; i<temps.length; i++){
- provinces.add((String)temps[i]);
- }
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item,provinces);
- adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
- mProvinceSpinner.setAdapter(adapter);
- }
- //根據當前指定的省份更新對應的城市信息
- private void switchCity(String currProvince){
- ArrayList<String> cities = proCities.get(currProvince);
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item,cities);
- adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
- mCitySpinner.setAdapter(adapter);
- }
- 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<String, ArrayList<String>> data = new HashMap<String, ArrayList<String>>();
- for(int i=0; i<5; i++){
- ArrayList<String> cities = new ArrayList<String>();
- for(int j=0; j<5; j++){
- cities.add("cities"+i+j);
- }
- data.put("province"+i, cities);
- }
- final CitySpinner spinner = new CitySpinner(this, data);
- LinearLayout layout = (LinearLayout)this.findViewById(R.id.layout_demo);
- layout.addView(spinner);
- //CitySpinner spinner = (CitySpinner)this.findViewById(R.id.city_spinner);//在布局文件中加入,目前不行,待完善
- spinner.setOnCitySelectListener(new OnCitySelectListener() {
- @Override
- public void onCitySelected(String province, String city) {
- //
- Toast.makeText(DemoActivity.this, "當前省市:"+province+city, Toast.LENGTH_LONG).show();
- }
- });
- }
- }
可以看到,組件合成技術,如此簡單而已!
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
本文實例總結了 Android中Notification用法。分享給大家供大家參考,具體如下: 我們在用手機的時候,如果來了短信,而我們沒有點擊查看的話,是不是在
代碼如下:<FrameLayout &