您的位置:首页 > 移动开发 > Android开发

[置顶] Android省市区一,二,三联滚动选择器(使用Dialog样式的Activity实现)

2017-01-13 13:45 603 查看
项目中用到省市区滚动选择器,网上找到了很多相关文章,很多不完善也并不符合要求,下边是自己参考几篇博客写出的效果:



参考博客:http://blog.csdn.net/wulianghuan/article/details/41549189

将博客demo下载下来,其结构为:



demo中的MainActivity即是省市区滚轮选择器所依附的界面,Activity可以实现多种效果和样式,例如屏幕中间弹出,底部滑出等;项目中我实现的是从底部滑入和滑出的效果。

自定义一个style样式:

<style name="AnimBottom" parent="@android:style/Animation">
<!-- 窗体启动动画 -->
<item name="android:windowEnterAnimation">@anim/dialog_animation_enter</item>
<!-- 窗体关闭动画 -->
<item name="android:windowExitAnimation">@anim/dialog_animation_exit</item>
</style>

<style name="MyDialogStyleBottom" parent="@android:style/Theme.Dialog">
<!-- 窗体启动关闭动画 -->
<item name="android:windowAnimationStyle">@style/AnimBottom</item>
<!-- 窗体边框 -->
<item name="android:windowFrame">@null</item>
<!-- 窗体是否浮现在activity之上 -->
<item name="android:windowIsFloating">true</item>
<!-- 窗体半透明 -->
<item name="android:windowIsTranslucent">true</item>
<!-- 窗体无标题 -->
<item name="android:windowNoTitle">true</item>
<!-- 窗体背景 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 窗体背景模糊 -->
<item name="android:backgroundDimEnabled">true</item>
</style>


在清单文件中将滚动选择器所在的MainActivity的主题设置为这个样式:

android:theme="@style/MyDialogStyleBottom"


并且在MainActivity中的setContentView方法后设置全屏:

getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);


然后再res目录下创建两个动画效果:



dialog_animation_enter:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="100%p"  android:duration="400"/>
</set>


dialog_animation_exit:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:toYDelta="100%p"       android:duration="400"/>
</set>


所有效果设置完毕,MainActivity这个界面可以在任何你需要弹出地址选择的地方启动。

双联滚动:

修改目录layout中的布局xml

<kankan.wheel.widget.WheelView
android:id="@+id/id_province"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" >
</kankan.wheel.widget.WheelView>

<kankan.wheel.widget.WheelView
android:id="@+id/id_city"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" >
</kankan.wheel.widget.WheelView>

<kankan.wheel.widget.WheelView
android:id="@+id/id_district"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" >
</kankan.wheel.widget.WheelView>


删掉其中的一个WheelView

并且在MainActivity中注掉这四个方法中的一部分代码即可:

private void setUpViews() {
mViewProvince = (WheelView) findViewById(R.id.id_province);
mViewCity = (WheelView) findViewById(R.id.id_city);
//mViewDistrict = (WheelView) findViewById(R.id.id_district);
mBtnConfirm = (Button) findViewById(R.id.btn_confirm);
}

private void setUpListener() {
// 添加change事件
mViewProvince.addChangingListener(this);
// 添加change事件
mViewCity.addChangingListener(this);
// 添加change事件
//  mViewDistrict.addChangingListener(this);
// 添加onclick事件
mBtnConfirm.setOnClickListener(this);
}

private void setUpData() {
initProvinceDatas();
mViewProvince.setViewAdapter(new ArrayWheelAdapter<String>(BaseActivity.this, mProvinceDatas));
// 设置可见条目数量
mViewProvince.setVisibleItems(7);
mViewCity.setVisibleItems(7);
//mViewDistrict.setVisibleItems(7);
updateCities();
updateAreas();
}

/**
* 根据当前的市,更新区WheelView的信息
*/
private void updateAreas() {
int pCurrent = mViewCity.getCurrentItem();
mCurrentCityName = mCitisDatasMap.get(mCurrentProviceName)[pCurrent];
String[] areas = mDistrictDatasMap.get(mCurrentCityName);

if (areas == null) {
areas = new String[] { "" };
}
//      mViewDistrict.setViewAdapter(new ArrayWheelAdapter<String>(this, areas));
//      mViewDistrict.setCurrentItem(0);
}


单联滚动跟上述同理。

注意:

省市区数据源在assets目录下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐