出于个人的好奇心,稍微观察了一下现在有很多的app都使用到了城市地址选择或者日期选择的功能,一般的格式都底部弹出以滚轮的形式展示,在此我也做了一个demo,主要是为了以后使用方便,如果有需要的可以参考一下,有更好意见的可以给我留言,我们一起进步,先来看看效果图:
具体的显示就是上面的效果,其他就不多说了,直接上代码:
MainActivity.java
package com.text.cityanddateselectdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.text.cityanddateselectdemo.city.DialogSelectAddress;
import com.text.cityanddateselectdemo.city.OnSelectCityDialog;
import com.text.cityanddateselectdemo.date.DialogSelectTime;
import com.text.cityanddateselectdemo.date.OnSelectDateDialog;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, OnSelectDateDialog, OnSelectCityDialog {
private Button cityBtn;
private Button dateBtn;
private TextView selectCity;
private TextView selectDate;
private DialogSelectTime timeDialog;
private DialogSelectAddress cityDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cityBtn = (Button) findViewById(R.id.city);
dateBtn = (Button) findViewById(R.id.date);
selectCity = (TextView) findViewById(R.id.select_city);
selectDate = (TextView) findViewById(R.id.select_date);
cityBtn.setOnClickListener(this);
dateBtn.setOnClickListener(this);
timeDialog = new DialogSelectTime(MainActivity.this, this);
cityDialog = new DialogSelectAddress(MainActivity.this, this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.city:
cityDialog.showDialog();
break;
case R.id.date:
timeDialog.showTimeDialog();
break;
}
}
@Override
public void OnSelectDate(String selected) {
selectDate.setText(selected);
}
@Override
public void onSelectCity(String selectedCity, String cityCode, String pidCode) {
selectCity.setText(selectedCity + " 省编码:" + cityCode + "城市编码:" + pidCode);
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<Button
android:id="@+id/city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="城市选择" />
<TextView
android:id="@+id/select_city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选择的日期:" />
<Button
android:id="@+id/date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="日期选择" />
<TextView
android:id="@+id/select_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选择的日期:" />
</LinearLayout>
城市选择的弹出框DialogSelectAddress.java
package com.text.cityanddateselectdemo.city;
import android.app.Activity;
import android.app.AlertDialog;
import android.view.Display;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;
import com.text.cityanddateselectdemo.R;
import com.text.cityanddateselectdemo.wheel.OnWheelChangedListener;
import com.text.cityanddateselectdemo.wheel.WheelView;
import com.text.cityanddateselectdemo.wheel.adapters.ArrayWheelAdapter;
/**
* @author lipiao
* 省-市 地址选择弹出框
*/
public class DialogSelectAddress implements OnWheelChangedListener, View.OnClickListener {
private WheelView mViewProvince;
private WheelView mViewCity;
private AlertDialog dialog;
private CityDataUtil dataUtil;
private TextView selectCitySure;
private TextView selectCityCancel;
private OnSelectCityDialog selectCityDialog;
private Activity activity;
public DialogSelectAddress(Activity activity, OnSelectCityDialog selectCityDialog) {
this.activity = activity;
this.selectCityDialog = selectCityDialog;
}
public void showDialog() {
dataUtil = new CityDataUtil(activity);
View view = LayoutInflater.from(activity).inflate(R.layout.dialog_city_select, null);
AlertDialog.Builder builder = new AlertDialog.Builder(activity, R.style.Dialot_CitySelect);
builder.setView(view);
setUpViews(view);
dialog = builder.create();
dialog.setView(view);
dialog.show();
dialog.getWindow().setGravity(Gravity.BOTTOM);
WindowManager windowManager = activity.getWindowManager();
Display display = windowManager.getDefaultDisplay();
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
lp.width = (int) (display.getWidth());
dialog.getWindow().setAttributes(lp);
}
private void setUpViews(View view) {
mViewProvince = (WheelView) view.findViewById(R.id.id_province);
mViewCity = (WheelView) view.findViewById(R.id.id_city);
selectCitySure = (TextView) view.findViewById(R.id.select_city_sure);
selectCityCancel = (TextView) view.findViewById(R.id.select_city_cancel);
// 添加change事件
mViewProvince.addChangingListener(this);
mViewCity.addChangingListener(this);
selectCityCancel.setOnClickListener(this);
selectCitySure.setOnClickListener(this);
dataUtil.initProvinceDatas();
mViewProvince.setViewAdapter(new ArrayWheelAdapter<String>(activity, dataUtil.mProvinceDatas));
// 设置可见条目数量
mViewProvince.setVisibleItems(7);
mViewCity.setVisibleItems(7);
updateCities();
}
@Override
public void onChanged(WheelView wheel, int oldValue, int newValue) {
if (wheel == mViewProvince) {
updateCities();
} else if (wheel == mViewCity) {
dataUtil.mCurrentCityName = dataUtil.mCitisDatasMap.get(dataUtil.mCurrentProviceName)[newValue];
}
}
/**
* 根据当前的省,更新市WheelView的信息
*/
private void updateCities() {
int pCurrent = mViewProvince.getCurrentItem();
dataUtil.mCurrentProviceName = dataUtil.mProvinceDatas[pCurrent];
if (dataUtil.mCitisDatasMap.get(dataUtil.mCurrentProviceName).length <= 0) {
dataUtil.mCurrentCityName = " ";
} else {
dataUtil.mCurrentCityName = dataUtil.mCitisDatasMap.get(dataUtil.mCurrentProviceName)[0];
}
String[] cities = dataUtil.mCitisDatasMap.get(dataUtil.mCurrentProviceName);
if (cities.length <= 0) {
cities = new String[]{""};
}
mViewCity.setViewAdapter(new ArrayWheelAdapter<String>(activity, cities));
mViewCity.setCurrentItem(0);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.select_city_cancel:
dialog.dismiss();
break;
case R.id.select_city_sure:
String[] codeString = dataUtil.stringGetCode(dataUtil.mCurrentProviceName, dataUtil.mCurrentCityName).split(" ");
if (codeString.length == 2) {
selectCityDialog.onSelectCity(dataUtil.mCurrentProviceName + " " + dataUtil.mCurrentCityName, codeString[1], codeString[0]);
} else {
selectCityDialog.onSelectCity(dataUtil.mCurrentProviceName + " " + dataUtil.mCurrentCityName, "", codeString[0]);
}
dialog.dismiss();
break;
}
}
}
时间选择的弹出框DialogSelectTime.java
package com.text.cityanddateselectdemo.date;
import android.app.Activity;
import android.app.AlertDialog;
import android.view.Display;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;
import com.text.cityanddateselectdemo.R;
import com.text.cityanddateselectdemo.wheel.OnWheelChangedListener;
import com.text.cityanddateselectdemo.wheel.WheelView;
import com.text.cityanddateselectdemo.wheel.adapters.ArrayWheelAdapter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
/**
* @author lipiao
* 时间选择弹出框
*/
public class DialogSelectTime implements OnWheelChangedListener, View.OnClickListener {
private AlertDialog dialog;
private Activity activity;
private WheelView mViewYear;
private WheelView mViewMonth;
private TextView selectDateSure;
private TextView selectDateCancel;
private Calendar calendar;
private OnSelectDateDialog selectDateDialog;
private String[] month;
private String[] year;
public DialogSelectTime(Activity activity, OnSelectDateDialog selectDateDialog) {
this.activity = activity;
this.selectDateDialog = selectDateDialog;
calendar = Calendar.getInstance();
}
public void showTimeDialog() {
View view = LayoutInflater.from(activity).inflate(R.layout.dialog_date_select, null);
AlertDialog.Builder builder = new AlertDialog.Builder(activity, R.style.Dialot_CitySelect);
builder.setView(view);
initDialogView(view);
dialog = builder.create();
dialog.setView(view);
dialog.show();
dialog.getWindow().setGravity(Gravity.BOTTOM);
WindowManager windowManager = activity.getWindowManager();
Display display = windowManager.getDefaultDisplay();
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
lp.width = (int) (display.getWidth());
dialog.getWindow().setAttributes(lp);
}
/**
* 初始化弹出
*
* @param view
*/
public void initDialogView(View view) {
mViewYear = (WheelView) view.findViewById(R.id.id_year);
mViewMonth = (WheelView) view.findViewById(R.id.id_month);
selectDateCancel = (TextView) view.findViewById(R.id.select_date_cancel);
selectDateSure = (TextView) view.findViewById(R.id.select_date_sure);
mViewYear.addChangingListener(this);
mViewMonth.addChangingListener(this);
mViewYear.setVisibleItems(7);
mViewMonth.setVisibleItems(7);
selectDateCancel.setOnClickListener(this);
selectDateSure.setOnClickListener(this);
year = initDate();
mViewYear.setViewAdapter(new ArrayWheelAdapter<String>(activity, year));
mViewYear.setCurrentItem(year.length - 7);
updateMonth();
}
/**
* 初始化时间-年
*/
private String[] initDate() {
int year = calendar.get(Calendar.YEAR);
List<String> date_year = new ArrayList<String>();
for (int i = year - 60; i <= year; i++) {
date_year.add(i + "年");
}
return date_year.toArray(new String[date_year.size()]);
}
@Override
public void onChanged(WheelView wheel, int oldValue, int newValue) {
if (wheel == mViewYear) {
updateMonth();
} else if (wheel == mViewMonth) {
}
}
/**
* 月份选择
*/
private void updateMonth() {
int currentYear = mViewYear.getCurrentItem();
int month_year = calendar.get(Calendar.MONTH) + 1;
List<String> date_month = new ArrayList<String>();
if (currentYear == 60) {
for (int i = 1; i <= month_year; i++) {
date_month.add(i + "月");
}
} else {
for (int i = 1; i <= 12; i++) {
date_month.add(i + "月");
}
}
month = date_month.toArray(new String[date_month.size()]);
mViewMonth.setViewAdapter(new ArrayWheelAdapter<String>(activity, month));
mViewMonth.setCurrentItem(0);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.select_date_cancel:
dialog.dismiss();
break;
case R.id.select_date_sure:
selectDateDialog.OnSelectDate(year[mViewYear.getCurrentItem()] + " " + month[mViewMonth.getCurrentItem()]);
dialog.dismiss();
break;
}
}
}
主要的一些代码就在这里了,大家可以参考一下,如需完整可运行项目可以点击下面地址下载,CSDN今天上传代码一直失败,所以就放在百度云盘了,如果不能下载,可以留言邮箱,有时间给各位发送,若有更好代码的请分享,希望大家多多指教
http://pan.baidu.com/s/1dFHrynB