手机号登录

dev
李桢 1 year ago
parent c1d8789c9e
commit 0fb5b366a7
  1. 46
      README.md
  2. 13
      app/build.gradle
  3. 2
      app/src/main/AndroidManifest.xml
  4. 36
      app/src/main/java/com/unionmed/unionmedtv/api/GetCodeApi.java
  5. 490
      app/src/main/java/com/unionmed/unionmedtv/api/MobileLoginApi.java
  6. 64
      app/src/main/java/com/unionmed/unionmedtv/dialog/TipDialog.java
  7. 27
      app/src/main/java/com/unionmed/unionmedtv/fragment/ContentFragment.java
  8. 21
      app/src/main/java/com/unionmed/unionmedtv/login/activity/LoginActivity.java
  9. 83
      app/src/main/java/com/unionmed/unionmedtv/login/activity/fragment/LoginAccountFragment.java
  10. 178
      app/src/main/java/com/unionmed/unionmedtv/login/activity/fragment/LoginPhoneFragment.java
  11. 65
      app/src/main/java/com/unionmed/unionmedtv/presenter/TypeDoctorPresenter.java
  12. 118
      app/src/main/java/com/unionmed/unionmedtv/utils/CacheUtil.java
  13. 13
      app/src/main/java/com/unionmed/unionmedtv/utils/ToastUtils.java
  14. 143
      app/src/main/java/com/unionmed/unionmedtv/widgets/CornerTextView.java
  15. 2
      app/src/main/java/com/unionmed/unionmedtv/widgets/ImgConstraintLayout.java
  16. 8
      app/src/main/res/drawable/account_password_select.xml
  17. 8
      app/src/main/res/drawable/bg_btn_50616d_border5.xml
  18. 6
      app/src/main/res/drawable/bg_btn_50616d_radius_18.xml
  19. 14
      app/src/main/res/drawable/bg_btn_border_radius_18.xml
  20. 14
      app/src/main/res/drawable/bg_btn_border_radius_5.xml
  21. 8
      app/src/main/res/drawable/bg_btn_c1fcff_border5.xml
  22. 5
      app/src/main/res/drawable/bg_btn_contact_visit.xml
  23. 8
      app/src/main/res/drawable/bg_btn_grey9_border5.xml
  24. 9
      app/src/main/res/drawable/bg_white_border_radius_20.xml
  25. 8
      app/src/main/res/drawable/btn_code_select.xml
  26. 8
      app/src/main/res/drawable/btn_select.xml
  27. 8
      app/src/main/res/drawable/edit_phone_select.xml
  28. BIN
      app/src/main/res/drawable/ic_unionmed_logo.png
  29. 6
      app/src/main/res/drawable/shape_corner15_color_9a9a9a.xml
  30. 12
      app/src/main/res/layout/activity_login.xml
  31. 49
      app/src/main/res/layout/dialog_tip.xml
  32. 82
      app/src/main/res/layout/fragment_account_login.xml
  33. 121
      app/src/main/res/layout/fragment_phone_login.xml
  34. 26
      app/src/main/res/layout/item_type_doctor_layout.xml
  35. BIN
      app/src/main/res/mipmap-xhdpi/icon_default_offline.png
  36. BIN
      app/src/main/res/mipmap-xhdpi/icon_default_online.png
  37. 11
      app/src/main/res/values/attrs_corner_text_view.xml
  38. 10
      app/src/main/res/values/strings.xml

@ -1,46 +0,0 @@
LeanbackTvSample
=====
[![简书](https://img.shields.io/badge/%E7%AE%80%E4%B9%A6-iSuperRed-brightgreen.svg)](http://www.jianshu.com/u/c2e31017da0e)
| [简体中文文档][1]
LeanbackTvSample is a smart TV desktop application based on the Android platform written by Google's open source framework Leanback.
<p align="center">
<img width="320" src="logo/leanback_logo.png">
</p>
效果图
-------
<img src="https://github.com/iSuperRed/LeanbackTvSample/blob/master/screenshot/LeanbackTvSample_1.png" width="960" alt="效果图"/>
<img src="https://github.com/iSuperRed/LeanbackTvSample/blob/master/screenshot/LeanbackTvSample_2.png" width="960" alt="效果图"/>
<img src="https://github.com/iSuperRed/LeanbackTvSample/blob/master/screenshot/LeanbackTvSample_3.png" width="960" alt="效果图"/>
<img src="https://github.com/iSuperRed/LeanbackTvSample/blob/master/screenshot/LeanbackTvSample_4.png" width="960" alt="效果图"/>
<img src="https://github.com/iSuperRed/LeanbackTvSample/blob/master/screenshot/LeanbackTvSample_5.png" width="960" alt="效果图"/>
<img src="https://github.com/iSuperRed/LeanbackTvSample/blob/master/screenshot/LeanbackTvSample_6.png" width="960" alt="效果图"/>
License
-------
```
Copyright (c) 2019 iSuperRed
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```
[1]: https://www.jianshu.com/p/b286e087b074

@ -60,10 +60,21 @@ dependencies {
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
// https://github.com/getActivity/EasyHttp
implementation 'com.github.getActivity:EasyHttp:11.2'
implementation 'com.squareup.okhttp3:okhttp:3.12.13'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.github.getActivity:GsonFactory:6.2'
implementation 'com.github.li-xiaojun:XPopup:2.9.19'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.recyclerview:recyclerview:1.2.1'
//
implementation 'com.blankj:utilcodex:1.30.6'
//SP
implementation 'com.tencent:mmkv:1.0.22'
//
implementation 'com.github.SilenceDut:jpinyin:v1.0'
}

@ -43,7 +43,7 @@
android:name="com.unionmed.unionmedtv.activity.AppInstalledActivity"
android:screenOrientation="landscape" />
<activity
android:name="com.unionmed.unionmedtv.activity.MainActivity"
android:name=".login.activity.LoginActivity"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

@ -0,0 +1,36 @@
package com.unionmed.unionmedtv.api;
import androidx.annotation.NonNull;
import com.hjq.http.config.IRequestApi;
import com.hjq.http.config.IRequestType;
import com.hjq.http.model.BodyType;
import java.util.List;
/**
* desc : 发送短信验证码
*/
public final class GetCodeApi implements IRequestApi, IRequestType {
@NonNull
@Override
public BodyType getBodyType() {
return BodyType.JSON;
}
@NonNull
@Override
public String getApi() {
return "/index/sendMessageCode";
}
private String mobile;
private int type;
public GetCodeApi(String mobile, int type) {
this.mobile = mobile;
this.type = type;
}
}

@ -0,0 +1,490 @@
package com.unionmed.unionmedtv.api;
import androidx.annotation.NonNull;
import com.github.stuxuhai.jpinyin.PinyinException;
import com.github.stuxuhai.jpinyin.PinyinHelper;
import com.hjq.http.config.IRequestApi;
import com.hjq.http.config.IRequestType;
import com.hjq.http.model.BodyType;
import java.util.Objects;
/**
* desc : 发送短信验证码
*/
public final class MobileLoginApi implements IRequestApi, IRequestType {
@NonNull
@Override
public BodyType getBodyType() {
return BodyType.JSON;
}
@NonNull
@Override
public String getApi() {
return "/index/sendMessageCode";
}
private String mobile;
private String code;
public MobileLoginApi(String mobile, String code) {
this.mobile = mobile;
this.code = code;
}
public final static class TokenBean {
/**
* name : 林瑞金
* headImg : null
* mobile : 15905997060
* preRegion : {"pkey":"15","ip":"47.118.51.167","port":"8065","fmsvr":"rtmp://10.120.224.5/livepkgr/","msgsvr":"http://120.195.56.245:3190/msg_server","ipsvr":"https://mobile.union-med.net/app/appintegrate/v1.8","msgip":"120.195.56.245","oder_num":4,"memo":"福州","svalue":"rtmp://10.120.224.5/livepkgr/","filesvr":"http://47.118.51.167:8999/eleand/"}
* isAtuh : 1
* isuse : null
* online : null
* faceAuthFlag : 1
* upkey : 4262
* pkey : null
* identity_id : 350500199107135035
* isSetPsw : 0
* im_useraccount : 4262
* im_password : null
* im_token : aMoc5MIihofCrtEW13iC7YL9uCPhRbbiDN4O4yV6HZC1i+9NneL2fU4Qn0g=
* currentAddress : {"addressKey":"435","pkey":"4262","name":"拒绝","sex":null,"mobile":"15905997060","address":"福建省福州市鼓楼区白马北路201-207号一号3号楼","detailAddress":"12","isCurrent":"1","isDefault":"1","xzqh":"3501","createTime":"1682577679","isDelete":"0"}
* userType : null
* token : c6011b69-cb6d-410f-a24f-75806cebcca0
*/
private String name;
private Object headImg;
private String mobile;
private City preRegion;
private String isAtuh;
private Object isuse;
private Object online;
private int faceAuthFlag;
private String upkey;
private Object pkey;
private String identity_id;
private String isSetPsw;
private String im_useraccount;
private String im_password;
private String im_token;
private CurrentAddressBean currentAddress;
private Object userType;
private String token;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Object getHeadImg() {
return headImg;
}
public void setHeadImg(Object headImg) {
this.headImg = headImg;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public City getPreRegion() {
return preRegion;
}
public void setPreRegion(City preRegion) {
this.preRegion = preRegion;
}
public String getIsAtuh() {
return isAtuh;
}
public void setIsAtuh(String isAtuh) {
this.isAtuh = isAtuh;
}
public Object getIsuse() {
return isuse;
}
public void setIsuse(Object isuse) {
this.isuse = isuse;
}
public Object getOnline() {
return online;
}
public void setOnline(Object online) {
this.online = online;
}
public int getFaceAuthFlag() {
return faceAuthFlag;
}
public void setFaceAuthFlag(int faceAuthFlag) {
this.faceAuthFlag = faceAuthFlag;
}
public String getUpkey() {
return upkey;
}
public void setUpkey(String upkey) {
this.upkey = upkey;
}
public Object getPkey() {
return pkey;
}
public void setPkey(Object pkey) {
this.pkey = pkey;
}
public String getIdentity_id() {
return identity_id;
}
public void setIdentity_id(String identity_id) {
this.identity_id = identity_id;
}
public String getIsSetPsw() {
return isSetPsw;
}
public void setIsSetPsw(String isSetPsw) {
this.isSetPsw = isSetPsw;
}
public String getIm_useraccount() {
return im_useraccount;
}
public void setIm_useraccount(String im_useraccount) {
this.im_useraccount = im_useraccount;
}
public String getIm_password() {
return im_password;
}
public void setIm_password(String im_password) {
this.im_password = im_password;
}
public String getIm_token() {
return im_token;
}
public void setIm_token(String im_token) {
this.im_token = im_token;
}
public CurrentAddressBean getCurrentAddress() {
return currentAddress;
}
public void setCurrentAddress(CurrentAddressBean currentAddress) {
this.currentAddress = currentAddress;
}
public Object getUserType() {
return userType;
}
public void setUserType(Object userType) {
this.userType = userType;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public static class City implements Comparable<City>{
/**
* pkey : 15
* ip : 47.118.51.167
* port : 8065
* fmsvr : rtmp://10.120.224.5/livepkgr/
* msgsvr : http://120.195.56.245:3190/msg_server
* ipsvr : https://mobile.union-med.net/app/appintegrate/v1.8
* msgip : 120.195.56.245
* oder_num : 4
* memo : 福州
* svalue : rtmp://10.120.224.5/livepkgr/
* filesvr : http://47.118.51.167:8999/eleand/
*/
private String pkey;
private String ip;
private String port;
private String fmsvr;
private String msgsvr;
private String ipsvr;
private String msgip;
private int oder_num;
private String memo;
private String svalue;
private String filesvr;
public String getPkey() {
return pkey;
}
public void setPkey(String pkey) {
this.pkey = pkey;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
public String getFmsvr() {
return fmsvr;
}
public void setFmsvr(String fmsvr) {
this.fmsvr = fmsvr;
}
public String getMsgsvr() {
return msgsvr;
}
public void setMsgsvr(String msgsvr) {
this.msgsvr = msgsvr;
}
public String getIpsvr() {
return ipsvr;
}
public void setIpsvr(String ipsvr) {
this.ipsvr = ipsvr;
}
public String getMsgip() {
return msgip;
}
public void setMsgip(String msgip) {
this.msgip = msgip;
}
public int getOder_num() {
return oder_num;
}
public void setOder_num(int oder_num) {
this.oder_num = oder_num;
}
public String getMemo() {
return memo;
}
public void setMemo(String memo) {
this.memo = memo;
}
public String getSvalue() {
return svalue;
}
public void setSvalue(String svalue) {
this.svalue = svalue;
}
public String getFilesvr() {
return filesvr;
}
public void setFilesvr(String filesvr) {
this.filesvr = filesvr;
}
@Override
public int compareTo(City city) {
try {
return PinyinHelper.getShortPinyin(this.memo)
.compareTo(PinyinHelper.getShortPinyin(city.memo));
} catch (PinyinException e) {
e.printStackTrace();
}
return 0;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
City city = (City) o;
return memo.equals(city.memo);
}
@Override
public int hashCode() {
return Objects.hash(memo);
}
}
public static class CurrentAddressBean {
/**
* addressKey : 435
* pkey : 4262
* name : 拒绝
* sex : null
* mobile : 15905997060
* address : 福建省福州市鼓楼区白马北路201-207号一号3号楼
* detailAddress : 12
* isCurrent : 1
* isDefault : 1
* xzqh : 3501
* createTime : 1682577679
* isDelete : 0
*/
private String addressKey;
private String pkey;
private String name;
private Object sex;
private String mobile;
private String address;
private String detailAddress;
private String isCurrent;
private String isDefault;
private String xzqh;
private String createTime;
private String isDelete;
public String getAddressKey() {
return addressKey;
}
public void setAddressKey(String addressKey) {
this.addressKey = addressKey;
}
public String getPkey() {
return pkey;
}
public void setPkey(String pkey) {
this.pkey = pkey;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Object getSex() {
return sex;
}
public void setSex(Object sex) {
this.sex = sex;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getDetailAddress() {
return detailAddress;
}
public void setDetailAddress(String detailAddress) {
this.detailAddress = detailAddress;
}
public String getIsCurrent() {
return isCurrent;
}
public void setIsCurrent(String isCurrent) {
this.isCurrent = isCurrent;
}
public String getIsDefault() {
return isDefault;
}
public void setIsDefault(String isDefault) {
this.isDefault = isDefault;
}
public String getXzqh() {
return xzqh;
}
public void setXzqh(String xzqh) {
this.xzqh = xzqh;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getIsDelete() {
return isDelete;
}
public void setIsDelete(String isDelete) {
this.isDelete = isDelete;
}
}
}
}

@ -0,0 +1,64 @@
package com.unionmed.unionmedtv.dialog;
import android.content.Context;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.lxj.xpopup.core.CenterPopupView;
import com.unionmed.unionmedtv.R;
public class TipDialog extends CenterPopupView {
private TextView tv_cancel;
private TextView tv_title;
private TextView tv_confirm;
private String title;
private DialogClick dialogClick;
public TipDialog(@NonNull Context context, String title, DialogClick dialogClick) {
super(context);
this.title = title;
this.dialogClick = dialogClick;
}
@Override
protected int getImplLayoutId() {
return R.layout.dialog_tip;
}
@Override
protected void onCreate() {
super.onCreate();
tv_cancel = findViewById(R.id.tv_cancel);
tv_cancel.requestFocus();
tv_cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (dialogClick != null) {
dialogClick.cancel();
}
dialog.dismiss();
}
});
tv_title = findViewById(R.id.tv_title);
tv_confirm = findViewById(R.id.tv_confirm);
tv_confirm.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (dialogClick != null) {
dialogClick.confirm();
}
dialog.dismiss();
}
});
tv_title = findViewById(R.id.tv_title);
tv_title.setText(title);
}
public interface DialogClick {
void cancel();
void confirm();
}
}

@ -92,7 +92,7 @@ public class ContentFragment extends BaseLazyLoadFragment {
Content.DataBean dataBean = dataBeans.get(i);
addItem(dataBean);
}
// addFooter();
addFooter();
mPbLoading.setVisibility(View.GONE);
mVerticalGridView.setVisibility(View.VISIBLE);
break;
@ -252,12 +252,11 @@ public class ContentFragment extends BaseLazyLoadFragment {
@Override
public void onSucceed(HttpData<ApiResponse<GetNearDoctorApi.DoctorInfo>> stringHttpData) {
LogUtils.e("成功:" + stringHttpData);
if(stringHttpData.getCode()==200){
if(stringHttpData.getData().getCode()==200){
List<GetNearDoctorApi.DoctorInfo.MemberBean> doctorInfo = stringHttpData.getData().getData().getMember();
if (doctorInfo == null) {
return;
}
mAdapter.setItems(doctorInfo,null);
mPbLoading.setVisibility(View.GONE);
mVerticalGridView.setVisibility(View.VISIBLE);
@ -306,17 +305,17 @@ public class ContentFragment extends BaseLazyLoadFragment {
break;
}
// if (json == null) {
// return;
// }
// Content content = LocalJsonResolutionUtil.JsonToObject(json, Content.class);
// final Message msg = Message.obtain();
// msg.what = MSG_ADD_ITEM;
// Bundle b = new Bundle();
// b.putParcelable(MSG_BUNDLE_KEY_ADD_ITEM, content);
// msg.setData(b);
// //延迟1秒模拟加载数据过程
// mHandler.sendMessageDelayed(msg, 1000);
if (json == null) {
return;
}
Content content = LocalJsonResolutionUtil.JsonToObject(json, Content.class);
final Message msg = Message.obtain();
msg.what = MSG_ADD_ITEM;
Bundle b = new Bundle();
b.putParcelable(MSG_BUNDLE_KEY_ADD_ITEM, content);
msg.setData(b);
//延迟1秒模拟加载数据过程
mHandler.sendMessageDelayed(msg, 1000);
}
});

@ -0,0 +1,21 @@
package com.unionmed.unionmedtv.login.activity;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentActivity;
import com.unionmed.unionmedtv.R;
import com.unionmed.unionmedtv.login.activity.fragment.LoginPhoneFragment;
public class LoginActivity extends FragmentActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.main_browse_fragment, new LoginPhoneFragment())
.commitNow();
}
}
}

@ -0,0 +1,83 @@
package com.unionmed.unionmedtv.login.activity.fragment;
import android.app.Dialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.fragment.app.Fragment;
import com.lxj.xpopup.XPopup;
import com.lxj.xpopup.core.BasePopupView;
import com.lxj.xpopup.interfaces.OnConfirmListener;
import com.unionmed.unionmedtv.R;
import com.unionmed.unionmedtv.dialog.TipDialog;
public class LoginAccountFragment extends Fragment implements View.OnClickListener {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
private View mRootView;
private TextView tv_scan_code_login;
public LoginAccountFragment() {
// Required empty public constructor
}
public static LoginAccountFragment newInstance(String param1, String param2) {
LoginAccountFragment fragment = new LoginAccountFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (mRootView == null) {
mRootView = inflater.inflate(R.layout.fragment_account_login, container, false);
initView(mRootView);
}
return mRootView;
}
public void initView(View view) {
tv_scan_code_login = view.findViewById(R.id.tv_scan_code_login);
tv_scan_code_login.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.tv_scan_code_login) {
// new XPopup.Builder(getContext()).isRequestFocus(true).asCustom(new TipDialog(getActivity(), "我是一个title", new TipDialog.DialogClick() {
// @Override
// public void cancel() {
//
// }
//
// @Override
// public void confirm() {
//
// }
// })).show();
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.main_browse_fragment, new LoginPhoneFragment())
.commitNow();
}
}
}

@ -0,0 +1,178 @@
package com.unionmed.unionmedtv.login.activity.fragment;
import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.fragment.app.Fragment;
import com.hjq.http.EasyHttp;
import com.hjq.http.listener.OnHttpListener;
import com.unionmed.unionmedtv.R;
import com.unionmed.unionmedtv.activity.MainActivity;
import com.unionmed.unionmedtv.api.GetCodeApi;
import com.unionmed.unionmedtv.api.GetNearDoctorApi;
import com.unionmed.unionmedtv.api.MobileLoginApi;
import com.unionmed.unionmedtv.network.ApiResponse;
import com.unionmed.unionmedtv.network.HttpData;
import com.unionmed.unionmedtv.utils.CacheUtil;
import com.unionmed.unionmedtv.utils.ToastUtils;
import java.util.List;
import me.jessyan.autosize.utils.LogUtils;
public class LoginPhoneFragment extends Fragment implements View.OnClickListener {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
private View mRootView;
private TextView tv_account_login;
private EditText edit_phone;
private EditText edit_code;
private TextView tv_getVerification;
private TextView tv_login;
public LoginPhoneFragment() {
// Required empty public constructor
}
public static LoginPhoneFragment newInstance(String param1, String param2) {
LoginPhoneFragment fragment = new LoginPhoneFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (mRootView == null) {
mRootView = inflater.inflate(R.layout.fragment_phone_login, container, false);
initView(mRootView);
}
return mRootView;
}
public void initView(View view) {
tv_account_login = view.findViewById(R.id.tv_account_login);
tv_account_login.setOnClickListener(this);
edit_phone = view.findViewById(R.id.edit_phone);
edit_code = view.findViewById(R.id.edit_code);
tv_getVerification = view.findViewById(R.id.tv_getVerification);
tv_getVerification.setOnClickListener(this);
tv_login = view.findViewById(R.id.tv_login);
tv_login.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.tv_account_login) {//切换登录方式
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.main_browse_fragment, new LoginAccountFragment())
.commitNow();
} else if (view.getId() == R.id.tv_getVerification) {//获取验证码
if (TextUtils.isEmpty(edit_phone.getText())) {
ToastUtils.s(getActivity(), "请输入手机号");
return;
}
getCode(edit_phone.getText().toString());
} else if (view.getId() == R.id.tv_login) {//登录
if (TextUtils.isEmpty(edit_phone.getText())) {
ToastUtils.s(getActivity(), "请输入手机号");
return;
}
if (TextUtils.isEmpty(edit_code.getText())) {
ToastUtils.s(getActivity(), "请输入验证码");
return;
}
MobileLogin(edit_phone.getText().toString(), edit_code.getText().toString());
}
}
//获取验证码
public void getCode(String phone) {
EasyHttp.post(getActivity())
.api(new GetCodeApi(phone, 11))
.request(new OnHttpListener<HttpData<ApiResponse<Object>>>() {
@Override
public void onSucceed(HttpData<ApiResponse<Object>> apiResponseHttpData) {
LogUtils.e("成功:" + apiResponseHttpData);
ToastUtils.s(getActivity(), "获取验证码成功");
if (apiResponseHttpData.getData().getCode() == 200) {
tv_getVerification.setEnabled(false);
new CountDownTimer(60 * 1000, 1000) {
@Override
public void onTick(long l) {
tv_getVerification.setText("已发送(" + (l / 1001) + ") s");
}
@Override
public void onFinish() {
tv_getVerification.setText("获取验证码");
tv_getVerification.setEnabled(true);
}
}.start();
}
}
@Override
public void onFail(Exception e) {
ToastUtils.s(getActivity(), "获取验证码失败");
LogUtils.e("失败:" + e);
}
});
}
//手机号登录
public void MobileLogin(String mobile, String code) {
EasyHttp.post(getActivity())
.api(new MobileLoginApi(mobile, code))
.request(new OnHttpListener<HttpData<ApiResponse<MobileLoginApi.TokenBean>>>() {
@Override
public void onSucceed(HttpData<ApiResponse<MobileLoginApi.TokenBean>> apiResponseHttpData) {
LogUtils.e("成功:" + apiResponseHttpData);
if (apiResponseHttpData.getData().getCode() == 200) {
MobileLoginApi.TokenBean tokenBean=apiResponseHttpData.getData().getData();
CacheUtil.setToken(tokenBean);
CacheUtil.setAccountNumber(tokenBean.getMobile());
CacheUtil.saveImUserAccount(tokenBean.getIm_useraccount());
CacheUtil.saveImUserPwd(tokenBean.getIm_password());
CacheUtil.saveImTokenRong(tokenBean.getIm_token());
Intent intent=new Intent(getActivity(),MainActivity.class);
getActivity().startActivity(intent);
}
}
@Override
public void onFail(Exception e) {
ToastUtils.s(getActivity(), "获取验证码失败");
LogUtils.e("失败:" + e);
}
});
}
}

@ -1,5 +1,6 @@
package com.unionmed.unionmedtv.presenter;
import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
@ -14,6 +15,7 @@ import com.bumptech.glide.request.RequestOptions;
import com.unionmed.unionmedtv.R;
import com.unionmed.unionmedtv.api.GetNearDoctorApi;
import com.unionmed.unionmedtv.bean.Content;
import com.unionmed.unionmedtv.widgets.CornerTextView;
public class TypeDoctorPresenter extends Presenter {
private Context mContext;
@ -30,26 +32,65 @@ public class TypeDoctorPresenter extends Presenter {
return new ViewHolder(view);
}
@SuppressLint("SetTextI18n")
@Override
public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
if (item instanceof GetNearDoctorApi.DoctorInfo.MemberBean) {
GetNearDoctorApi.DoctorInfo.MemberBean memberBean= (GetNearDoctorApi.DoctorInfo.MemberBean) item;
ViewHolder vh = (ViewHolder) viewHolder;
int drawable;
if (memberBean.getOnline().equals("1")) {
vh.tv_online_status.setText("在线");
vh.tv_online_status.setBackground(mContext.getResources().getDrawable(R.drawable.shape_corner15_color_0bbac6));
drawable = R.mipmap.icon_default_online;
} else {
vh.tv_online_status.setText("离线");
drawable = R.mipmap.icon_default_offline;
vh.tv_online_status.setBackground(mContext.getResources().getDrawable(R.drawable.shape_corner15_color_9a9a9a));
}
Glide.with(mContext)
.load( ((GetNearDoctorApi.DoctorInfo.MemberBean) item).getPhoto())
.load(memberBean.getPhoto())
.apply(new RequestOptions()
.circleCrop()
.placeholder(R.drawable.bg_shape_default)
.circleCrop())
.placeholder(drawable)
.circleCrop())
.into(vh.iv_photo);
vh.tv_name.setText(((GetNearDoctorApi.DoctorInfo.MemberBean) item).getName());
if(((GetNearDoctorApi.DoctorInfo.MemberBean) item).getOnline().equals("1")) {
vh.tv_online_status.setText("在线");
}else{
vh.tv_online_status.setText("离线");
vh.tv_name.setText(memberBean.getName());
if (!memberBean.getPersoninfo().isEmpty()) {
if (!memberBean.getPersoninfo().get(0).getDepartment().isEmpty()
&& !memberBean.getPersoninfo().get(0).getZc().isEmpty()) {//部门职称都不为null
vh.tv_dept.setText(memberBean.getPersoninfo().get(0).getDepartment()
+ " | " + memberBean.getPersoninfo().get(0).getZc());
} else if (memberBean.getPersoninfo().get(0).getDepartment().isEmpty()
&& memberBean.getPersoninfo().get(0).getZc().isEmpty()) {//部门职称都为null
vh.tv_dept.setText("- -");
} else if (!memberBean.getPersoninfo().get(0).getDepartment().isEmpty()
&& memberBean.getPersoninfo().get(0).getZc().isEmpty()) {//部门不为null,职称为null
vh.tv_dept.setText(memberBean.getPersoninfo().get(0).getDepartment());
} else if (memberBean.getPersoninfo().get(0).getDepartment().isEmpty()
&& !memberBean.getPersoninfo().get(0).getZc().isEmpty()) {//部门为null,职称不为null
vh.tv_dept.setText(memberBean.getPersoninfo().get(0).getZc());
}
vh.tv_hospital.setText(memberBean.getPersoninfo().get(0).getChosname());
} else {
vh.tv_dept.setText("- -");
vh.tv_dept.setText("- -");
}
if (memberBean.getSex().equals("男")) {
vh.iv_sex.setImageDrawable(mContext.getResources().getDrawable(R.drawable.icon_sex_boy));
} else {
vh.iv_sex.setImageDrawable(mContext.getResources().getDrawable(R.drawable.icon_sex_girl));
}
if (memberBean.getDistance().isEmpty()) {
vh.tv_distance.setVisibility(View.GONE);
}else {
vh.tv_distance.setVisibility(View.VISIBLE);
vh.tv_distance.setText(memberBean.getDistance());
}
vh.tv_dept.setText(((GetNearDoctorApi.DoctorInfo.MemberBean) item).getPersoninfo().get(0).getDepartment());
vh.tv_hospital.setText(((GetNearDoctorApi.DoctorInfo.MemberBean) item).getPersoninfo().get(0).getChosname());
}
}
@ -63,18 +104,22 @@ public class TypeDoctorPresenter extends Presenter {
private final ImageView mIvTypeThreePoster;
TextView tv_name;
ImageView iv_photo;
ImageView iv_sex;
TextView tv_online_status;
TextView tv_dept;
TextView tv_hospital;
CornerTextView tv_distance;
public ViewHolder(View view) {
super(view);
mIvTypeThreePoster = view.findViewById(R.id.iv_type_three_poster);
tv_name = view.findViewById(R.id.tv_name);
iv_photo = view.findViewById(R.id.iv_photo);
iv_sex = view.findViewById(R.id.iv_sex);
tv_online_status = view.findViewById(R.id.tv_online_status);
tv_dept = view.findViewById(R.id.tv_dept);
tv_hospital = view.findViewById(R.id.tv_hospital);
tv_distance = view.findViewById(R.id.tv_distance);
}
}
}

@ -0,0 +1,118 @@
package com.unionmed.unionmedtv.utils;
import android.text.TextUtils;
import com.blankj.utilcode.util.StringUtils;
import com.google.gson.Gson;
import com.tencent.mmkv.MMKV;
import com.unionmed.unionmedtv.R;
import com.unionmed.unionmedtv.api.MobileLoginApi;
public class CacheUtil {
private static MMKV kv = MMKV.mmkvWithID(StringUtils.getString(R.string.mmap_id));
/**
* 获取保存的用户信息
*/
public static MobileLoginApi.TokenBean getToken() {
String tokenStr = kv.decodeString(StringUtils.getString(R.string.token_id));
if (TextUtils.isEmpty(tokenStr)) {
return null;
} else {
return new Gson().fromJson(tokenStr, MobileLoginApi.TokenBean.class);
}
}
/**
* 设置用户信息
*/
public static void setToken(MobileLoginApi.TokenBean token) {
if (token == null) {
kv.encode(StringUtils.getString(R.string.token_id), "");
setIsLogin(false);
} else {
kv.encode(StringUtils.getString(R.string.token_id), new Gson().toJson(token));
setIsLogin(true);
}
}
/**
* 获取保存的账号
*/
public static String getAccountNumber() {
return kv.decodeString(StringUtils.getString(R.string.account_number), "");
}
/**
* 设置账号
*/
public static void setAccountNumber(String account) {
if (TextUtils.isEmpty(account)) {
kv.encode(StringUtils.getString(R.string.account_number), "");
} else {
kv.encode(StringUtils.getString(R.string.account_number), account);
}
}
/**
* 保存当前登录账号的IM账号
*/
public static void saveImUserAccount(String imAccount) {
if (TextUtils.isEmpty(imAccount)) {
kv.encode(StringUtils.getString(R.string.im_user_account), "");
} else {
kv.encode(StringUtils.getString(R.string.im_user_account), imAccount);
}
}
/**
* 获取当前登录账号的IM账号
*/
public static String getImUserAccount() {
return kv.decodeString(StringUtils.getString(R.string.im_user_account), "");
}
/**
* 保存当前登录账号的IM账号,对应的密码
*/
public static void saveImUserPwd(String imPwd) {
if (TextUtils.isEmpty(imPwd)) {
kv.encode(StringUtils.getString(R.string.im_user_pwd), "");
} else {
kv.encode(StringUtils.getString(R.string.im_user_pwd), imPwd);
}
}
/**
* 获取当前登录账号的IM账号,对应的密码
*/
public static String getImUserPwd() {
return kv.decodeString(StringUtils.getString(R.string.im_user_pwd), "");
}
/**
* 融云im_token
*/
public static void saveImTokenRong(String imToken) {
if (TextUtils.isEmpty(imToken)) {
kv.encode(StringUtils.getString(R.string.im_token), "");
} else {
kv.encode(StringUtils.getString(R.string.im_token), imToken);
}
}
/**
* 获取融云im_token
*/
public static String getImTokenRong() {
return kv.decodeString(StringUtils.getString(R.string.im_token), "");
}
/**
* 设置是否已经登录
*/
private static void setIsLogin(Boolean isLogin) {
kv.encode(StringUtils.getString(R.string.is_login), isLogin);
}
}

@ -0,0 +1,13 @@
package com.unionmed.unionmedtv.utils;
import android.content.Context;
import android.widget.Toast;
public final class ToastUtils {
public static void s(Context mContext, String s) {
if (mContext == null) {
return;
}
Toast.makeText(mContext.getApplicationContext(), s, Toast.LENGTH_SHORT).show();
}
}

@ -0,0 +1,143 @@
package com.unionmed.unionmedtv.widgets;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.widget.TextView;
import com.unionmed.unionmedtv.R;
public class CornerTextView extends TextView {
private static final float ANGEL_RIGHT_TOP = 45f;
private static final float ANGEL_LEFT_TOP = -45f;
private static final float DISTANCE_DEFAULT = 120f;
private static final float STROKE_WIDTH_DEFAULT = 0f;
private static final int CORNER_BACKGROUND_COLOR_DEFAULT = 0xFF00B94D;
//根号2
private static final float REAGAN_TWO = (float) Math.sqrt(2);
/**
* 显示在右上角还是左上角
*/
private Gravity gravity;
/**
* 有边角的距离
*/
private float distance = DISTANCE_DEFAULT;
/**
* 文字与色带的边距
*/
private float strokeWidth;
/**
* 色带颜色
*/
private int beltColor;
// 文字底部到边角顶点的距离
private float disToBottom;
Paint mBgPaint;
private Path path;
// 背景色带的高度*根号2
private float beltHeight;
public CornerTextView(Context context) {
super(context);
init(null, 0);
}
public CornerTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs, 0);
}
public CornerTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(attrs, defStyle);
}
private void init(AttributeSet attrs, int defStyle) {
setGravity(android.view.Gravity.CENTER);
final TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CornerTextView, defStyle, 0);
int gravityInt = a.getInt(R.styleable.CornerTextView_gravity, 0);
if (gravityInt == 0) {
gravity = Gravity.RIGHT_TOP;
} else {
gravity = Gravity.LEFT_TOP;
}
distance = a.getDimension(R.styleable.CornerTextView_distance, DISTANCE_DEFAULT);
strokeWidth = a.getDimension(R.styleable.CornerTextView_strokeWidth, STROKE_WIDTH_DEFAULT);
beltColor = a.getColor(R.styleable.CornerTextView_beltColor, CORNER_BACKGROUND_COLOR_DEFAULT);
a.recycle();
//绘制斜条用
mBgPaint = new Paint();
mBgPaint.setAntiAlias(true);
mBgPaint.setColor(beltColor);
mBgPaint.setStyle(Paint.Style.FILL);
path = new Path();
invalidateTextPaintAndMeasurements();
}
private void invalidateTextPaintAndMeasurements() {
Paint.FontMetrics fm = getPaint().getFontMetrics();
float mTextHeight = (float) Math.ceil(fm.bottom - fm.top);
disToBottom = (float) (1.5 * mTextHeight + distance + strokeWidth);
beltHeight = (mTextHeight + 2 * strokeWidth) * REAGAN_TWO;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = (int) (disToBottom * REAGAN_TWO);
int height = (int) (disToBottom * REAGAN_TWO);
path.reset();
if (gravity == Gravity.RIGHT_TOP) {
path.moveTo(0, 0);
path.lineTo(beltHeight * REAGAN_TWO, 0);
path.lineTo(width, height - beltHeight * REAGAN_TWO);
path.lineTo(width, height);
} else {
path.moveTo(0, height);
path.lineTo(0, height - beltHeight * REAGAN_TWO);
path.lineTo(width - beltHeight * REAGAN_TWO, 0);
path.lineTo(width, 0);
}
path.close();
setMeasuredDimension(width & MEASURED_SIZE_MASK, height & MEASURED_SIZE_MASK);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawPath(path, mBgPaint);
canvas.save();
if (gravity == Gravity.RIGHT_TOP) {
canvas.translate(beltHeight / REAGAN_TWO / 2, -beltHeight / REAGAN_TWO / 2);
canvas.rotate(ANGEL_RIGHT_TOP, this.getWidth() / 2f, this.getHeight() / 2f);
} else {
canvas.translate(-beltHeight / REAGAN_TWO / 2, -beltHeight / REAGAN_TWO / 2);
canvas.rotate(ANGEL_LEFT_TOP, this.getWidth() / 2f, this.getHeight() / 2f);
}
super.onDraw(canvas);
canvas.restore();
}
public enum Gravity {
LEFT_TOP, RIGHT_TOP
}
}

@ -52,7 +52,7 @@ public class ImgConstraintLayout extends ConstraintLayout implements View.OnFocu
private void move(final View view) {
view.bringToFront();
final int width = getWidth();
final int width = getWidth()-230;
valueAnimator = ValueAnimator.ofFloat(((Integer) (-width - 30)).floatValue(), ((Integer) (width + 30)).floatValue());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@drawable/bg_btn_border_radius_18" />
<item android:state_pressed="true" android:drawable="@drawable/bg_btn_50616d_radius_18" />
<item android:state_selected="true" android:drawable="@drawable/bg_btn_50616d_radius_18" />
<item android:drawable="@drawable/bg_btn_50616d_radius_18" />
</selector>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="1dp"
android:color="#50616d" />
<corners android:radius="5dp" />
</shape>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#4050616d"/>
<corners android:radius="18dp" />
</shape>

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="0"
android:endColor="#ff257a8d"
android:startColor="#ff0bbac6"
android:type="linear" />
<corners android:radius="18dp" />
</shape>

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="0"
android:endColor="#ff257a8d"
android:startColor="#ff0bbac6"
android:type="linear" />
<corners android:radius="5dp" />
</shape>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="2dp"
android:color="#5ED1FF" />
<corners android:radius="5dp" />
</shape>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="#ff50616d"/>
<corners android:radius="5dp" />
</shape>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="1dp"
android:color="#979797" />
<corners android:radius="5dp" />
</shape>

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/colorWhite" />
<corners android:radius="20dp" />
</shape>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@drawable/bg_btn_border_radius_5" />
<item android:state_pressed="true" android:drawable="@drawable/bg_btn_50616d_border5" />
<item android:state_selected="true" android:drawable="@drawable/bg_btn_50616d_border5" />
<item android:drawable="@drawable/bg_btn_50616d_border5" />
</selector>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@drawable/bg_btn_border_radius_5" />
<item android:state_pressed="true" android:drawable="@drawable/bg_btn_contact_visit" />
<item android:state_selected="true" android:drawable="@drawable/bg_btn_contact_visit" />
<item android:drawable="@drawable/bg_btn_contact_visit" />
</selector>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@drawable/bg_btn_c1fcff_border5" />
<item android:state_pressed="true" android:drawable="@drawable/bg_btn_grey9_border5" />
<item android:state_selected="true" android:drawable="@drawable/bg_btn_grey9_border5" />
<item android:drawable="@drawable/bg_btn_grey9_border5" />
</selector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#9A9A9A" />
<corners android:radius="15dp" />
</shape>

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_browse_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:deviceIds="tv"
tools:ignore="MergeRootFrame" >
</FrameLayout>

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="100dp"
android:layout_marginRight="100dp"
android:background="@drawable/bg_white_border_radius_20">
<TextView
android:id="@+id/tv_title"
android:gravity="center"
android:textColor="#000000"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="100dp"
android:text="我是一个测试弹窗"/>
<LinearLayout
android:layout_below="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginBottom="30dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_cancel"
android:layout_width="150dp"
android:layout_height="36dp"
android:layout_marginTop="20dp"
android:layout_marginRight="100dp"
android:background="@drawable/account_password_select"
android:focusable="true"
android:gravity="center"
android:textColor="@color/colorWhite"
android:text="取消"
android:textSize="19sp" />
<TextView
android:id="@+id/tv_confirm"
android:layout_width="150dp"
android:layout_height="36dp"
android:layout_marginTop="20dp"
android:background="@drawable/account_password_select"
android:focusable="true"
android:gravity="center"
android:textColor="@color/colorWhite"
android:text="确定"
android:textSize="19sp" />
</LinearLayout>
</RelativeLayout>

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="70dp"
android:gravity="center_horizontal"
android:text="康联健康账号登录"
android:textColor="#F1F1F1"
android:textSize="24sp" />
<LinearLayout
android:id="@+id/lly_input"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_title"
android:layout_centerInParent="true"
android:layout_marginTop="85dp"
android:orientation="vertical">
<EditText
android:id="@+id/edit_phone"
android:layout_width="290dp"
android:layout_height="50dp"
android:background="@drawable/edit_phone_select"
android:focusable="true"
android:gravity="center_vertical"
android:hint="请输入手机号码"
android:inputType="number"
android:paddingLeft="15dp"
android:textColorHint="#ffffff"
android:textSize="21sp" />
<EditText
android:id="@+id/edit_password"
android:layout_width="290dp"
android:layout_height="50dp"
android:layout_marginTop="20dp"
android:background="@drawable/edit_phone_select"
android:focusable="true"
android:gravity="center_vertical"
android:hint="请输入密码"
android:inputType="number"
android:paddingLeft="15dp"
android:textColorHint="#ffffff"
android:textSize="21sp" />
<TextView
android:id="@+id/tv_login"
android:layout_width="290dp"
android:layout_height="50dp"
android:background="@drawable/btn_select"
android:focusable="true"
android:gravity="center"
android:text="登录"
android:layout_marginTop="45dp"
android:textColor="#fff1f1f1"
android:textSize="19sp" />
</LinearLayout>
<TextView
android:id="@+id/tv_scan_code_login"
android:layout_width="150dp"
android:layout_height="36dp"
android:layout_below="@+id/lly_input"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:background="@drawable/account_password_select"
android:focusable="true"
android:gravity="center"
android:textColor="@color/colorWhite"
android:text="扫码快捷登录"
android:textSize="19sp" />
</RelativeLayout>

@ -0,0 +1,121 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="70dp"
android:gravity="center_horizontal"
android:text="康联健康账号登录"
android:textColor="#F1F1F1"
android:textSize="24sp" />
<LinearLayout
android:id="@+id/lly_input"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_title"
android:layout_marginLeft="150dp"
android:layout_marginTop="85dp"
android:orientation="vertical">
<EditText
android:id="@+id/edit_phone"
android:layout_width="290dp"
android:layout_height="50dp"
android:background="@drawable/edit_phone_select"
android:focusable="true"
android:gravity="center_vertical"
android:hint="请输入手机号码"
android:inputType="number"
android:paddingLeft="15dp"
android:textColorHint="#ffffff"
android:textColor="#ffffff"
android:textSize="21sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp">
<EditText
android:id="@+id/edit_code"
android:layout_width="162dp"
android:layout_height="50dp"
android:layout_marginRight="10dp"
android:background="@drawable/edit_phone_select"
android:focusable="true"
android:gravity="center_vertical"
android:hint="请输入验证码"
android:inputType="number"
android:paddingLeft="15dp"
android:textColorHint="#ffffff"
android:textColor="#ffffff"
android:textSize="21sp" />
<TextView
android:id="@+id/tv_getVerification"
android:layout_width="116dp"
android:layout_height="50dp"
android:background="@drawable/btn_code_select"
android:focusable="true"
android:gravity="center"
android:text="获取验证码"
android:textColor="#fff1f1f1"
android:textSize="19sp" />
</LinearLayout>
<TextView
android:id="@+id/tv_login"
android:layout_width="290dp"
android:layout_height="50dp"
android:background="@drawable/btn_select"
android:focusable="true"
android:gravity="center"
android:text="登录"
android:layout_marginTop="45dp"
android:textColor="#fff1f1f1"
android:textSize="19sp" />
</LinearLayout>
<ImageView
android:id="@+id/iv_qrCode"
android:layout_width="206dp"
android:layout_height="206dp"
android:layout_alignTop="@+id/lly_input"
android:layout_marginLeft="214dp"
android:layout_toRightOf="@+id/lly_input"
android:src="@drawable/ic_unionmed_logo" />
<TextView
android:layout_width="206dp"
android:layout_height="wrap_content"
android:layout_below="@+id/iv_qrCode"
android:layout_alignLeft="@+id/iv_qrCode"
android:layout_marginTop="15dp"
android:gravity="center_horizontal"
android:text="扫描二维码登录"
android:textColor="#fff1f1f1"
android:textSize="16sp" />
<TextView
android:id="@+id/tv_account_login"
android:layout_width="150dp"
android:layout_height="36dp"
android:layout_below="@+id/lly_input"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:background="@drawable/account_password_select"
android:focusable="true"
android:gravity="center"
android:textColor="@color/lb_tv_white"
android:text="账号密码登录"
android:textSize="19sp" />
</RelativeLayout>

@ -4,10 +4,25 @@
xmlns:tools="http://schemas.android.com/tools"
style="@style/FocusStyle"
android:layout_width="170dp"
android:layout_height="212dp"
android:layout_height="232dp"
android:background="@drawable/shape_corners10_color_1b4765">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.unionmed.unionmedtv.widgets.CornerTextView
android:id="@+id/tv_distance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
tools:text="已下载"
android:textSize="12sp"
app:beltColor="#257A8D "
android:textColor="@android:color/white"
app:distance="30dp"
app:gravity="topLeft"
app:strokeWidth="0dp" />
</RelativeLayout>
<ImageView
android:id="@+id/iv_type_three_poster"
android:layout_width="match_parent"
@ -23,7 +38,7 @@
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"
android:layout_marginTop="30dp"
android:src="@drawable/icon_default_doctor" />
<TextView
@ -49,6 +64,7 @@
android:textSize="21sp" />
<ImageView
android:id="@+id/iv_sex"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_alignTop="@+id/tv_name"
@ -62,7 +78,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_name"
android:layout_marginTop="15dp"
android:layout_marginTop="10dp"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

@ -0,0 +1,11 @@
<resources>
<declare-styleable name="CornerTextView">
<attr name="gravity" format="enum">
<enum name="topRight" value="0"/>
<enum name="topLeft" value="1"/>
</attr>
<attr name="distance" format="dimension"/>
<attr name="strokeWidth" format="dimension"/>
<attr name="beltColor" format="color"/>
</declare-styleable>
</resources>

@ -13,4 +13,14 @@
<string name="http_response_null_body">服务器数据返回异常,请稍后再试</string>
<string name="http_response_md5_error">下载失败,文件 md5 校验失败</string>
//网络请求 -- 结束
<!--常量-->
<string name="mmap_id">app</string>
<string name="token_id">token_id</string>
<string name="is_login">login</string>
<string name="account_number">account_number</string>
<string name="im_user_account">im_user_account</string>
<string name="im_user_pwd">im_user_pwd</string>
<string name="im_token">im_token</string>
<string name="ip_address">ip_address</string>
</resources>

Loading…
Cancel
Save