本组件主要用到了一个开源项目 Android Wheel Control 和 android的popWindow弹窗技术;
实现效果如下图:
不说废话,直接上代码
核心处理代码:
package com.example.poptest;
import kankan.wheel.widget.OnWheelChangedListener;
import kankan.wheel.widget.OnWheelScrollListener;
import kankan.wheel.widget.WheelView;
import kankan.wheel.widget.adapters.AbstractWheelTextAdapter;
import kankan.wheel.widget.adapters.ArrayWheelAdapter;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Display;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.TextView;
/****
* @production packview风格的三级城市底部弹出菜单组件
* @company android技术帮--【技术成就梦想】
* @department 群号:85506951
* @author 大灰狼叔叔(qq:953486326)
* {@docRoot 利用Android Wheel Control 实现的packview风格的三级城市底部弹出菜单 }
* @version 1.0
* @since 2013\4\15
* @see 欢迎对android感兴趣的童鞋加入android技术帮,共同学习,共同进步!
* ****/
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private Button button,button_ok;
RelativeLayout test_pop_layout;
int width,height;
private TextView tt ;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取屏幕的高度和宽度
Display display = this.getWindowManager().getDefaultDisplay();
width = display.getWidth();
height = display.getHeight();
// 获取弹出的layout
test_pop_layout = (RelativeLayout)findViewById(R.id.test_pop_layout);
tt = (TextView)findViewById(R.id.tpop2_tv);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// 显示 popupWindow
PopupWindow popupWindow = makePopupWindow(MainActivity.this);
int[] xy = new int[2];
test_pop_layout.getLocationOnScreen(xy);
popupWindow.showAtLocation(test_pop_layout,Gravity.CENTER|Gravity.BOTTOM, 0, -height);
}
});
}
// Scrolling flag
private boolean scrolling = false;
private TextView tv;
// 创建一个包含自定义view的PopupWindow
private PopupWindow makePopupWindow(Context cx)
{
final PopupWindow window;
window = new PopupWindow(cx);
View contentView = LayoutInflater.from(this).inflate(R.layout.cities_layout, null);
window.setContentView(contentView);
tv = (TextView)contentView.findViewById(R.id.tv_cityName);
final WheelView country = (WheelView) contentView.findViewById(R.id.country);
country.setVisibleItems(3);
country.setViewAdapter(new CountryAdapter(this));
final String cities[][] = AddressData.CITIES;
final String ccities[][][] = AddressData.COUNTIES;
final WheelView city = (WheelView) contentView.findViewById(R.id.city);
city.setVisibleItems(0);
country.addChangingListener(new OnWheelChangedListener() {
public void onChanged(WheelView wheel, int oldValue, int newValue) {
if (!scrolling) {
updateCities(city, cities, newValue);
}
}
});
country.addScrollingListener( new OnWheelScrollListener() {
public void onScrollingStarted(WheelView wheel) {
scrolling = true;
}
public void onScrollingFinished(WheelView wheel) {
scrolling = false;
updateCities(city, cities, country.getCurrentItem());
tv.setText( AddressData.PROVINCES[country.getCurrentItem()] );
}
});
// 地区选择
final WheelView ccity = (WheelView) contentView.findViewById(R.id.ccity);
ccity.setVisibleItems(0);
city.addChangingListener(new OnWheelChangedListener() {
public void onChanged(WheelView wheel, int oldValue, int newValue) {
if (!scrolling) {
updatecCities(ccity, ccities, country.getCurrentItem(),newValue);
}
}
});
city.addScrollingListener( new OnWheelScrollListener() {
public void onScrollingStarted(WheelView wheel) {
scrolling = true;
}
public void onScrollingFinished(WheelView wheel) {
scrolling = false;
updatecCities(ccity, ccities, country.getCurrentItem(), city.getCurrentItem());
tv.setText(
AddressData.PROVINCES[country.getCurrentItem()] + "-" +
AddressData.CITIES[country.getCurrentItem()][city.getCurrentItem()]);
}
});
ccity.addScrollingListener( new OnWheelScrollListener() {
public void onScrollingStarted(WheelView wheel) {
scrolling = true;
}
public void onScrollingFinished(WheelView wheel) {
scrolling = false;
tv.setText(
AddressData.PROVINCES[country.getCurrentItem()] + "-" +
AddressData.CITIES[country.getCurrentItem()][city.getCurrentItem()] + "-" +
AddressData.COUNTIES[country.getCurrentItem()][city.getCurrentItem()][ccity.getCurrentItem()]);
}
});
country.setCurrentItem(1);
// 点击事件处理
button_ok = (Button)contentView.findViewById(R.id.button_ok);
button_ok.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
tt.setText(AddressData.PROVINCES[country.getCurrentItem()] + "-" +
AddressData.CITIES[country.getCurrentItem()][city.getCurrentItem()] + "-" +
AddressData.COUNTIES[country.getCurrentItem()][city.getCurrentItem()][ccity.getCurrentItem()]);
window.dismiss(); // 隐藏
}
});
window.setWidth(width);
window.setHeight(height/2);
// 设置PopupWindow外部区域是否可触摸
window.setFocusable(true); //设置PopupWindow可获得焦点
window.setTouchable(true); //设置PopupWindow可触摸
window.setOutsideTouchable(true); //设置非PopupWindow区域可触摸
return window;
}
/**
* Updates the city wheel
*/
private void updateCities(WheelView city, String cities[][], int index) {
ArrayWheelAdapter<String> adapter =
new ArrayWheelAdapter<String>(this, cities[index]);
adapter.setTextSize(18);
city.setViewAdapter(adapter);
city.setCurrentItem(cities[index].length / 2);
}
/**
* Updates the ccity wheel
*/
private void updatecCities(WheelView city, String ccities[][][], int index,int index2) {
ArrayWheelAdapter<String> adapter =
new ArrayWheelAdapter<String>(this, ccities[index][index2]);
adapter.setTextSize(18);
city.setViewAdapter(adapter);
city.setCurrentItem(ccities[index][index2].length / 2);
}
/**
* Adapter for countries
*/
private class CountryAdapter extends AbstractWheelTextAdapter {
// Countries names
private String countries[] = AddressData.PROVINCES;
/**
* Constructor
*/
protected CountryAdapter(Context context) {
super(context, R.layout.country_layout, NO_RESOURCE);
setItemTextResource(R.id.country_name);
}
@Override
public View getItem(int index, View cachedView, ViewGroup parent) {
View view = super.getItem(index, cachedView, parent);
return view;
}
@Override
public int getItemsCount() {
return countries.length;
}
@Override
protected CharSequence getItemText(int index) {
return countries[index];
}
}
}
核心布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:orientation="vertical" android:background="@drawable/layout_bg" android:layout_width="fill_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/tv_cityName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:layout_marginLeft="5dp" android:text="请选择城市" android:layout_weight="2"/> <Button android:id="@+id/button_ok" android:layout_width="12dip" android:layout_height="wrap_content" android:layout_gravity="right" android:layout_marginTop="5dp" android:layout_marginRight="5dp" android:text="确定" android:layout_weight="1"/> </LinearLayout> <LinearLayout android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_width="fill_parent" android:paddingLeft="12dp" android:paddingRight="12dp" android:paddingTop="4dp" android:layout_marginTop="8dp" android:orientation="horizontal"> <kankan.wheel.widget.WheelView android:id="@+id/country" android:layout_height="110dp" android:layout_width="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1"/> <kankan.wheel.widget.WheelView android:id="@+id/city" android:layout_height="110dp" android:layout_width="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="5dp" android:layout_weight="1"/> <kankan.wheel.widget.WheelView android:id="@+id/ccity" android:layout_height="110dp" android:layout_width="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="5dp" android:layout_weight="1"/> </LinearLayout> <!-- Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="18dp" android:textSize="18sp" android:text=" Next > "/--> </LinearLayout>
也可以到csdn下载:
http://download.youkuaiyun.com/detail/helloworldjavaee/5260020