AsyncHttpClient 登录 Application Fragment 回调 监听 软键盘
Activity
/**登录界面及登陆后用户首页界面,使用两个Fragment实现*/public class LoginActivity extends Activity implements LoginInterface {/** 存放Fragment的容器 */private View fragmentContainer;/** 在使用replace替换Fragment是需要一个id */public static final int ROOT_ID = 0x0011223344;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);fragmentContainer = new ScrollView(this);//可以滚动fragmentContainer.setBackgroundColor(0xfffbf7ed);fragmentContainer.setId(ROOT_ID);setContentView(fragmentContainer);LoginFragment loginFragment = new LoginFragment();getFragmentManager().beginTransaction().replace(ROOT_ID, loginFragment).commit();loginFragment.setLoginInterface(this);//当登录后采用回调方式重新加载用户信息//如果进入此Activity时有出入账户密码,则直接登录Bundle bundle = getIntent().getExtras();if (bundle != null) {String account = bundle.getString("account");String password = bundle.getString("password");loginFragment.login(this, account, password);}}@Override/**第三步,让【被调用者】实现此接口,并在实现的方法中自定义自己的回调逻辑*/public void loginComplete(boolean isSuccess, String result) {MyHeadFragment headFragment = new MyHeadFragment();Bundle bundle = new Bundle();bundle.putString("result", result);bundle.putBoolean("isSuccess", isSuccess);headFragment.setArguments(bundle);getFragmentManager().beginTransaction().replace(ROOT_ID, headFragment).commitAllowingStateLoss();//当使用commit方法时,系统将进行状态判断,如果状态(mStateSaved)已经保存,将发生"Can not perform this action after onSaveInstanceState"错误。}}
Application
/**用于设置全局变量*/public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();mApplication = this;}private static MyApplication mApplication = null;public static MyApplication getApplication() {return mApplication;}private UserBean mUser;public UserBean getUser() {return mUser;}public void setUser(UserBean mUser) {this.mUser = mUser;}@Overridepublic void onTerminate() {//当终止应用程序对象时调用,不保证一定被调用super.onTerminate();System.gc();}}
LoginFragment
public class LoginFragment extends Fragment implements OnClickListener, ITextChangeListener, OnLayoutChangeListener {private Activity mContext;private View root;private ImageView iv_close;private LinearLayout ll_third_login;private RelativeLayout rl_root;private RelativeLayout rl_login;private TextView tv_qq_login;private TextView tv_wechat_login;private TextView tv_forget;private TextView tv_login;private TextView tv_signup;private TextView tv_tips;private MineLoginEditText et_account;private MineLoginEditText et_pass;private Rect firstRect; //用于储存开始的可见区域@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {mContext = getActivity();root = inflater.inflate(R.layout.fragment_login, container, false);findViews();initViews();setOnClickListeners();return root;}//***********************************************************************************************************************************// 初始化//***********************************************************************************************************************************private void findViews() {rl_root = (RelativeLayout) root.findViewById(R.id.rl_root);iv_close = (ImageView) root.findViewById(R.id.iv_close);ll_third_login = (LinearLayout) root.findViewById(R.id.ll_third_login);tv_qq_login = (TextView) root.findViewById(R.id.tv_qq_login);tv_wechat_login = (TextView) root.findViewById(R.id.tv_wechat_login);rl_login = (RelativeLayout) root.findViewById(R.id.rl_login);tv_tips = (TextView) root.findViewById(R.id.tv_tips);et_account = (MineLoginEditText) root.findViewById(R.id.et_account);et_pass = (MineLoginEditText) root.findViewById(R.id.et_pass);tv_forget = et_pass.getTv_forget();tv_signup = (TextView) root.findViewById(R.id.tv_signup);tv_login = (TextView) root.findViewById(R.id.tv_login);}private void initViews() {et_account.setTextChangeListener(this);et_account.getEditText().setHint("请输入账号");et_account.getTv_forget().setWidth(0);//若设置setVisibility则后面有可能显示出来了et_pass.setTextChangeListener(this);et_pass.getEditText().setHint("请输入密码");et_pass.getEditText().setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);rl_root.addOnLayoutChangeListener(this);rl_root.post(new Runnable() {@Overridepublic void run() {firstRect = new Rect();rl_root.getWindowVisibleDisplayFrame(firstRect);}});}private void setOnClickListeners() {iv_close.setOnClickListener(this);tv_qq_login.setOnClickListener(this);tv_wechat_login.setOnClickListener(this);tv_signup.setOnClickListener(this);tv_login.setOnClickListener(this);tv_forget.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.iv_close:if (loginInterface != null) loginInterface.loginComplete(false, "这哥们按了关闭按钮,并没有登录");break;case R.id.tv_login:login(mContext, et_account.getEditText().getText().toString().trim(), et_pass.getEditText().getText().toString().trim());break;case R.id.tv_signup://直接登录login(mContext, "103468", "103468");break;case R.id.tv_qq_login://qq登录break;case R.id.tv_wechat_login://微信登录break;case R.id.tv_forget://跳到找回密码界面break;default:break;}}//***********************************************************************************************************************************// 登录//***********************************************************************************************************************************/**账号密码登录*/public void login(final Context mContext, String userAccount, String pass) {if (TextUtils.isEmpty(userAccount)) {Toast.makeText(mContext, "请输入账号或手机号", Toast.LENGTH_SHORT).show();return;}if (userAccount.length() < 6 || userAccount.length() > 12 || !checkUserName(userAccount)) {et_account.getIvClean().setVisibility(View.VISIBLE);Toast.makeText(mContext, "账号格式错误,账号为6–12位数字、字母或@的组合", Toast.LENGTH_SHORT).show();return;}if (TextUtils.isEmpty(pass)) {Toast.makeText(mContext, "请输入密码", Toast.LENGTH_SHORT).show();return;}if (pass.length() < 6 || pass.length() > 20 || !checkPassword(pass)) {et_pass.getIvClean().setVisibility(View.VISIBLE);Toast.makeText(mContext, "密码格式错误,请输入6–20位字符(字母,数字或下划线组成)", Toast.LENGTH_SHORT).show();return;}RequestParams params = new RequestParams();params.put("user", userAccount);params.put("pass", pass);params.put("imsi", getImsi(mContext));ProgressDialogUtil.showProgressDialog(mContext, "", "登录中...");AsyncXiuHttpHelper.post(UrlOfServer.RQ_LOGIN, params, new OnHttpListener<JSONObject>() {@Overridepublic void onHttpListener(boolean httpSuccessed, JSONObject json) {ProgressDialogUtil.dismissProgressDialog();if (httpSuccessed) {try {int result = json.getInt("result");if (result == 1) {//请求成功//设置用户信息MyApplication.getApplication().setUser(new UserBean(json));if (loginInterface != null) loginInterface.loginComplete(true, json.toString());//回调Toast.makeText(mContext, "登录成功", Toast.LENGTH_SHORT).show();} else if (result == -1) {tv_tips.setVisibility(View.VISIBLE);if (et_account.getEditText().getText().toString().length() > 0) et_account.getIvClean().setVisibility(View.VISIBLE);if (et_pass.getEditText().getText().toString().length() > 0) et_pass.getIvClean().setVisibility(View.VISIBLE);Toast.makeText(mContext, "账号或密码错误", Toast.LENGTH_SHORT).show();}} catch (Exception e) {e.printStackTrace();}} else {Toast.makeText(mContext, "通信失败,请稍候重试", Toast.LENGTH_SHORT).show();}}});}@Overridepublic void onTextChange() {final String userAccount = et_account.getEditText().getText().toString().trim();final String pass = et_pass.getEditText().getText().toString().trim();boolean isAccountOk = false;boolean isPassOk = false;if (userAccount != null && userAccount.length() >= 6 && userAccount.length() <= 12) isAccountOk = true;if (pass != null && pass.length() >= 6 && pass.length() <= 20) isPassOk = true;if (isAccountOk && isPassOk) tv_login.setTextColor(0xFFFFFFFF);else tv_login.setTextColor(0x7FFFFFFF);}//***********************************************************************************************************************************// 回调//***********************************************************************************************************************************/**第二步,在【调用者】中定义一个实例,并暴露一个对此实例进行set的方法*/private LoginInterface loginInterface;public void setLoginInterface(LoginInterface loginInterface) {this.loginInterface = loginInterface;}//***********************************************************************************************************************************// 键盘显示与隐藏//***********************************************************************************************************************************@Override/**Fragment不可见时隐藏软键盘*/public void onStop() {super.onStop();InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);imm.hideSoftInputFromWindow(et_account.getWindowToken(), 0);}@Override/**Fragment从Activity中移除时取消监听*/public void onDetach() {super.onDetach();rl_root.removeOnLayoutChangeListener(this);}@Overridepublic void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {Rect rect = new Rect();rl_root.getWindowVisibleDisplayFrame(rect);if (firstRect != null) {if (firstRect.height() - rect.height() > 50) softInputShowAnimate();else softInputHideAnimate();}}/**键盘弹出时的动画*/private void softInputShowAnimate() {//既然都隐藏了,就不让点击了tv_qq_login.setClickable(false);tv_wechat_login.setClickable(false);//如果偏移过就不偏移了if (Math.abs(rl_login.getTranslationY()) > 0) return;int translation_y = mContext.getResources().getInteger(R.integer.anim_translation_y);//也可直接通过dimens文件适配,这样就不用在代码中转换单位了float translationY = translation_y * mContext.getResources().getDisplayMetrics().density + 0.5f;//将dp转为pxObjectAnimator loginAnimator = ObjectAnimator.ofFloat(rl_login, "translationY", 0, -translationY);loginAnimator.setInterpolator(new AccelerateInterpolator());ObjectAnimator thirdLoginAnimator = ObjectAnimator.ofFloat(ll_third_login, "alpha", 1, 0);AnimatorSet animatorSet = new AnimatorSet();animatorSet.playTogether(loginAnimator, thirdLoginAnimator);animatorSet.setDuration(400);animatorSet.start();}/**键盘隐藏时的动画*/private void softInputHideAnimate() {//显示后可以点击tv_qq_login.setClickable(true);tv_wechat_login.setClickable(true);ObjectAnimator loginAnimator = ObjectAnimator.ofFloat(rl_login, "translationY", rl_login.getTranslationY(), 0);loginAnimator.setInterpolator(new DecelerateInterpolator());ObjectAnimator thirdLoginAnimator = ObjectAnimator.ofFloat(ll_third_login, "alpha", 0, 1);AnimatorSet animatorSet = new AnimatorSet();animatorSet.playTogether(loginAnimator, thirdLoginAnimator);animatorSet.setDuration(400);animatorSet.start();}//***********************************************************************************************************************************// 工具方法//***********************************************************************************************************************************/*** 检查账号,账号为6–12位数字、字母或@的组合 [0-9a-zA-Z@]**/public static boolean checkUserName(String password) {Pattern pattern = Pattern.compile("^[0-9a-zA-Z@]+$"); // [0-9a-zA-Z@]*Matcher m = pattern.matcher(password);return m.matches();}/*** 检查密码,6–20位字符(字母,数字或下划线组成) [0-9a-zA-Z_]**/public static boolean checkPassword(String password) {Pattern pattern = Pattern.compile("^[0-9a-zA-Z_]+$"); // [0-9a-zA-Z_]*Matcher m = pattern.matcher(password);return m.matches();}/*** 获取IMSI。Returns the unique subscriber ID, for example, the IMSI for a GSM phone. Requires Permission: READ_PHONE_STATE*/public static String getImsi(Context context) {TelephonyManager iPhoneManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);return iPhoneManager.getSubscriberId();}}
Fragment2
public class MyHeadFragment extends Fragment {private Activity mContext;private TextView textView;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {mContext = getActivity();textView = new TextView(mContext);textView.setText("用户首页的Fragment");textView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {textView.append("\n" + new SimpleDateFormat("yyyy-MM-dd E aHH:mm:ss", Locale.getDefault()).format(new Date()));}});Bundle bundle = getArguments();//从activity传过来的Bundleif (bundle != null) {boolean isSuccess = bundle.getBoolean("isSuccess");String result = bundle.getString("result");textView.append("\n是否登录成功" + isSuccess + ":\n" + JsonFormatTool.formatJson(result));}return textView;}}
EditText
/*** 一个简单的EditText,可监听内容变化,有清除内容的功能* @author 白乾涛*/public class MineLoginEditText extends FrameLayout implements TextWatcher {private EditText et;private ImageView iv_clean;private TextView tv_forget;public MineLoginEditText(Context context) {super(context);initView(context);}public MineLoginEditText(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initView(context);}public MineLoginEditText(Context context, AttributeSet attrs) {super(context, attrs);initView(context);}private void initView(Context context) {inflate(context, R.layout.view_login_et, this);et = (EditText) findViewById(R.id.et);iv_clean = (ImageView) findViewById(R.id.iv_clean);tv_forget = (TextView) findViewById(R.id.tv_forget);et.addTextChangedListener(this);iv_clean.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {et.setText("");}});}//监听**************************************************************************************************************************private ITextChangeListener mTextChangeListener;public interface ITextChangeListener {void onTextChange();}public void setTextChangeListener(ITextChangeListener mTextChangeListener) {this.mTextChangeListener = mTextChangeListener;}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {if (s.length() > 0) {iv_clean.setVisibility(View.VISIBLE);iv_clean.setImageResource(R.drawable.mine_delete_selector);} else iv_clean.setVisibility(View.GONE);if (mTextChangeListener != null) mTextChangeListener.onTextChange();}//get方法**************************************************************************************************************************public TextView getTv_forget() {return tv_forget;}public EditText getEditText() {return et;}public ImageView getIvClean() {return iv_clean;}}
AsyncHttpClient 登录 Application Fragment 回调 监听 软键盘的更多相关文章
- Android 另类方法监听软键盘的弹出收起事件
http://www.cnblogs.com/csonezp/p/5065624.html 最近做的项目碰到个问题,a界面是fragment+recyclerview,b界面带个edittext,并且 ...
- adnroid 监听软键盘的显隐
首先注明出处,我只是想做个笔记:http://www.jb51.net/article/64820.htm 第一眼看到的时候,觉得不太可靠,因为之前都是看到这样处理的,根据监听一个根布局的size,可 ...
- Android App监听软键盘按键的三种方式
前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面:在点击搜索框的时候,点击右下角的sea ...
- 键盘-App监听软键盘按键的三种方式
前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面:在点击搜索框的时候,点击右下角的sea ...
- Android App监听软键盘按键的三种方式(转)
最近有类似需求,在csdn上刚好发现,粘贴过来,以防止忘记喽 前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“G ...
- ionic3 监听软键盘的高度
ionic1 和普通cordova的大家都知道 就是看ionic3 和4 https://blog.csdn.net/sean_css/article/details/70243893 ionic c ...
- Android_靠谱的监听软键盘状态的方法
public class MyActivity extends AppCompatActivity { /** * 当前界面中的软件盘的状态 */private boolean isKeyBoardO ...
- h5 移动端 监听软键盘弹起、收起
前面一篇博客 h5 安卓 键盘弹起界面适配 修改webview高度提到了在adnroid中如何监听软键盘的弹起与收起,是利用的窗口的高度发生变化window.onresize事件来做突破点的,但是io ...
- Android 监听软键盘按键的三种方式
前言: 我们在Android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“Go”按键加载url页面:在点击搜索框的时候,点击右下角的searc ...
随机推荐
- Jenkins学习之——(3)将项目发送到tomcat
本章节将讲解如何将项目发送到tomcat,实现自动部署. 我只将一个测试的maven项目托管到github上的,不了解git获github的朋友自己百度一下,我也写了一些关于git的文章,希望大家可以 ...
- 【转】windows消息16进制对应表
来源:http://blog.sina.com.cn/s/blog_962250db0101d4mj.html windows mobile编程,无论使用eVC还是.net CF,都脱不开window ...
- php 设置报错等级
定义和用法: error_reporting() 设置 PHP 的报错级别并返回当前级别. 函数语法: error_reporting(report_level) 如果参数 level 未 ...
- nat123 与微信公众号开发者测试账号配合调试
由于公司本身是做互联网 电商行业的,微信也是一个大块,近期开始花费时间在整合,总结自己的经验,看看之前的实现是否有明显的问题. 花了点钱(8块钱)充值了nat123,进行了内网穿透.之前也有使用花生壳 ...
- STL 之 vector 用法
一.头文件 #include<vector> 二.常用方法: // 在这个向量的尾部插入x的考贝,平均时间为常数,最坏时间为O(n): 1: void push_back(const T& ...
- C++ Primer 5th 第9章 顺序容器
练习9.1:对于下面的程序任务,vector.deque和list哪种容器最为适合?解释你的选择的理由.如果没有哪一种容器优于其他容器,也请解释理由.(a) 读取固定数量的单词,将它们按字典序插入到容 ...
- animation中的steps()逐帧动画
在我们平时做宽高确定,需要背景图片切换的效果时,我如果用的是一张大的png图片.而且恰好是所有小图都是从左向右排列的,那么 我们只需测量出某一个小图距左侧有多少像素(x),然后我们banckgroun ...
- winform登陆 记住用户名 代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Java Tomcat 中调用.net DLL的方法
近日一个java的项目,客户要求项目中必须使用其提供的加密机制,扔给了两个.net写的DLL.网络上搜了一圈也没找到啥东西,甚至看到人扬言此事绝无可能.郁闷当中考虑了一个思路.用C#做一个Com,调用 ...
- [Python 3.x 官方文档翻译]The Python Tutorial Python教程
Python is an easy to learn, powerful programming language. It has efficient high-level data structur ...
