app/src/main/AndroidManifest.xml
@@ -45,6 +45,9 @@ <activity android:name=".ui.main.MainActivity" /> <activity android:name=".ui.login.RegisterLoginActivity" /> <activity android:name=".ui.web.WebViewActivity" /> <activity android:name=".ui.SettingActivity" /> <activity android:name=".ui.AboutActivity" /> </application> </manifest> app/src/main/java/com/runt/open/mvvm/base/activities/BaseActivity.java
@@ -82,7 +82,7 @@ RESULT_CODE_SUCESS = 4046/*成功*/, RESULT_CODE_CANCEL = 4043/*取消*/; protected Context mContext; TitleBarView titleBarView; protected TitleBarView titleBarView; @Override app/src/main/java/com/runt/open/mvvm/base/model/BaseViewModel.java
@@ -1,16 +1,31 @@ package com.runt.open.mvvm.base.model; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.provider.Settings; import android.util.Log; import androidx.annotation.NonNull; import androidx.core.content.FileProvider; import androidx.lifecycle.ViewModel; import com.runt.open.mvvm.BuildConfig; import com.runt.open.mvvm.base.activities.BaseActivity; import com.runt.open.mvvm.data.HttpApiResult; import com.runt.open.mvvm.data.Results; import com.runt.open.mvvm.listener.ResPonse; import com.runt.open.mvvm.retrofit.AndroidScheduler; import com.runt.open.mvvm.retrofit.api.CommonApiCenter; import com.runt.open.mvvm.retrofit.observable.HttpObserver; import com.runt.open.mvvm.retrofit.utils.RetrofitUtils; import io.reactivex.Observable; import io.reactivex.functions.Consumer; import io.reactivex.schedulers.Schedulers; import okhttp3.*; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; /** * Created by Administrator on 2021/11/11 0011. @@ -24,6 +39,139 @@ this.mActivity = activity; } public void checkUpdate(boolean showTip){ Observable<HttpApiResult<Results.ApkVersion>> appUpdate = commonApi.getAppUpdate(); HttpObserver<Results.ApkVersion> observer = new HttpObserver<Results.ApkVersion>(mActivity) { @Override protected void onSuccess(Results.ApkVersion version) { if (version.code > BuildConfig.VERSION_CODE) { mActivity.showDialog("有新版本", version.detail, "升级", "取消", new ResPonse() { @Override public void doSuccess(Object obj) { String downloadUrl = version.access.indexOf("http")> -1? version.access:BuildConfig.HOST_IP_ADDR + version.access; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { boolean hasInstallPermission = mActivity.getPackageManager().canRequestPackageInstalls(); if (!hasInstallPermission) { mActivity.showDialog("当前没有安装权限", "当前没有安装权限", "去设置", "稍后安装", new ResPonse() { @Override public void doSuccess(Object obj) { //跳转至“安装未知应用”权限界面,引导用户开启权限 Uri selfPackageUri = Uri.parse("package:" + mActivity.getPackageName()); Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, selfPackageUri); mActivity.startActivity(intent); } }); return; } } downloadApk(downloadUrl); } }); }else if(showTip){ mActivity.showToast("当前是最新版本"); } } }; if(showTip){ httpObserverOnLoading(appUpdate, observer); }else{ httpObserverOn(appUpdate,observer); } } private void downloadApk(String url){ Request request = new Request.Builder().url(url).build(); OkHttpClient client = new OkHttpClient(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(@NonNull Call call, @NonNull IOException e) { mActivity.showToast("下载失败"+e); } @Override public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { int code = response.code(); Log.d("downloadFile", "code:"+code); if(code != 200){ mActivity.showToast("下载失败"+code); return; } FileOutputStream fos = null; InputStream input = null; File file = null; byte[] buf = new byte[2048]; int len = 0; try { Log.d("downloadFile", "下载文件:"+url); input = response.body().byteStream(); long total = response.body().contentLength(); Log.d("downloadFile", "total:"+total); file = new File(mActivity.getExternalFilesDir(null).getAbsolutePath() + "/"); if (!file.exists()) { file.mkdirs(); } file = new File(file.getPath() + "/" + url.substring(url.lastIndexOf("/"))); file.createNewFile(); fos = new FileOutputStream(file); long sum = 0; while ((len = input.read(buf)) != -1) { fos.write(buf, 0, len); sum += len; float progress = (sum * 1.0f / total * 100); // 下载中 Log.d("downloadFile", "下载进度:" + progress); } Log.d("downloadFile", file.getPath()); // 下载完成 File finalFile = file; mActivity.runOnUiThread(() -> { mActivity.showDialog("安装", "新版安装包下载完成", "安装", "取消", new ResPonse() { @Override public void doSuccess(Object obj) { openAPK(finalFile); } }); }); } catch (Exception e) { Log.d("downloadFileException", e.toString()); Log.d("downloadFileException", "Url:${call.request().url}"); mActivity.showToast("下载失败"+e); file.delete(); call.cancel(); } finally { fos.flush(); input.close(); fos.close(); } } }); } /** * 打开apk文件 * * @param file */ private void openAPK(File file) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); Uri photoURI = null; if (Build.VERSION.SDK_INT >= 24) { //判读版本是否在7.0以上 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); photoURI = FileProvider.getUriForFile(mActivity, mActivity.getApplicationContext().getPackageName() + ".fileprovider", file);//添加这一句表示对目标应用临时授权该Uri所代表的文件 } else { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); photoURI = Uri.fromFile(file); } intent.setDataAndType(photoURI, "application/vnd.android.package-archive"); mActivity.startActivity(intent); } /** * 网络请求观察 * @param observable app/src/main/java/com/runt/open/mvvm/base/model/ImpViewModel.java
@@ -1,7 +1,7 @@ package com.runt.open.mvvm.base.model; /** * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/7/27. * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17. */ public class ImpViewModel extends BaseViewModel{ } app/src/main/java/com/runt/open/mvvm/config/Configuration.java
@@ -3,7 +3,7 @@ /** * My father is Object, ites purpose of * * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/1/29. * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17. */ public class Configuration { app/src/main/java/com/runt/open/mvvm/data/ApkUpGradeResult.java
File was deleted app/src/main/java/com/runt/open/mvvm/data/Results.java
@@ -3,7 +3,7 @@ /** * My father is Object, ites purpose of * * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/1/29. * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17. */ public class Results { @@ -17,4 +17,10 @@ public String id,title,content,cTime; } //版本更新 public class ApkVersion{ public long id,code; public String version,detail,access; } } app/src/main/java/com/runt/open/mvvm/retrofit/api/CommonApiCenter.java
@@ -1,7 +1,6 @@ package com.runt.open.mvvm.retrofit.api; import com.runt.open.mvvm.data.ApkUpGradeResult; import com.runt.open.mvvm.data.HttpApiResult; import com.runt.open.mvvm.data.PageResult; import com.runt.open.mvvm.data.Results; @@ -54,11 +53,11 @@ * app更新 * @return */ @GET("system/appupgrade/tourist/get/2") Observable<ApkUpGradeResult> getAppUpdate(); @GET("getControlVersion") Observable<HttpApiResult<Results.ApkVersion>> getAppUpdate(); @POST("updateName") Observable<ApkUpGradeResult> updateName(@Field("username") String name); Observable<Results.StringApiResult> updateName(@Field("username") String name); @Multipart @POST("updatehead") app/src/main/java/com/runt/open/mvvm/ui/AboutActivity.java
New file @@ -0,0 +1,21 @@ package com.runt.open.mvvm.ui; import com.runt.open.mvvm.base.activities.BaseActivity; import com.runt.open.mvvm.base.model.ImpViewModel; import com.runt.open.mvvm.databinding.ActivityAboutBinding; import com.runt.open.mvvm.util.DeviceUtil; /** * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17. */ public class AboutActivity extends BaseActivity<ActivityAboutBinding, ImpViewModel> { @Override public void initViews() { mBinding.txtVer.setText("版本号 "+ DeviceUtil.getAppVersionName(mContext)); } @Override public void loadData() { } } app/src/main/java/com/runt/open/mvvm/ui/SettingActivity.java
New file @@ -0,0 +1,46 @@ package com.runt.open.mvvm.ui; import android.content.Intent; import android.view.View; import com.runt.open.mvvm.BuildConfig; import com.runt.open.mvvm.base.activities.BaseActivity; import com.runt.open.mvvm.base.model.ImpViewModel; import com.runt.open.mvvm.config.Configuration; import com.runt.open.mvvm.databinding.ActivitySettingBinding; import com.runt.open.mvvm.listener.ResPonse; import com.runt.open.mvvm.ui.login.UserBean; /** * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17. */ public class SettingActivity extends BaseActivity<ActivitySettingBinding, ImpViewModel> { @Override public void initViews() { setTitle("设置"); if(UserBean.getUser() == null){ mBinding.logout.setVisibility(View.GONE); } mBinding.version.setText(BuildConfig.VERSION_NAME); mBinding.version.setOnClickListener(v->{ mViewModel.checkUpdate(true); }); mBinding.about.setOnClickListener(v->{startActivity(new Intent(mContext,AboutActivity.class));}); mBinding.logout.setOnClickListener(v->{ showDialog("是否退出", "退出后将清除本设备的登录信息", new ResPonse() { @Override public void doSuccess(Object obj) { clearUserData(); putStringProjectPrefrence(Configuration.KEY_USERINFO,null); UserBean.setUser(null); setResult(RESULT_CODE_SUCESS); finish(); } }); }); } @Override public void loadData() { } } app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageActivitys.java
@@ -1,7 +1,7 @@ package com.runt.open.mvvm.ui.loadpage; /** * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/8/9. * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17. */ public class PageActivitys { } app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageFragments.java
@@ -6,7 +6,7 @@ import com.runt.open.mvvm.ui.main.home.MsgAdapter; /** * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/8/9. * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17. */ public class PageFragments { app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageViewModels.java
@@ -8,7 +8,7 @@ import io.reactivex.Observable; /** * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/8/9. * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17. */ public class PageViewModels { public static class HomeViewModel extends LoadPageViewModel<Results.Message> { app/src/main/java/com/runt/open/mvvm/ui/login/RegisterLoginActivity.java
@@ -20,7 +20,7 @@ /** * My father is Object, ites purpose of * * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/1/29. * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17. */ public class RegisterLoginActivity extends BaseActivity<ActivityLoginBinding,LoginViewModel> { final String VERIFY_CODE = "verify_code"; app/src/main/java/com/runt/open/mvvm/ui/main/MainActivity.java
@@ -5,11 +5,9 @@ import android.content.res.ColorStateList; import android.view.KeyEvent; import android.view.View; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.viewpager2.widget.ViewPager2; import com.google.android.material.bottomnavigation.BottomNavigationView; import com.permissionx.guolindev.PermissionX; import com.runt.open.mvvm.R; @@ -20,6 +18,7 @@ import com.runt.open.mvvm.databinding.ActivityMainBinding; import com.runt.open.mvvm.listener.CustomClickListener; import com.runt.open.mvvm.listener.ResPonse; import com.runt.open.mvvm.ui.SettingActivity; import com.runt.open.mvvm.ui.loadpage.PageFragments; import com.runt.open.mvvm.ui.login.RegisterLoginActivity; import com.runt.open.mvvm.ui.login.UserBean; @@ -41,12 +40,18 @@ @Override public void initViews() { mBinding.titleBar.setRightDra(getResources().getDrawable(R.mipmap.icon_white_setting)); mBinding.titleBar.setRightClick(new CustomClickListener() { ActivityResultLauncher<Intent> settingLaunch = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { if(result.getResultCode() == RESULT_CODE_SUCESS){//已退出 if(mBinding.viewPager2.getCurrentItem() == 2) { mBinding.viewPager2.setCurrentItem(0);//设置默认第二页 } fragments[2].loadData();//登录后重新刷新 } }); titleBarView.setRightClick(new CustomClickListener() { @Override protected void onSingleClick(View view) { //startActivityForResult(new Intent(mContext,SettingActivity.class),REQUEST_CODE_LOGOUT);//打开设置 settingLaunch.launch(new Intent(mContext, SettingActivity.class));//打开设置 } }); final FragmentAdapter fragmentAdapter = new FragmentAdapter(this); @@ -109,7 +114,7 @@ private void setTitleStr(int position){ switch (position){ case 0: setTitle("资讯"); setTitle("资讯Aljkpqla"); break; case 1: setTitle("服务"); app/src/main/java/com/runt/open/mvvm/ui/main/MainViewModel.java
@@ -5,7 +5,7 @@ /** * My father is Object, ites purpose of * * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/1/28. * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17. */ public class MainViewModel extends BaseViewModel { } app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineFragment.java
@@ -3,7 +3,6 @@ import android.app.Activity; import android.content.Intent; import android.content.pm.ActivityInfo; import android.util.Log; import android.view.View; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; @@ -14,17 +13,11 @@ import com.runt.open.mvvm.BuildConfig; import com.runt.open.mvvm.R; import com.runt.open.mvvm.base.fragments.BaseFragment; import com.runt.open.mvvm.data.HttpApiResult; import com.runt.open.mvvm.data.Results; import com.runt.open.mvvm.databinding.FragmentMineBinding; import com.runt.open.mvvm.retrofit.observable.HttpObserver; import com.runt.open.mvvm.ui.login.UserBean; import com.runt.open.mvvm.util.GlideEngine; import com.runt.open.mvvm.util.MyLog; import okhttp3.ResponseBody; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; import java.io.File; import java.util.List; @@ -71,11 +64,11 @@ openAlthum(); break; case R.id.txt_name://名称 mViewModel.updateName(new HttpObserver() { mViewModel.updateName(new HttpObserver<String>() { @Override protected void onSuccess(Object data) { UserBean.getUser().setUsername(data.toString()); mBinding.txtName.setText(data.toString()); protected void onSuccess(String data) { UserBean.getUser().setUsername(data); mBinding.txtName.setText(data); } }); app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineViewModel.java
@@ -13,11 +13,11 @@ import java.io.File; /** * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/7/27. * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17. */ public class MineViewModel extends BaseViewModel { public void updateName(HttpObserver observer){ public void updateName(HttpObserver<String> observer){ if(UserBean.getUser().getPhone().equals(UserBean.getUser().getUsername())) { mActivity.showInputDialog("输入名称", UserBean.getUser().getUsername(), "名称只能修改一次", new ResPonse() { @Override app/src/main/java/com/runt/open/mvvm/ui/main/service/ServiceFragment.java
@@ -10,7 +10,7 @@ import com.runt.open.mvvm.listener.ResPonse; /** * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/7/27. * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17. */ public class ServiceFragment extends BaseFragment<FragmentServiceBinding, ImpViewModel> implements View.OnClickListener { app/src/main/java/com/runt/open/mvvm/util/HandleDate.java
@@ -6,7 +6,7 @@ import java.util.Date; /** * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/7/27. * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-9-17. */ public class HandleDate { app/src/main/java/com/runt/open/mvvm/widgets/TitleBarView.java
@@ -102,36 +102,49 @@ super.onDraw(canvas); Log.e("TitleBarView","onDraw mRect:"+mRect); if(leftDra != null){ final Bitmap bitmap = drawableToBitmap(leftDra); float top = mRect.top+(viewHeight-bitmap.getHeight()*2f)/2; float left = mRect.left-bitmap.getWidth()*0.5f; leftClickRect = new RectF(left,top,left + (bitmap.getWidth()*2f),top + bitmap.getHeight()*2f); canvas.drawBitmap(bitmap,mRect.left,mRect.top+(viewHeight-bitmap.getHeight())/2,null); //点击的区域 leftClickRect = drawBitmap(leftDra,canvas,getPaddingLeft()); } if(rightDra != null){ final Bitmap bitmap = drawableToBitmap(rightDra); float chaTop = (viewHeight-bitmap.getHeight())/2; float top = mRect.top+chaTop; float left = mRect.right-bitmap.getWidth(); rightClickRect = new RectF(left-bitmap.getWidth()/2,top-bitmap.getHeight()/2,left+bitmap.getWidth()*2f,top+bitmap.getHeight()*1.5f); canvas.drawBitmap(bitmap,left,top,null); //点击的区域 rightClickRect = drawBitmap(rightDra,canvas,getPaddingRight()+viewWidth); } if(titleText != null){ final int textWidth = getTextWidth(textPaint, titleText); final int textHeight = getTextHeight(textPaint); final Paint.FontMetrics fontMetrics = textPaint.getFontMetrics(); canvas.drawText(titleText,mRect.left+((viewWidth-textWidth)/2),mRect.top+((viewHeight-textHeight)/2)+(0-fontMetrics.ascent),textPaint); final float[] textHeight = getTextHeight(textPaint); float top = (getHeight()-textHeight[0])/2-textPaint.getFontMetrics().ascent; canvas.drawText(titleText,mRect.left+((viewWidth-textWidth)/2),top,textPaint); } if(rightText != null){ final int textWidth = getTextWidth(rightTextPaint, rightText); final int textHeight = getTextHeight(rightTextPaint); final Paint.FontMetrics fontMetrics = rightTextPaint.getFontMetrics(); final float[] textHeight = getTextHeight(rightTextPaint); float chaleft = textWidth*0.5f; float chaTop = textHeight[0]*0.5f; float left = mRect.right-textWidth; float top = mRect.top+((viewHeight-textHeight)/2)+(0-fontMetrics.ascent); rightClickRect = new RectF(left-textWidth/2,top-textHeight,left+textWidth*2f,top+textHeight/2); float top = (getHeight()-textHeight[0])/2-textPaint.getFontMetrics().ascent; rightClickRect = new RectF(left-chaleft,top-chaTop,left +chaleft*3,top + chaTop*3); canvas.drawText(rightText,left,top,rightTextPaint); } } /** * 绘制图片 * @param drawable * @param canvas * @return 点击的区域 */ private RectF drawBitmap(Drawable drawable,Canvas canvas,float left){ final Bitmap bitmap = drawableToBitmap(drawable); if(left>viewWidth){//右侧 left -= bitmap.getWidth(); } float chaTop = bitmap.getHeight()*0.5f; float chaleft = bitmap.getWidth()*0.5f; //绘制的位置 float top = (getHeight()-bitmap.getHeight())/2; canvas.drawBitmap(bitmap,left,top,null); return new RectF(left-chaleft,top-chaTop,left +chaleft*3,top + chaTop*3); } @Override public boolean onTouchEvent(MotionEvent event) { @@ -244,11 +257,11 @@ } //第二个参数是一个数组.传进去个长度跟字符串长度相同的float数组,方法调用后,里边塞的是每个字符的长度. public int getTextHeight(Paint paint) { public float[] getTextHeight(Paint paint) { Paint.FontMetrics fm = paint.getFontMetrics(); float height1 = fm.descent - fm.ascent;//文字的高度 float height2 = fm.bottom - fm.top + fm.leading;//行高 return (int) height2; return new float[]{height1,height2}; } private void setTint(Drawable drawable, @ColorInt int color){ app/src/main/res/layout/activity_about.xml
New file @@ -0,0 +1,66 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.runt.open.mvvm.widgets.TitleBarView android:id="@+id/title_bar" style="@style/titlebar" app:leftDrawable="@mipmap/icon_white_back" app:leftTint="@color/txt_normal" app:titleText="关于我们" app:titleTextColor="@color/txt_normal"/> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="vertical" android:layout_weight="1"> <com.runt.open.mvvm.widgets.CornerImageView android:layout_width="70dp" android:layout_height="70dp" android:layout_marginTop="40dp" android:src="@mipmap/ic_launcher" /> <TextView android:id="@+id/txt_app" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/default_margin_td" android:text="@string/app_name"/> <TextView android:id="@+id/txt_ver" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/default_margin_td" android:text="@string/app_name"/> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="5dp" android:text="@string/title_guanui_text_1"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="5dp" android:text="@string/title_guanui_text_2"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="5dp" android:text="@string/title_guanui_text_3" android:layout_marginBottom="@dimen/default_margin_lr"/> </LinearLayout> app/src/main/res/layout/activity_login.xml
@@ -9,7 +9,8 @@ <com.runt.open.mvvm.widgets.TitleBarView android:id="@+id/title_bar" style="@style/titlebar" app:leftDrawable="@mipmap/ic_arrow_back_black_24dp" app:leftDrawable="@mipmap/icon_white_back" app:leftTint="@color/txt_normal" app:titleText="登录" tools:ignore="MissingConstraints" /> app/src/main/res/layout/activity_main.xml
@@ -10,6 +10,8 @@ <com.runt.open.mvvm.widgets.TitleBarView android:id="@+id/title_bar" style="@style/titlebar" app:rightDrawable="@mipmap/icon_white_setting" app:rightTint="@color/black" tools:ignore="MissingConstraints" app:titleText="标题" /> app/src/main/res/layout/activity_setting.xml
@@ -2,6 +2,7 @@ <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingConstraints" android:background="@color/white" android:layout_width="match_parent" android:layout_height="match_parent" @@ -10,7 +11,6 @@ <com.runt.open.mvvm.widgets.TitleBarView android:id="@+id/title_bar" style="@style/titlebar" tools:ignore="MissingConstraints" app:titleText="设置" app:leftDrawable="@mipmap/icon_white_back" app:leftTint="@color/black"/> @@ -18,30 +18,14 @@ <TextView android:id="@+id/version" app:layout_constraintTop_toBottomOf="@id/title_bar" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" android:background="@drawable/bg_white" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="left" android:text="@string/str_version" android:textColor="@color/txt_color" android:textSize="@dimen/title_size" android:padding="15dp" /> style="@style/lin_txt" /> <TextView android:id="@+id/about" app:layout_constraintTop_toBottomOf="@id/version" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" android:background="@drawable/bg_white" android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/lin_txt" android:drawableRight="@mipmap/arrow_right" android:gravity="left" android:text="关于我们" android:textColor="@color/txt_color" android:textSize="@dimen/title_size" android:padding="15dp" /> android:text="关于我们" /> <View app:layout_constraintTop_toBottomOf="@id/title_bar" android:layout_width="match_parent" app/src/main/res/values/strings.xml
@@ -69,4 +69,8 @@ <string name="str_restart">重启APP</string> <string name="str_success">成功</string> <string name="str_no_up">暂无更新</string> <string name="title_guanui_text_1">版权所有©</string> <string name="title_guanui_text_2">xxx科技有限责任公司 </string> <string name="title_guanui_text_3">ICP备案:冀ICP备20008xxx号-1</string> </resources> app/src/main/res/values/styles.xml
@@ -133,5 +133,20 @@ <item name="android:paddingRight">30dp</item> <item name="android:paddingLeft">30dp</item> <item name="android:textColor">@color/link</item> </style> <style name="lin_txt"> <item name="layout_constraintRight_toRightOf">parent</item> <item name="layout_constraintLeft_toLeftOf">parent</item> <item name="android:background">@drawable/bg_white</item> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:gravity">left</item> <item name="android:textColor">@color/txt_color</item> <item name="android:textSize">@dimen/title_size</item> <item name="android:paddingTop">@dimen/default_margin_td</item> <item name="android:paddingBottom">@dimen/default_margin_td</item> <item name="android:paddingLeft">@dimen/default_margin_lr</item> <item name="android:paddingRight">@dimen/default_margin_lr</item> </style> </resources>