【文件属性】:
文件名称:android地址选择器
文件大小:1.09MB
文件格式:RAR
更新时间:2018-08-16 13:18:24
android 地区 选择器
1.省,市,区三级关联
2.地址数据本地化
3.自定义对话框
4.支付从xml文件,或对象文件加载
部分代码:
package com.demo.selector;
import java.io.InputStream;
import com.address.selector.City;
import com.address.selector.Country;
import com.address.selector.Province;
import com.address.selector.Region;
import com.demo.address.R;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.AdapterView.OnItemSelectedListener;
public class AddressSelectorDialog extends BaseDialog {
/**省类型*/
private static final int INDEX_PROVINCE = 1;
/**城市类型*/
private static final int INDEX_CITY = 2;
/**区县类型*/
private static final int INDEX_REGION = 3;
private static Country china = null;
private Spinner spnProvince = null;
private Spinner spnCity = null;
private Spinner spnRegion = null;
private ArrayAdapter dptProvince = null;
private ArrayAdapter dptCity = null;
private ArrayAdapter dptRegion = null;
private SpinnerSelectedListener proListener = new SpinnerSelectedListener();
private SpinnerSelectedListener cityListener = new SpinnerSelectedListener();
private SpinnerSelectedListener regionListener = new SpinnerSelectedListener();
//当前选择地区的索引值
private int provinceId = -1;
private int cityId = -1;
private int regionId = -1;
/**选择按钮*/
private Button btnSelect = null;
/**回调用事件*/
private OnSelectorCancel selectorCancel = null;
@Override
public void init(Context context) {
// TODO Auto-generated method stub
this.context = context;
dialog = new Dialog(this.context,R.style.CustomDialog);
dialog.setContentView(R.layout.adress_selector);
spnProvince = (Spinner)dialog.findViewById(R.id.spin_province);
spnProvince.setTag(new Integer(INDEX_PROVINCE));
spnCity = (Spinner)dialog.findViewById(R.id.spin_city);
spnCity.setTag(new Integer(INDEX_CITY));
spnRegion = (Spinner)dialog.findViewById(R.id.spin_region);
spnRegion.setTag(new Integer(INDEX_REGION));
btnSelect = (Button)dialog.findViewById(R.id.btn_select);
btnSelect.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
selectAddress();
}
});
//当对话框隐藏后调用[回调事件]
dialog.setOnCancelListener(new OnCancelListener(){
@Override
public void onCancel(DialogInterface arg0) {
// TODO Auto-generated method stub
if (selectorCancel != null) {
String proName = "";
String cityName = "";
String regName = "";
try {
Province tmpPro = china.provinceLst.get(provinceId);
proName = tmpPro.areaName;
City tmpCity = tmpPro.cityLst.get(cityId);
cityName = tmpCity.areaName;
Region tmpReg = tmpCity.regionLst.get(regionId);
regName = tmpReg.areaName;
} catch (Exception e) {
android.util.Log.e("selectorCancel???", e.getMessage());
}
selectorCancel.onSelectorResult(proName, cityName, regName);
}
}
});
//加载数据
if (china == null) {
loadCountryAddressData();
}
//加载完后,初始化适配器
initAdapters();
}
@Override
public void update(Object obj) {
// TODO Auto-generated method stub
}
private void loadCountryAddressData() {
try {
/**
* 反序化的包名,类名,版本ID必须一致,否则ClassNotFoundException
*/
InputStream stream = this.context.getAssets().open("china-city.obj");
china = Country.loadFromStream(stream);
//mHandler.sendEmptyMessage(0);
} catch (Exception e) {
android.util.Log.e("error", e.getMessage());
}
}
class SpinnerSelectedListener implements OnItemSelectedListener{
@Override
public void onItemSelected (AdapterView> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
//android.util.Log.i("", String.format("[pos=%d]",position));
int index = (Integer)parent.getTag();
//ArrayAdapter obj = (ArrayAdapter)(parent.getAdapter());
//String value = obj.getItem(position);
//android.util.Log.i("", "value=" + value);
if (index == INDEX_PROVINCE) {
provinceId = position;
if (isValideProvinceIndex(provinceId)) {
//改变城市选择
Province tmpProvince = china.provinceLst.get(provinceId);
String lstNames[] = tmpProvince.listNames();
if (lstNames == null) { //没有城市,当然没区县
provinceId = -1;
spnCity.setVisibility(View.INVISIBLE);
regionId = -1;
spnRegion.setVisibility(View.INVISIBLE);
return ;
} else {
if (spnCity.getVisibility() == View.INVISIBLE) {
spnCity.setVisibility(View.VISIBLE);
}
if (spnRegion.getVisibility() == View.INVISIBLE) {
spnRegion.setVisibility(View.INVISIBLE);
}
}
dptCity = new ArrayAdapter(context,
android.R.layout.simple_spinner_item,
lstNames);
dptCity.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spnCity.setAdapter(dptCity);
spnCity.setOnItemSelectedListener(cityListener);
}
} else if (index == INDEX_CITY) {
cityId = position;
if (isValideCityIndex(provinceId,cityId)) {
//改变区选择
Province tmpProvince = china.provinceLst.get(provinceId);
City tmpCity = tmpProvince.cityLst.get(cityId);
String lstNames[] = tmpCity.listNames();
if (lstNames == null) { //没有区县
regionId = -1;
spnRegion.setVisibility(View.INVISIBLE);
return ;
} else if (spnRegion.getVisibility() == View.INVISIBLE) {
spnRegion.setVisibility(View.VISIBLE);
}
dptRegion = new ArrayAdapter(context,
android.R.layout.simple_spinner_item,
lstNames);
dptRegion.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spnRegion.setAdapter(dptRegion);
spnRegion.setOnItemSelectedListener(regionListener);
}
} else if (index == INDEX_REGION) {
regionId = position;
}
}
@Override
public void onNothingSelected(AdapterView> parent) {
// TODO Auto-generated method stub
}
}
private void initAdapters() {
dptProvince = new ArrayAdapter(this.context,
android.R.layout.simple_spinner_item,
china.listNames());
//设置下拉列表的风格
dptProvince.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//设置适配器
spnProvince.setAdapter(dptProvince);
//设置侦听事件
spnProvince.setOnItemSelectedListener(proListener);
}
private boolean isValideProvinceIndex(int index) {
return (china != null) && (index >= 0 && index < china.provinceLst.size());
}
private boolean isValideCityIndex(int provinceIndex,int cityIndex) {
boolean boA = isValideProvinceIndex(provinceIndex);
if (boA) {
return (cityIndex >= 0) &&
(china.provinceLst.get(provinceIndex).cityLst.size() > cityIndex);
}
return false;
}
private void selectAddress() {
hide();
}
/**
* 调协回调事件
* @param selectorCancel
*/
public void setOnSelectorCancel(OnSelectorCancel selectorCancel) {
this.selectorCancel = selectorCancel;
}
/**
* 选择器关闭后,调用回调事件接口
*/
public interface OnSelectorCancel {
/**
* @param proName 省份名
* @param cityName 城市名
* @param regName 区县名
*/
public void onSelectorResult(String proName,String cityName,String regName);
};
}
【文件预览】:
地址选择器Demo
----AddressSelector.jar(10KB)
----china-city.obj(206KB)
----AddressSelector.rar(1.05MB)