介绍框架XUI

一个简洁而又优雅的Android原生UI框架,源码地址以及作者教程如下:https://gitee.com/xuexiangjys/XUI
框架永远都是巨好用,不用设计界面,不用关注细枝末节,专注于逻辑开发便可。但是正如人生你每每追求的喜欢的往往会成为你的桎梏,框架也有它的不足,体现在开发过程中你会发现你想添加一个新功能是那么不容易,你用的很方便,这是作者所追求的,你想创新?come on老弟,有这本事我估计你不需要用这个框架。
话虽如此,XUI能满足你百分之90的需求,作为基础开发完全够用了。它提供了一整套的UI,提供了UIDemo,随用随取,美滴很。
框架将activity划分成了fragement,使控件通过fragement独立的调用,令我们的开发更加轻便。

LoginActivity.java

*** 登录页面** @author xuexiang* @since 2019-11-17 22:21*/
public class LoginActivity extends BaseActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);openPage(LoginFragment.class, getIntent().getExtras());}@Overrideprotected boolean isSupportSlideBack() {//是否支持侧滑返回return false;}@Overrideprotected void initStatusBarStyle() {//初始化状态栏的样式StatusBarUtils.initStatusBarStyle(this, false, Colors.WHITE);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {//如果fragment中处理了则fragment处理否则activity处理return KeyboardUtils.onDisableBackKeyDown(keyCode) && super.onKeyDown(keyCode, event);}
}

继承了封装好的基础activity,主要业务逻辑在LoginFragment.class中。

LoginFragment.java


/*** 登录页面** @author xuexiang* @since 2019-11-17 22:15*/
@Page(anim = CoreAnim.none)
public class LoginFragment extends BaseFragment {@BindView(R.id.log_name)MaterialEditText loginNameEt;@BindView(R.id.log_pwd)MaterialEditText loginPwdEt;
//    @BindView(R.id.btn_get_verify_code)
//    RoundButton btnGetVerifyCode;private LoginHandler mLoginsHandler = new LoginHandler();;private CountDownButtonHelper mCountDownHelper;@Overrideprotected int getLayoutId() {return R.layout.fragment_login;}@Overrideprotected TitleBar initTitle() {TitleBar titleBar = super.initTitle().setImmersive(true);titleBar.setBackgroundColor(Color.TRANSPARENT);titleBar.setTitle("");titleBar.setLeftImageDrawable(ResUtils.getVectorDrawable(getContext(), R.drawable.ic_login_close));titleBar.setActionTextColor(ThemeUtils.resolveColor(getContext(), R.attr.colorAccent));titleBar.addAction(new TitleBar.TextAction("") {@Overridepublic void performAction(View view) {onLoginSuccess();}});return titleBar;}@Overrideprotected void initViews() {
//        mCountDownHelper = new CountDownButtonHelper(btnGetVerifyCode, 60);//隐私政策弹窗if (!SettingUtils.isAgreePrivacy()) {Utils.showPrivacyDialog(getContext(), (dialog, which) -> {dialog.dismiss();SettingUtils.setIsAgreePrivacy(true);});}}@SingleClick@OnClick({R.id.loginBtn,R.id.regTv, R.id.tv_forget_password, R.id.tv_user_protocol, R.id.tv_privacy_protocol})public void onViewClicked(View view) {switch (view.getId()) {
//            case R.id.btn_get_verify_code:
//                if (etPhoneNumber.validate()) {
//                    getVerifyCode(etPhoneNumber.getEditValue());
//                }
//                break;case R.id.loginBtn:
//                if (loginNameEt.validate()) {
//                    if (loginPwdEt.validate()) {loginByVerifyCode(loginNameEt.getEditValue(), loginPwdEt.getEditValue());
//                    }
//                }break;case R.id.regTv:ActivityUtils.startActivity(RegActivity.class);break;case R.id.tv_forget_password:XToastUtils.info("忘记密码");break;case R.id.tv_user_protocol:XToastUtils.info("用户协议");break;case R.id.tv_privacy_protocol:XToastUtils.info("隐私政策");break;default:break;}}/*** 根据密码登录** @param loginNameEt 学号* @param loginPwdEt  密码*/private void loginByVerifyCode(String loginNameEt, String loginPwdEt) {loginSys( loginNameEt,  loginPwdEt);}//登录系统public void loginSys(String loginNameEt, String loginPwdEt){System.out.println("进入loginSys(String loginNameEt, String loginPwdEt)");
//        String username = loginNameEt.getText().toString().trim();
//        String pwd = loginPwdEt.getText().toString().trim();String username =loginNameEt;String pwd = loginPwdEt;ContentValues values = new ContentValues();values.put("uId",username);values.put("uPassword",pwd);if(TextUtils.isEmpty(username) || TextUtils.isEmpty(pwd)){//ToastUtils.info("注册");System.out.println("用户名和密码不能为空");Toast.makeText(getContext(),"用户名和密码不能为空",Toast.LENGTH_SHORT).show();}else {OkHttpClient okHttpClient = new OkHttpClient();RequestBody requestBody = new FormBody.Builder().add("uId", username).add("uPassword",pwd).build();Request request = new Request.Builder().url(ItFxqConstants.LOGIN_URL).post(requestBody).build();Call call = okHttpClient.newCall(request);// 开启异步线程访问网络call.enqueue(new Callback() {@Overridepublic void onResponse(Call call, Response response) throws IOException {String res = response.body().string();Message msg = new Message();msg.what = ItFxqConstants.OK_STATUS;msg.obj = res;mLoginsHandler.sendMessage(msg);}@Overridepublic void onFailure(Call call, IOException e) {}});}}class LoginHandler extends Handler {@Overridepublic void dispatchMessage(Message msg) {super.dispatchMessage(msg);switch (msg.what) {case ItFxqConstants.OK_STATUS://解析获取的JSON数据Gson gson = new Gson();//通过反射得到type对象Type listType = new TypeToken<Map>() {}.getType();Map resultMap = gson.fromJson((String)msg.obj, listType);Boolean isSuccess =  (Boolean)resultMap.get("isSuccess");if(isSuccess){//存储登录用户信息Map userMap =  (Map)resultMap.get("user");System.out.println("userMap"+userMap.toString());CommonUtils.storeLoginUser(userMap,LoginFragment.super.getContext());
//                        CommonUtils.navigateTo(this.getA,HomeActivity.class);ActivityUtils.startActivity(MainActivity.class);}else{String message = (String)resultMap.get("msg");Toast.makeText(getContext(),message,Toast.LENGTH_SHORT).show();}break;case ItFxqConstants.ERROR_STATUS:
//                    Toast.makeText(LoginActivity.this,"操作失败",Toast.LENGTH_SHORT).show();break;}}}/*** 登录成功的处理*/private void onLoginSuccess() {
//        String token = RandomUtils.getRandomNumbersAndLetters(16);
//        if (TokenUtils.handleLoginSuccess(token)) {
//            popToBack();
//            ActivityUtils.startActivity(MainActivity.class);
//        }}@Overridepublic void onDestroyView() {if (mCountDownHelper != null) {mCountDownHelper.recycle();}super.onDestroyView();}
}

代码是将自己的代码移植到了框架中,所以有一些框架原有代码只是注释没有删掉,也许不太简洁,但注释掉的部分称得上是一个小功能,留作学习。
在XUI中控件的绑定变得很简单,通过MyBatis将控件ID和定义连接。这都归功于作者在BaseFragment中的封装。

fragment_login.xml

<?xml version="1.0" encoding="utf-8"?><!--~ Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)~~ Licensed under the Apache License, Version 2.0 (the "License");~ you may not use this file except in compliance with the License.~ You may obtain a copy of the License at~~       http://www.apache.org/licenses/LICENSE-2.0~~ Unless required by applicable law or agreed to in writing, software~ distributed under the License is distributed on an "AS IS" BASIS,~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.~ See the License for the specific language governing permissions and~ limitations under the License.~--><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><androidx.appcompat.widget.AppCompatImageViewandroid:layout_width="120dp"android:layout_height="120dp"android:layout_gravity="center_horizontal"app:srcCompat="@drawable/ic_splash_app_logo_xui" /><TextViewstyle="@style/TextStyle.Title"android:layout_width="match_parent"android:layout_marginTop="10dp"android:text="登 录"android:textSize="30sp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginStart="24dp"android:layout_marginTop="16dp"android:layout_marginEnd="24dp"android:orientation="vertical"><FrameLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><androidx.appcompat.widget.AppCompatImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="start|center_vertical"android:tint="?attr/colorAccent"app:srcCompat="@drawable/ic_phone" /><com.xuexiang.xui.widget.edittext.materialedittext.MaterialEditTextandroid:id="@+id/log_name"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginStart="36dp"android:hint="请输入您的学号"android:inputType="number"app:met_clearButton="true"app:met_errorMessage="无效的学号"app:met_floatingLabel="normal"app:met_floatingLabelText="学号"app:met_regexp="" /></FrameLayout><FrameLayoutandroid:id="@+id/fl_verify_code"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="12dp"><androidx.appcompat.widget.AppCompatImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="start|center_vertical"android:tint="?attr/colorAccent"app:srcCompat="@drawable/ic_password" /><com.xuexiang.xui.widget.edittext.materialedittext.MaterialEditTextandroid:id="@+id/log_pwd"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginStart="36dp"android:hint="请输入密码"android:inputType="textPassword"app:met_clearButton="false"app:met_errorMessage=""app:met_floatingLabel="normal"app:met_floatingLabelText="密码"app:met_maxCharacters="11"app:met_regexp="" /></FrameLayout><FrameLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><com.xuexiang.xui.widget.alpha.XUIAlphaTextViewandroid:id="@+id/regTv"style="@style/TextStyle.Explain"android:layout_gravity="start"android:paddingStart="10dp"android:paddingTop="5dp"android:paddingEnd="10dp"android:paddingBottom="5dp"android:text="注册用户"android:textColor="@color/xui_config_color_primary_text" /><com.xuexiang.xui.widget.alpha.XUIAlphaTextViewandroid:id="@+id/tv_forget_password"style="@style/TextStyle.Explain"android:layout_gravity="end"android:paddingStart="10dp"android:paddingTop="5dp"android:paddingEnd="10dp"android:paddingBottom="5dp"android:text="忘记密码"android:textColor="@color/xui_config_color_primary_text" /></FrameLayout></LinearLayout><com.xuexiang.xui.widget.textview.supertextview.SuperButtonandroid:id="@+id/loginBtn"style="@style/SuperButton.Primary.Login"android:layout_marginTop="16dp"android:text="登录"/><FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"android:layout_marginBottom="20dp"android:gravity="center_horizontal"android:orientation="horizontal"><TextViewstyle="@style/TextStyle.Explain"android:layout_width="wrap_content"android:text="登陆/注册代表您已阅读并同意"android:textColor="@color/xui_config_color_primary_text" /><com.xuexiang.xui.widget.alpha.XUIAlphaTextViewandroid:id="@+id/tv_user_protocol"style="@style/TextStyle.Explain"android:layout_width="wrap_content"android:text="用户协议"android:textColor="?attr/colorAccent" /><TextViewstyle="@style/TextStyle.Explain"android:layout_width="wrap_content"android:text="和"android:textColor="@color/xui_config_color_primary_text" /><com.xuexiang.xui.widget.alpha.XUIAlphaTextViewandroid:id="@+id/tv_privacy_protocol"style="@style/TextStyle.Explain"android:layout_width="wrap_content"android:text="隐私政策"android:textColor="?attr/colorAccent" /></LinearLayout></FrameLayout></LinearLayout>

控件带有校验功能, 属性app:met_regexp=“正则表达式” 。相应的属性还有错误信息、最大字数限制等。

后记:前两篇都是前台的搭建,其中最为重要的当属网络请求的发送和接收。一个重要的贯穿整个项目的重点。

安卓毕设项目总结(二)校园订餐app相关推荐

  1. 安卓毕设项目总结(一)校园订餐app

    安卓毕设项目总结(一) 写在前面 时间很快,转瞬四年已逝.四年前的现在还在高考场上,意气英发即将迈向未来.四年后的现在,已是离别之时,我坐在考研期间熟悉的座位上,为自己的毕设项目做一个总结,这将是我在 ...

  2. ssm毕设项目益学-校园学习互助y0ig7(java+VUE+Mybatis+Maven+Mysql+sprnig)

    ssm毕设项目益学-校园学习互助y0ig7(java+VUE+Mybatis+Maven+Mysql+sprnig) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + H ...

  3. Java毕设项目高校智慧校园学生系统(java+VUE+Mybatis+Maven+Mysql)

    Java毕设项目高校智慧校园学生系统(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(W ...

  4. 基于android校园订餐APP,简单实现登录注册功能(SharedPreferences)

    基于android校园订餐APP,简单实现登录注册功能(SharedPreferences) 欢迎浏览本篇文章 界面效果图 页面设计代码 源代码 欢迎浏览本篇文章 大家好! 这是小编首次在博客上写的文 ...

  5. springboot毕设项目面向大学校园的设备保修系统cavpj(java+VUE+Mybatis+Maven+Mysql)

    springboot毕设项目面向大学校园的设备保修系统cavpj(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql ...

  6. 计算机毕业设计安卓App毕设项目之ssm定制旅游APP

    目录 一.项目介绍 二.文档截图 三.运行截图 一.项目介绍 含文档+PPT+源码等]精品基于Uniapp+SSM实现的定制旅游APP[包运行成功]>该项目含有源码.文档.PPT.配套开发软件. ...

  7. Java毕设项目:智慧校园管理系统

    Java工程师的进阶之路 资料地址 目录 一.项目展示 二.智慧校园系统简介 2.1.项目简介 2.2.项目模块 2.3.技术栈 2.4.环境准备 三.项目搭建 3.1.搭建工程 3.2.项目结构 3 ...

  8. 毕设课设基于Android的校园订餐APP开发(附源码)

    1.演示视频链接: https://www.bilibili.com/video/BV1N3411c7Pf/?vd_source=48f4d2985ad54326394e2e5947d91c22 2. ...

  9. 开源毕设项目《面向桂林旅游的APP软件设计与开发》

    前言:说一下闲话,项目一个星期完成,三天写成初稿,后面改论文用了三个月(夸张点,并不是每天都在改).最终于2019年5月19号完成毕业答辩.毕设老师给95分,验收老师给90+,这个分数是可以推优进行二 ...

最新文章

  1. 增加ActiveDirectory证书服务器有效期与续订步骤
  2. 期刊投稿状态_干货| SCI论文投稿,你还是知道太少了
  3. android+自定义皮肤,android studio自定义更换皮肤详细图文教程
  4. c# mysql executescalar_C# 操作MySQL数据库, ExecuteScalar()方法执行T-SQL语句, COUNT(*), 统计数据...
  5. hisi mmz内存管理
  6. python 访问需要HTTP Basic Authentication认证的资源
  7. Neo4j:Cypher –删除重复的节点
  8. jquery中的ready函数与window.onload谁先执行
  9. CPU的温度是360的准还是鲁大师的准?
  10. 接活,你为啥不行,之懒
  11. 室内定位程序_在哪都能找到你!苹果新iPhone将支持UWB高精度室内定位
  12. android手机charles证书下载
  13. Idea的JShell Console
  14. PJSIP添加G729编码
  15. 微信小程序UI设计(二)之view组件
  16. 摩尔投票(包含题目讲解)
  17. 已经有了阿里云OSS还需要开通CDN吗?
  18. Hadoop大数据原理(2) - 分布式文件系统HDFS
  19. 随机数 == 伪随机数?
  20. easyExcel设置最后一行的样式【可以拓展为每一行】

热门文章

  1. ScriptManager的使用方法
  2. java快速开发平台zcurd
  3. encodeURI encodeURIComponent 的区别,和使用场景
  4. python 携程 apollo_手把手教你使用携程开源框架Apollo(阿波罗)
  5. 常见数字证书有哪些?
  6. 希网动态域名 客户端(系统服务)
  7. 安装Discuz开源论坛
  8. discuzz论坛搭建
  9. 【Linux】一种局域网内通信方法
  10. 因为没有网关,我的服务器被 DDoS 了