Android城市时间选择器Demo

出于个人的好奇心,稍微观察了一下现在有很多的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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值