/** * author : lipan * filename : AddCampusActivity.java * create_time : 2014年11月7日 下午2:10:47 */ package com.sets.speedtest.activity; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.apache.http.entity.StringEntity; import org.json.JSONArray; import org.json.JSONObject; import android.graphics.Rect; import android.os.Bundle; import android.os.Handler; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewTreeObserver; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.LinearLayout; import android.widget.TextView; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.location.LocationClientOption.LocationMode; import com.sets.speedtest.R; import com.sets.speedtest.common.ClearAutoCompleteEditText; import com.sets.speedtest.common.CommDialog; import com.sets.speedtest.common.CommToast; import com.sets.speedtest.common.MyArrayAdapter; import com.sets.speedtest.constant.C; import com.sets.speedtest.db.CampusDao; import com.sets.speedtest.domain.AddressInfo; import com.sets.speedtest.domain.Campus; import com.sets.speedtest.listener.ClearEditTextListener; import com.sets.speedtest.listener.CommListener; import com.sets.speedtest.listener.OnDialogClickListener; import com.sets.speedtest.manager.DBOpenManager; import com.sets.speedtest.manager.SharedPreferencesManager; import com.sets.speedtest.manager.http.BaseResponseHandler; import com.sets.speedtest.manager.http.WSClient; import com.sets.speedtest.utils.DateUtils; import com.sets.speedtest.utils.JsonUtils; import com.sets.speedtest.utils.ResponseParser; import com.sets.speedtest.utils.StringB; import com.sets.speedtest.utils.ViewUtils; import com.wangjie.androidinject.annotation.annotations.base.AILayout; import com.wangjie.androidinject.annotation.annotations.base.AISystemService; import com.wangjie.androidinject.annotation.annotations.base.AIView; /** * @author : lipan * @create_time : 2014年11月7日 下午2:10:47 * @desc : 填写其他学校地址 * @update_person: * @update_time : * @update_desc : * */ @AILayout(R.layout.activity_add_campus) public class AddCampusActivity extends BaseActivity { @AIView(id = R.id.cityET, clickMethod = "BtnClick") private ClearAutoCompleteEditText cityTextView; // 城市 @AIView(id = R.id.campusET, clickMethod = "BtnClick") private ClearAutoCompleteEditText campusTextView; // 大学自动补全 @AIView(id = R.id.classroomET, clickMethod = "BtnClick") private ClearAutoCompleteEditText classroomTextView; // 教室 @AIView(id = R.id.cityLayout) private LinearLayout cityLayout; // 城市layout @AIView(id = R.id.campusLayout) private LinearLayout campusLayout; // 大学layout @AISystemService private LayoutInflater layoutInflater; private Map<String, String> campusMap; // 所有大学信息:key学校;value城市 private List<String> cityList; // 所有城市信息 private LocationClient mLocationClient = null; private String locationCity = ""; // 定位城市 private String historyCity; // 记住历史城市 private String historyCampus; // 大学改变时检索详细地址;城市忽略。。因为大学的城市是固定的 private Boolean retry = false; // 是否需要重新获取详细地址信息列表 @AIView(id = R.id.main_parent) private LinearLayout mainLayout; // 最外层layout... private Integer keyboardHeight = 0; // 键盘高度 private Integer baseHeight = 0; // 除去键盘、状态栏、导航栏的剩余高度 private Integer statusBarHeight; // 状态栏高度 @Override public void BtnClick(View v) { switch (v.getId()) { case R.id.navi_btn_right: // 导航栏右上角 CommDialog.showConfirmDialog(getContext(), R.string.call_help, R.string.call_help_confirm, getString(R.string.dialog_cancel), getString(R.string.call_help_go), true, true, new OnDialogClickListener() { @Override public void onRightClick(View v) { ViewUtils.call(getContext(), getString(R.string.call_help_no)); } }); break; case R.id.next: // 表单信息是否为空 if (validate()) { commitAddInfo(); } break; case R.id.cityET: cityFocus(); break; case R.id.campusET: campusFocus(); break; case R.id.classroomET: classroomFocus(); break; case R.id.helpBtn: debugWithDialog("帮助信息"); break; default: break; } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initData(); initView(); } private void initView() { // 第一次打开应用时提示... if (SharedPreferencesManager.getInstance().getUserInfo().isFirst) { CommDialog.showInfoDialog(context, getString(R.string.comments), null); SharedPreferencesManager.getInstance().setIsFirst(false); } // 计算键盘高度 mainLayout.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (keyboardHeight < 100) { Rect r = new Rect(); mainLayout.getWindowVisibleDisplayFrame(r); int screenHeight = mainLayout.getRootView().getHeight(); keyboardHeight = screenHeight - (r.bottom - r.top); // 计算高度 baseHeight = ViewUtils.getDeviceHeight(getContext()) - statusBarHeight - keyboardHeight - getResources().getDimensionPixelSize(R.dimen.navi_height); } } }); // 状态栏高度 statusBarHeight = ViewUtils.getStatusBarHeight(getContext()); // 城市获得焦点,自动补全 cityTextView.setClearEditTextListener(new ClearEditTextListener() { @Override public void onFocusChange(View v, boolean hasFocus) { // 获得焦点时查询学校地址... if (hasFocus) { cityFocus(); } } @Override public void afterTextChanged(String s) { if (StringB.isBlank(s)) { historyCity = ""; campusTextView.setAdapter(null); } } }); // 大学获得焦点,自动补全大学信息(加城市参数) campusTextView.setClearEditTextListener(new ClearEditTextListener() { @Override public void onFocusChange(View v, boolean hasFocus) { // 获得焦点时查询学校地址... if (hasFocus) { campusFocus(); } } }); // 大学选中,更新城市 campusTextView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String campusChosen = ((TextView) view).getText().toString(); cityTextView.setText(campusMap.get(campusChosen)); } }); // 详细地址点击后展开 classroomTextView.setClearEditTextListener(new ClearEditTextListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { classroomFocus(); } } @Override public void afterTextChanged(String s) { if ("".equals(s)) { // 如果adapter内容非空;可能需要弹出补全框 if (null != classroomTextView.getAdapter() && classroomTextView.getAdapter().getCount() > 0) { classroomTextView.showDropDown(); } } } }); // 设置监听事件 setListener(new CommListener() { @Override public void allViewsOnTouchExcludeInput() { // TODO 不监听 ViewUtils.show(cityLayout); ViewUtils.show(campusLayout); } }); // 弹出键盘 ViewUtils.showSoftKeyboard(cityTextView); } private void initData() { // 获得城市信息 cityList = new CampusDao(DBOpenManager.getInstance().getBaseDb()).getCityList(); } // 城市获得焦点(点击/获得焦点) private void cityFocus() { if (null == cityTextView.getAdapter()) { // 城市自动补全 MyArrayAdapter<String> cityAdapter = new MyArrayAdapter<String>(this, R.layout.auto_complete_text_item, cityList.toArray(new String[0])); cityTextView.setAdapter(cityAdapter); cityTextView.setDropDownHeight(200); } // 如果文本内容非城市集合中的一个,重新设置一次文本的值,有可能触发自动补全下拉框 if (!cityList.contains(ViewUtils.getText(cityTextView))) { ViewUtils.setTextSelectionEnd(cityTextView, ViewUtils.getText(cityTextView)); } } // 地址获得焦点(点击/获得焦点) private void campusFocus() { // TODO 隐藏城市 // ViewUtils.hide(cityLayout); // 如果城市合法记录历史城市 if (cityList.contains(ViewUtils.getText(cityTextView))) { if (!ViewUtils.getText(cityTextView).equals(historyCity)) { // 城市合法并发生改变了,清空大学adapter campusTextView.setAdapter(null); } historyCity = ViewUtils.getText(cityTextView); } if (null == campusTextView.getAdapter()) { // 获得城市、学校信息 LinkedList<Campus> campusList = new CampusDao(DBOpenManager.getInstance().getBaseDb()) .getCampusList(historyCity); campusMap = new TreeMap<String, String>(); for (Campus campus : campusList) { campusMap.put(campus.name, campus.city); // 所有大学 } // 大学自动补全 MyArrayAdapter<String> campusAdapter = new MyArrayAdapter<String>(getContext(), R.layout.auto_complete_text_item, campusMap.keySet().toArray(new String[0])); campusTextView.setAdapter(campusAdapter); campusTextView.setDropDownHeight(baseHeight - getResources().getDimensionPixelSize(R.dimen.gap_100) + getResources().getDimensionPixelSize(R.dimen.gap_10)); } // 如果文本内容非地址集合中的一个,重新设置一次文本的值,有可能触发自动补全下拉框 if (!campusMap.containsKey(ViewUtils.getText(campusTextView))) { ViewUtils.setTextSelectionEnd(campusTextView, ViewUtils.getText(campusTextView)); } } // 详细地址获得焦点(点击/获得焦点) @SuppressWarnings("unchecked") private void classroomFocus() { // 城市/大学为空不处理 if (StringB.isBlank(ViewUtils.getText(cityTextView)) || StringB.isBlank(ViewUtils.getText(campusTextView))) { return; } // TODO 隐藏城市、地址layout ViewUtils.hide(cityLayout); ViewUtils.hide(campusLayout); // 跟上一次填写学校相同,不做http请求 if (ViewUtils.getText(campusTextView).equals(historyCampus) && !retry) { // 如果adapter内容非空;可能需要弹出补全框 if (null != classroomTextView.getAdapter() && classroomTextView.getAdapter().getCount() > 0) { // 如果详细地址为空,弹出全量补全框 if (StringB.isBlank(ViewUtils.getText(classroomTextView))) { classroomTextView.showDropDown(); } else // 如果文本内容非详细地址集合中的一个,重新设置一次文本的值,尝试触发补全框 if (!((MyArrayAdapter<String>) classroomTextView.getAdapter()).getList().contains( ViewUtils.getText(classroomTextView))) { ViewUtils.setTextSelectionEnd(classroomTextView, ViewUtils.getText(classroomTextView)); } } } else { // 保存当次点击详细地址时的大学名称 historyCampus = ViewUtils.getText(campusTextView); // 清空上一次请求的adapter classroomTextView.setAdapter(null); try { JSONObject data = new JSONObject(); data.put("city", ViewUtils.getText(cityTextView)); data.put("college", ViewUtils.getText(campusTextView)); // 上传 WSClient.postJson(getApplicationContext(), C.WS_GET_DETAIL_ADDRESS, new StringEntity(data.toString(), C.CHARSET_UTF8), new BaseResponseHandler( getContext(), R.string.get_detail_add, false) { public void onSuccess(int statusCode, JSONObject response) { if (C.RSP_CODE_SUCCESS == response.optInt(C.RSP_CODE)) { retry = false;// 该次请求成功... JSONArray addJsonArray = response.optJSONArray(C.RSP_DATA); if (addJsonArray.length() > 0) { List<String> addList = JsonUtils .jsonArray2List(addJsonArray); // 详细地址自动补全 MyArrayAdapter<String> classroomAdapter = new MyArrayAdapter<String>( getContext(), R.layout.auto_complete_text_item, addList); classroomTextView.setAdapter(classroomAdapter); classroomTextView.setDropDownHeight(baseHeight - getResources().getDimensionPixelSize( R.dimen.gap_50) + getResources().getDimensionPixelSize( R.dimen.gap_10)); if (ViewUtils.isEmpty(classroomTextView)) { classroomTextView.showDropDown(); }else { ViewUtils.setTextSelectionEnd(classroomTextView, ViewUtils.getText(classroomTextView)); } } } }; @Override public void onFinish() { super.onFinish(); // 隐藏loading... ViewUtils.showSoftKeyboard(classroomTextView); // 弹出软键盘 } @Override public void onFailure(Throwable error, String content) { // 请求失败,需要重新尝试请求 retry = true;// 该次请求异常... } }); } catch (Exception e) { e.printStackTrace(); } } } /** * 信息校验 */ private boolean validate() { if (StringB.isBlank(ViewUtils.getText(cityTextView))) { CommToast.showInfo(getContext(), getString(R.string.is_empty, "城市")); return false; } else if (!cityList.contains(ViewUtils.getText(cityTextView))) { CommToast.showInfo(getContext(), getString(R.string.is_empty, "正确的城市")); return false; } if (StringB.isBlank(ViewUtils.getText(campusTextView))) { CommToast.showInfo(getContext(), getString(R.string.is_empty, "地址")); return false; } if (StringB.isBlank(ViewUtils.getText(classroomTextView))) { CommToast.showInfo(getContext(), getString(R.string.is_empty, "详细地址")); return false; } return true; } /** * 下一步;提交地址信息 */ private void commitAddInfo() { // 定位的城市和输入的城市不一样 if (StringB.isNotBlank(locationCity) && !locationCity.equals(ViewUtils.getText(cityTextView))) { CommDialog.showConfirmDialog(context, R.string.city_not_in_position, new OnDialogClickListener() { @Override public void onLeftClick(View v) { return; } @Override public void onRightClick(View v) { commit(); } }); }else { commit(); } } private void commit() { try { final JSONObject params = new JSONObject(); params.put("city", ViewUtils.getText(cityTextView)); params.put("college", ViewUtils.getText(campusTextView)); params.put("address", ViewUtils.getText(classroomTextView)); StringEntity entity = new StringEntity(params.toString(), C.CHARSET_UTF8); WSClient.postJson(getContext(), C.WS_SAVE_ADDRESS, entity, new BaseResponseHandler(getContext(), R.string.save_add, null) { @Override public void onSuccess(int statusCode, JSONObject response) { ResponseParser handler = ResponseParser.handler( getContext(), response); if (handler.success) { // 记录地址Id~~ // SharedPreferencesManager.getInstance().setAddressId( // handler.data.optInt("addressId")); // 传参 AddressInfo address = new AddressInfo(params .optString("city"), params .optString("college"), params .optString("address"), handler.data .optInt("addressId")); Bundle data = new Bundle(); data.putParcelable(AddressInfo.KEY, address); startActivity(SpeedTestActivity.class, data); } else { CommToast.showInfo(getContext(), handler.errorMsg); } } @Override public void onFailure(Throwable error, String content) { CommToast.showInfo(getContext(), getString(R.string.system_error)); } }); } catch (Exception e) { CommToast.showInfo(getContext(), getString(R.string.system_error)); } } /** * 初始化定位       */ private void initLocation() { // 定位初始化 mLocationClient = new LocationClient(getApplicationContext()); // 声明LocationClient类 mLocationClient.registerLocationListener(new BDLocationListener() { @Override public void onReceiveLocation(BDLocation location) { if (null == location) { return; } // 自动补全城市 这里为了和百一测评大学码表的城市字段统一,去掉"市"字 String cityName = location.getCity(); if (!StringB.isBlank(cityName) && ViewUtils.isEmpty(cityTextView) && cityList.contains(locationCity = cityName.trim().replaceAll("市", ""))) { // locationCity = cityName.trim().replaceAll("市", ""); // 缓存定位的 ViewUtils.setTextSelectionEnd(cityTextView, cityName.replaceAll("市", "")); new Handler().postDelayed(new Runnable() { @Override public void run() { cityTextView.dismissDropDown(); } }, 300); if (mLocationClient.isStarted()) { mLocationClient.stop(); } } } }); // 注册监听函数 LocationClientOption option = new LocationClientOption(); option.setOpenGps(false); // 打开gps option.setLocationMode(LocationMode.Battery_Saving);// 设置定位模式 option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02 option.setScanSpan(30000);// 设置发起定位请求的间隔时间为30s option.setIsNeedAddress(true);// 返回的定位结果包含地址信息 option.setNeedDeviceDirect(false);// 返回的定位结果包含手机机头的方向 mLocationClient.setLocOption(option); mLocationClient.start(); mLocationClient.requestLocation(); // 请求获取位置信息 } @Override protected void onResume() { super.onResume(); initLocation(); } @Override protected void onPause() { super.onPause(); if (mLocationClient.isStarted()) { mLocationClient.stop(); } } private long mExitTime; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if ((DateUtils.getCurrentMillis() - mExitTime) > 2000) { CommToast.showInfo(this, R.string.exit_app, Gravity.BOTTOM, 0, getResources() .getDimensionPixelSize(R.dimen.gap_50)); mExitTime = DateUtils.getCurrentMillis(); } else { CommToast.dismiss(); // 两次按返回键在两秒内,那么退出应用 finish(); } return true; } return super.onKeyDown(keyCode, event); } }