一个简洁而又优雅的Android原生UI框架,源码地址以及作者教程如下:https://gitee.com/xuexiangjys/XUI
框架永远都是巨好用,不用设计界面,不用关注细枝末节,专注于逻辑开发便可。但是正如人生你每每追求的喜欢的往往会成为你的桎梏,框架也有它的不足,体现在开发过程中你会发现你想添加一个新功能是那么不容易,你用的很方便,这是作者所追求的,你想创新?come on老弟,有这本事我估计你不需要用这个框架。
话虽如此,XUI能满足你百分之90的需求,作为基础开发完全够用了。它提供了一整套的UI,提供了UIDemo,随用随取,美滴很。
框架将activity划分成了fragement,使控件通过fragement独立的调用,令我们的开发更加轻便。
**
* 登录页面
*
* @author xuexiang
* @since 2019-11-17 22:21
*/
public class LoginActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
openPage(LoginFragment.class, getIntent().getExtras());
}
@Override
protected boolean isSupportSlideBack() {//是否支持侧滑返回
return false;
}
@Override
protected void initStatusBarStyle() {//初始化状态栏的样式
StatusBarUtils.initStatusBarStyle(this, false, Colors.WHITE);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {//如果fragment中处理了则fragment处理否则activity处理
return KeyboardUtils.onDisableBackKeyDown(keyCode) && super.onKeyDown(keyCode, event);
}
}
继承了封装好的基础activity,主要业务逻辑在LoginFragment.class中。
/**
* 登录页面
*
* @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;
@Override
protected int getLayoutId() {
return R.layout.fragment_login;
}
@Override
protected 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("") {
@Override
public void performAction(View view) {
onLoginSuccess();
}
});
return titleBar;
}
@Override
protected 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() {
@Override
public 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);
}
@Override
public void onFailure(Call call, IOException e) {
}
});
}
}
class LoginHandler extends Handler {
@Override
public void dispatchMessage(Message msg) {
super.dispatchMessage(msg);
switch (msg.what) {
case ItFxqConstants.OK_STATUS:
//解析获取的JSON数据
Gson gson = new Gson();
//通过反射得到type对象
Type listType = new TypeToken
代码是将自己的代码移植到了框架中,所以有一些框架原有代码只是注释没有删掉,也许不太简洁,但注释掉的部分称得上是一个小功能,留作学习。
在XUI中控件的绑定变得很简单,通过MyBatis将控件ID和定义连接。这都归功于作者在BaseFragment中的封装。
控件带有校验功能, 属性app:met_regexp=“正则表达式” 。相应的属性还有错误信息、最大字数限制等。
后记:前两篇都是前台的搭建,其中最为重要的当属网络请求的发送和接收。一个重要的贯穿整个项目的重点。