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 ...
随机推荐
- deep learning in nlp 资料文献
Deep Learning for Natural Language Processing (without Magic) http://nlp.stanford.edu/courses/NAACL2 ...
- access 2007 vba 开发中学到的知识(三)
打开文件或程序 'API函数声明Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellEx ...
- 武汉科技大学ACM :1001: 华科版C语言程序设计教程(第二版)课后习题3.12
Problem Description 输入n,输出对应的边长为n的空心正六边形. 为方便看图,样例中点 '.' 表示空格,打印图形时请打印空格而非小圆点. Input 边长n.(n<=20) ...
- spring事务分类简述
spring事务的传播行为是面试中经常被问到的问题,要将事务的传播行为与隔离级别熟练的掌握,在实际开发过程中,特别是在并发高.更新数据量大.关系表比较多的情况下,经常会遇到关于事务的问题.首先,要了解 ...
- Oracle database启动过程分析
实例跟数据库的区别 实例(instance)是内存中的一块区域和一组后台进程的集合.它的作用是维护数据库文件的.而数据库(database)则是指存放数据的数据库文件.它是一系列格式化的数据的集合.它 ...
- python中的列表和字典
列表和字典的区别: 列表是有序排列的一些物件,而字典是将一些物件(键)对应到另外一些物件(值)的数据结构; 应用场景: 字典 各种需要通过某个值去查看另一个值的场合,也就是一个虚拟的“查询表”,实现方 ...
- Flume笔记--示例(使用配置文件)
例子参考资料:http://www.aboutyun.com/thread-8917-1-1.html 自定义sink实现和属性注入:http://www.coderli.com/flume-ng-s ...
- jQueryMobile之弹出对话框
1:dialog-test.html <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- cf B. Fox Dividing Cheese
http://codeforces.com/contest/371/problem/B #include <cstdio> #include <iostream> #inclu ...
- TCP 的那些事儿(转载)
无论是PC客户端开发还是移动开发,或是Web开发, 网络编程都是很重要的一块, 深入理解TCP/IP和HTTP协议是一个优秀程序员的必备技能.看到酷壳老大正好写了篇相关文章, 正好拿来学习, 转自 h ...
