From 8bf69e3fe8774b0228aa8667b03be0f7dabaa4f6 Mon Sep 17 00:00:00 2001 From: nilupeng <qingingrunt2010@qq.com> Date: Sat, 29 Jan 2022 03:57:55 +0000 Subject: [PATCH] 弹框 部分框架代码优化 --- app/src/main/java/com/runt/open/mvvm/base/activities/BaseActivity.java | 64 +++++++ app/src/main/java/com/runt/open/mvvm/ui/main/notifications/NotificationsFragment.java | 11 app/src/main/res/color/text_normal.xml | 12 + app/src/main/java/com/runt/open/mvvm/ui/main/MainViewModel.java | 11 + app/src/main/java/com/runt/open/mvvm/MainActivity.java | 50 ++++- app/src/main/java/com/runt/open/mvvm/base/fragments/BaseLoadPageFragment.java | 1 app/src/main/java/com/runt/open/mvvm/data/PhoneDevice.java | 98 ++++++++++ app/src/main/java/com/runt/open/mvvm/base/model/BaseViewModel.java | 28 +++ app/src/main/java/com/runt/open/mvvm/retrofit/observable/HttpObserver.java | 42 +++- app/src/main/java/com/runt/open/mvvm/data/LoadingCmd.java | 21 ++ app/src/main/res/layout/layout_dialog.xml | 78 ++++++++ app/src/main/res/drawable-v21/edit_dialog_bg_white_border.xml | 28 +++ app/src/main/java/com/runt/open/mvvm/ui/main/home/HomeFragment.java | 23 - app/src/main/res/layout/activity_main.xml | 12 + app/src/main/java/com/runt/open/mvvm/listener/ResPonse.java | 14 + app/build.gradle | 2 app/src/main/java/com/runt/open/mvvm/ui/main/dashboard/DashboardFragment.java | 11 17 files changed, 452 insertions(+), 54 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3633f0b..f46abb5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -74,7 +74,7 @@ implementation 'com.squareup.okhttp3:okhttp:4.9.0' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0' //RXjava和retrofit结合 - implementation 'com.permissionx.guolindev:permissionx:1.2.2' //权限依赖让你推广你就发群里?没有别的群了? + implementation 'com.guolindev.permissionx:permissionx:1.6.0' //权限依赖 implementation 'com.github.bumptech.glide:glide:4.12.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' implementation 'com.pangle.cn:ads-sdk-pro:4.0.2.2'//字节跳动 穿山甲广告 diff --git a/app/src/main/java/com/runt/open/mvvm/MainActivity.java b/app/src/main/java/com/runt/open/mvvm/MainActivity.java index b180224..6871cf3 100644 --- a/app/src/main/java/com/runt/open/mvvm/MainActivity.java +++ b/app/src/main/java/com/runt/open/mvvm/MainActivity.java @@ -1,30 +1,52 @@ package com.runt.open.mvvm; -import android.os.Bundle; +import android.Manifest; -import com.google.android.material.bottomnavigation.BottomNavigationView; - -import androidx.appcompat.app.AppCompatActivity; import androidx.navigation.NavController; import androidx.navigation.Navigation; -import androidx.navigation.ui.AppBarConfiguration; import androidx.navigation.ui.NavigationUI; +import com.permissionx.guolindev.PermissionX; +import com.runt.open.mvvm.base.activities.BaseActivity; +import com.runt.open.mvvm.data.PhoneDevice; import com.runt.open.mvvm.databinding.ActivityMainBinding; +import com.runt.open.mvvm.listener.ResPonse; +import com.runt.open.mvvm.ui.main.MainViewModel; -public class MainActivity extends AppCompatActivity { - - private ActivityMainBinding binding; +public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewModel> { @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - binding = ActivityMainBinding.inflate(getLayoutInflater()); - setContentView(binding.getRoot()); - + public void initViews() { NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_activity_main); NavigationUI.setupWithNavController(binding.navView, navController); + checkPermission(); } + private void showPermissionDialog(){ + + showDialog("警告", "软件需要权限才能运行", "申请权限", "退出", new ResPonse() { + @Override + public void doSuccess(Object obj) { + checkPermission(); + } + + @Override + public void doError(Object obj) { + finish(); + System.exit(0); + } + }); + } + private void checkPermission(){ + PermissionX.init(MainActivity.this) + .permissions(Manifest.permission.READ_PHONE_STATE) + .request((allGranted, grantedList, deniedList) -> { + if(allGranted){ + PhoneDevice.setDevice(mContext); + }else{ + showPermissionDialog(); + } + + }); + } } \ No newline at end of file diff --git a/app/src/main/java/com/runt/open/mvvm/base/activities/BaseActivity.java b/app/src/main/java/com/runt/open/mvvm/base/activities/BaseActivity.java index ffe24f5..5d775df 100644 --- a/app/src/main/java/com/runt/open/mvvm/base/activities/BaseActivity.java +++ b/app/src/main/java/com/runt/open/mvvm/base/activities/BaseActivity.java @@ -13,6 +13,7 @@ import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; +import android.widget.TextView; import android.widget.Toast; import androidx.annotation.ColorRes; @@ -26,6 +27,7 @@ import com.runt.open.mvvm.R; import com.runt.open.mvvm.base.model.BaseViewModel; import com.runt.open.mvvm.base.model.ViewModelFactory; +import com.runt.open.mvvm.listener.ResPonse; import java.io.File; import java.lang.reflect.Method; @@ -113,6 +115,66 @@ } + AlertDialog dialog; + /** + * 显示弹框 + * @param title + * @param msg + * @param btnOk + * @param btnCancel + * @param resPonse + */ + public void showDialog(String title, String msg, String btnOk,String btnCancel,final ResPonse resPonse){ + showDialog(title,msg,null,btnOk,btnCancel,resPonse,false); + } + + private void showDialog(String title, String msg, String hint,String btnOk,String btnCancel,final ResPonse resPonse,boolean isEdit){ + + AlertDialog.Builder builder = new AlertDialog.Builder(this,R.style.TransparentDialog); + builder.setCancelable(false); + final View view = LayoutInflater.from(this).inflate(R.layout.layout_dialog,null); + TextView titleView = view.findViewById(R.id.txt_title); + TextView cancelView = view.findViewById(R.id.txt_cancel); + final TextView textView = view.findViewById(R.id.msg); + if(isEdit){ + textView.setEnabled(true); + }else{ + textView.setBackground(null); + } + cancelView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dialog.dismiss(); + if(resPonse !=null){ + resPonse.doError(null); + } + } + }); + cancelView.setText(btnCancel); + TextView confirmView = view.findViewById(R.id.txt_confirm); + confirmView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dialog.dismiss(); + if(resPonse !=null){ + resPonse.doSuccess(textView.getText().toString()); + } + } + }); + confirmView.setText(btnOk); + confirmView.requestFocus(); + if(hint != null){ + textView.setHint(hint); + } + if(msg != null){ + textView.setText(msg); + } + titleView.setText(title); + builder.setView(view); + dialog = builder.create(); + dialog.show(); + } + AlertDialog loadingDialog; /** * 显示加载弹框 @@ -146,6 +208,8 @@ getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //透明导航栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + + setStatusBarTextColor(isBlack); } /** diff --git a/app/src/main/java/com/runt/open/mvvm/base/fragments/BaseLoadPageFragment.java b/app/src/main/java/com/runt/open/mvvm/base/fragments/BaseLoadPageFragment.java index 4d691b0..71cb4f2 100644 --- a/app/src/main/java/com/runt/open/mvvm/base/fragments/BaseLoadPageFragment.java +++ b/app/src/main/java/com/runt/open/mvvm/base/fragments/BaseLoadPageFragment.java @@ -99,6 +99,7 @@ smartRefresh.finishLoadMore(); } } + public A getAdapter() { return adapter; } diff --git a/app/src/main/java/com/runt/open/mvvm/base/model/BaseViewModel.java b/app/src/main/java/com/runt/open/mvvm/base/model/BaseViewModel.java index a50ff27..3c172a9 100644 --- a/app/src/main/java/com/runt/open/mvvm/base/model/BaseViewModel.java +++ b/app/src/main/java/com/runt/open/mvvm/base/model/BaseViewModel.java @@ -1,9 +1,11 @@ package com.runt.open.mvvm.base.model; +import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; -import com.runt.open.mvvm.retrofit.observable.HttpObserver; +import com.runt.open.mvvm.data.LoadingCmd; import com.runt.open.mvvm.retrofit.AndroidScheduler; +import com.runt.open.mvvm.retrofit.observable.HttpObserver; import io.reactivex.Observable; import io.reactivex.schedulers.Schedulers; @@ -13,6 +15,11 @@ */ public class BaseViewModel extends ViewModel { + MutableLiveData<LoadingCmd> loadLive = new MutableLiveData<>(); + + public MutableLiveData<LoadingCmd> getLoadLive() { + return loadLive; + } /** * 网络请求观察 @@ -27,5 +34,24 @@ } + /** + * 网络请求观察 + * @param observable + * @param <T> + * @return + */ + public <T> void httpObserverOnLoading(Observable<T> observable, HttpObserver observer){ + observable.subscribeOn(Schedulers.io())//指定网络请求在io后台线程中进行 + .doOnSubscribe(disposable -> { + loadLive.setValue(new LoadingCmd(LoadingCmd.CMD.LOADING,"请求数据中...")); + }) + .observeOn(AndroidScheduler.mainThread()) + .doOnComplete(() -> { + loadLive.postValue(new LoadingCmd(LoadingCmd.CMD.DISSMISS)); + }) + .subscribe(observer); + } + + } diff --git a/app/src/main/java/com/runt/open/mvvm/data/LoadingCmd.java b/app/src/main/java/com/runt/open/mvvm/data/LoadingCmd.java new file mode 100644 index 0000000..1752dea --- /dev/null +++ b/app/src/main/java/com/runt/open/mvvm/data/LoadingCmd.java @@ -0,0 +1,21 @@ +package com.runt.open.mvvm.data; + +/** + * My father is Object, ites purpose of + * + * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/1/28. + */ +public class LoadingCmd { + public CMD code;public String msg; + + public LoadingCmd(CMD code) { + this(code,""); + } + + public LoadingCmd(CMD code, String msg) { + this.code = code; + this.msg = msg; + } + + public enum CMD{LOADING,DISSMISS} +} diff --git a/app/src/main/java/com/runt/open/mvvm/data/PhoneDevice.java b/app/src/main/java/com/runt/open/mvvm/data/PhoneDevice.java new file mode 100644 index 0000000..73ca7bb --- /dev/null +++ b/app/src/main/java/com/runt/open/mvvm/data/PhoneDevice.java @@ -0,0 +1,98 @@ +package com.runt.open.mvvm.data; + +import android.content.Context; +import android.os.Build; + +import com.runt.open.mvvm.util.DeviceUtil; +import com.runt.open.mvvm.util.NetWorkUtils; + +/** + * My father is Object, ites purpose of + * + * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-10-7. + */ + +public class PhoneDevice { + + private String brand,model,androidVersion,androidCode,seriaNo,netIp; + + static PhoneDevice device; + + public static void setDevice(Context context) { + device = new PhoneDevice(Build.BRAND,Build.MODEL,Build.VERSION.SDK_INT+"",Build.VERSION.RELEASE, DeviceUtil.getSerialNumber(context), NetWorkUtils.getNetIp()); + } + + public static PhoneDevice getDevice() { + return device; + } + + public PhoneDevice(String brand, String model, String androidVersion, String androidCode, String seriaNo, String netIp) { + this.brand = brand; + this.model = model; + this.androidVersion = androidVersion; + this.androidCode = androidCode; + this.seriaNo = seriaNo; + this.netIp = netIp; + } + + public String getBrand() { + return brand; + } + + public void setBrand(String brand) { + this.brand = brand; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getAndroidVersion() { + return androidVersion; + } + + public void setAndroidVersion(String androidVersion) { + this.androidVersion = androidVersion; + } + + public String getAndroidCode() { + return androidCode; + } + + public void setAndroidCode(String androidCode) { + this.androidCode = androidCode; + } + + public String getSeriaNo() { + return seriaNo; + } + + public void setSeriaNo(String seriaNo) { + this.seriaNo = seriaNo; + } + + public String getNetIp() { + return netIp; + } + + public void setNetIp(String netIp) { + this.netIp = netIp; + } + + + @Override + public String toString() { + return "PhoneDevice{" + + "brand='" + brand + '\'' + + ", model='" + model + '\'' + + ", androidVersion='" + androidVersion + '\'' + + ", androidCode='" + androidCode + '\'' + + ", seriaNo='" + seriaNo + '\'' + + ", netIp='" + netIp + '\'' + + '}'; + } +} diff --git a/app/src/main/java/com/runt/open/mvvm/listener/ResPonse.java b/app/src/main/java/com/runt/open/mvvm/listener/ResPonse.java new file mode 100644 index 0000000..8e94f93 --- /dev/null +++ b/app/src/main/java/com/runt/open/mvvm/listener/ResPonse.java @@ -0,0 +1,14 @@ +package com.runt.open.mvvm.listener; + +import java.io.Serializable; + +/** + * Created by Administrator on 2018/5/25. + */ +public abstract class ResPonse<T> implements Serializable { + + public abstract void doSuccess(T obj); + + public void doError(T obj){}; + +} diff --git a/app/src/main/java/com/runt/open/mvvm/retrofit/observable/HttpObserver.java b/app/src/main/java/com/runt/open/mvvm/retrofit/observable/HttpObserver.java index b02e526..7024299 100644 --- a/app/src/main/java/com/runt/open/mvvm/retrofit/observable/HttpObserver.java +++ b/app/src/main/java/com/runt/open/mvvm/retrofit/observable/HttpObserver.java @@ -2,34 +2,38 @@ import android.util.Log; +import androidx.annotation.NonNull; import androidx.lifecycle.MutableLiveData; import com.runt.open.mvvm.data.BaseApiResult; +import java.io.IOException; import java.lang.reflect.ParameterizedType; import java.net.SocketTimeoutException; +import io.reactivex.SingleObserver; import io.reactivex.observers.DisposableObserver; +import retrofit2.Response; /** * 网络请求观察 * Created by Administrator on 2021/11/11 0011. */ -public abstract class HttpObserver<T extends BaseApiResult> extends DisposableObserver<T>{ +public abstract class HttpObserver<M extends BaseApiResult> extends DisposableObserver<Response<M>> implements SingleObserver<Response<M>> { final String TAG = "HttpObserver"; - MutableLiveData<T> resultLive; + MutableLiveData<M> resultLive; - public HttpObserver(MutableLiveData<T> resultLive) { + public HttpObserver(MutableLiveData<M> resultLive) { this.resultLive = resultLive; } @Override - public void onNext(T value) { - resultLive.setValue(value); + public void onNext(Response<M> response) { + onExcuted(response); } @Override @@ -38,8 +42,8 @@ try { Log.e(TAG,this.getClass().getSimpleName()+" "+throwable.getMessage()); - Class<T> entityClass = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]; - T t = entityClass.newInstance();//实例化一个泛型 + Class<M> entityClass = (Class<M>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]; + M t = entityClass.newInstance();//实例化一个泛型 t.code = 410; if( throwable instanceof SocketTimeoutException){ t.msg = "服务请求超时,请稍候再试";//设置错误信息 @@ -49,13 +53,13 @@ resultLive.setValue(t); } catch (ClassCastException e) { e.printStackTrace(); - T t = (T) new BaseApiResult<String>(); + M t = (M) new BaseApiResult<String>(); t.code = 409; t.msg = "实例化对象未指定泛型实体类"; resultLive.setValue(t); } catch (Exception e) { e.printStackTrace(); - T t = (T) new BaseApiResult<String>(); + M t = (M) new BaseApiResult<String>(); t.code = 409; t.msg = e.getMessage(); resultLive.setValue(t); @@ -63,7 +67,27 @@ } @Override + public void onSuccess(Response<M> response) { + onExcuted(response); + } + + private void onExcuted(@NonNull Response<M> response){ + + if(response.body() != null){ + resultLive.setValue(response.body()); + }else{ + try { + String error = response.errorBody().string(); + Log.i("subscribe","onExcuted "+error); + onError(new Throwable(error)); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + @Override public void onComplete() { Log.i("subscribe","onComplete"); } + } diff --git a/app/src/main/java/com/runt/open/mvvm/ui/main/MainViewModel.java b/app/src/main/java/com/runt/open/mvvm/ui/main/MainViewModel.java new file mode 100644 index 0000000..72f198b --- /dev/null +++ b/app/src/main/java/com/runt/open/mvvm/ui/main/MainViewModel.java @@ -0,0 +1,11 @@ +package com.runt.open.mvvm.ui.main; + +import com.runt.open.mvvm.base.model.BaseViewModel; + +/** + * My father is Object, ites purpose of + * + * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/1/28. + */ +public class MainViewModel extends BaseViewModel { +} diff --git a/app/src/main/java/com/runt/open/mvvm/ui/main/dashboard/DashboardFragment.java b/app/src/main/java/com/runt/open/mvvm/ui/main/dashboard/DashboardFragment.java index 75b9a1e..5f93e54 100644 --- a/app/src/main/java/com/runt/open/mvvm/ui/main/dashboard/DashboardFragment.java +++ b/app/src/main/java/com/runt/open/mvvm/ui/main/dashboard/DashboardFragment.java @@ -5,6 +5,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; @@ -16,15 +17,15 @@ public class DashboardFragment extends Fragment { private DashboardViewModel dashboardViewModel; -private FragmentDashboardBinding binding; + private FragmentDashboardBinding binding; public View onCreateView(@NonNull LayoutInflater inflater, - ViewGroup container, Bundle savedInstanceState) { + ViewGroup container, Bundle savedInstanceState) { dashboardViewModel = new ViewModelProvider(this).get(DashboardViewModel.class); - binding = FragmentDashboardBinding.inflate(inflater, container, false); - View root = binding.getRoot(); + binding = FragmentDashboardBinding.inflate(inflater, container, false); + View root = binding.getRoot(); final TextView textView = binding.textDashboard; dashboardViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() { @@ -36,7 +37,7 @@ return root; } -@Override + @Override public void onDestroyView() { super.onDestroyView(); binding = null; diff --git a/app/src/main/java/com/runt/open/mvvm/ui/main/home/HomeFragment.java b/app/src/main/java/com/runt/open/mvvm/ui/main/home/HomeFragment.java index 4e34a2b..2a93b5b 100644 --- a/app/src/main/java/com/runt/open/mvvm/ui/main/home/HomeFragment.java +++ b/app/src/main/java/com/runt/open/mvvm/ui/main/home/HomeFragment.java @@ -5,40 +5,29 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; +import com.runt.open.mvvm.base.fragments.BaseFragment; import com.runt.open.mvvm.databinding.FragmentHomeBinding; -public class HomeFragment extends Fragment { +public class HomeFragment extends BaseFragment<FragmentHomeBinding,HomeViewModel> { - private HomeViewModel homeViewModel; -private FragmentHomeBinding binding; - public View onCreateView(@NonNull LayoutInflater inflater, - ViewGroup container, Bundle savedInstanceState) { - homeViewModel = - new ViewModelProvider(this).get(HomeViewModel.class); - binding = FragmentHomeBinding.inflate(inflater, container, false); - View root = binding.getRoot(); - + @Override + public void initViews() { final TextView textView = binding.textHome; - homeViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() { + viewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() { @Override public void onChanged(@Nullable String s) { textView.setText(s); } }); - return root; } -@Override - public void onDestroyView() { - super.onDestroyView(); - binding = null; - } } \ No newline at end of file diff --git a/app/src/main/java/com/runt/open/mvvm/ui/main/notifications/NotificationsFragment.java b/app/src/main/java/com/runt/open/mvvm/ui/main/notifications/NotificationsFragment.java index 72d952c..29970e8 100644 --- a/app/src/main/java/com/runt/open/mvvm/ui/main/notifications/NotificationsFragment.java +++ b/app/src/main/java/com/runt/open/mvvm/ui/main/notifications/NotificationsFragment.java @@ -5,6 +5,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; @@ -16,15 +17,15 @@ public class NotificationsFragment extends Fragment { private NotificationsViewModel notificationsViewModel; -private FragmentNotificationsBinding binding; + private FragmentNotificationsBinding binding; public View onCreateView(@NonNull LayoutInflater inflater, - ViewGroup container, Bundle savedInstanceState) { + ViewGroup container, Bundle savedInstanceState) { notificationsViewModel = new ViewModelProvider(this).get(NotificationsViewModel.class); - binding = FragmentNotificationsBinding.inflate(inflater, container, false); - View root = binding.getRoot(); + binding = FragmentNotificationsBinding.inflate(inflater, container, false); + View root = binding.getRoot(); final TextView textView = binding.textNotifications; notificationsViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() { @@ -36,7 +37,7 @@ return root; } -@Override + @Override public void onDestroyView() { super.onDestroyView(); binding = null; diff --git a/app/src/main/res/color/text_normal.xml b/app/src/main/res/color/text_normal.xml new file mode 100644 index 0000000..71b5c1c --- /dev/null +++ b/app/src/main/res/color/text_normal.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android" > + + <item android:state_enabled="false" android:color="@color/enable_txt_color"/> <!-- pressed --> + + <item android:state_pressed="true" android:color="@color/white"/> <!-- pressed --> + + <item android:state_focused="true" android:color="@color/white"/> <!-- focused --> + + <item android:color="@color/txt_color"/> <!-- default --> + +</selector> \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/edit_dialog_bg_white_border.xml b/app/src/main/res/drawable-v21/edit_dialog_bg_white_border.xml new file mode 100644 index 0000000..5a0a7d2 --- /dev/null +++ b/app/src/main/res/drawable-v21/edit_dialog_bg_white_border.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<ripple xmlns:android="http://schemas.android.com/apk/res/android" + android:color="@color/color_gray" > + <item> + <selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="false"> + <shape> + <solid android:color="@color/transparent" /> + </shape> + </item> + <item android:state_focused="true"> + <shape> + <solid android:color="@color/white" /> + <stroke android:width="0.5dp" android:color="@color/txt_normal" /> + <corners android:radius="@dimen/edit_corner" /> + </shape> + </item> + <item> + <shape> + <solid android:color="@color/white" /> + <stroke android:width="0.5dp" android:color="@color/gray_normal" /> + <corners android:radius="@dimen/edit_corner" /> + </shape> + </item> + </selector> + </item> + +</ripple> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index a57477b..964ea3f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,8 +4,16 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/container" android:layout_width="match_parent" - android:layout_height="match_parent" - android:paddingTop="?attr/actionBarSize" > + android:layout_height="match_parent" > + + <com.runt.open.mvvm.widgets.TitleBarView + android:id="@+id/title_bar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + android:background="@color/white" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" /> <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/nav_view" diff --git a/app/src/main/res/layout/layout_dialog.xml b/app/src/main/res/layout/layout_dialog.xml new file mode 100644 index 0000000..ffa52df --- /dev/null +++ b/app/src/main/res/layout/layout_dialog.xml @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/bg_white_corner_8" + android:orientation="vertical"> + + <TextView + android:id="@+id/txt_title" + android:gravity="center" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:padding="20dp" + android:text="标题" + android:textSize="18sp" + android:textColor="@color/black" /> + + <View + android:layout_width="match_parent" + android:layout_height="0.5dp" + android:background="@color/black_20" /> + + <EditText + android:id="@+id/msg" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:padding="10dp" + android:layout_margin="30dp" + android:background="@drawable/edit_dialog_bg_white_border" + android:enabled="false" + android:textColor="@color/txt_normal" + android:text="" /> + + + <View + android:layout_width="match_parent" + android:layout_height="0.5dp" + android:background="@color/black_20" /> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + + <TextView + android:id="@+id/txt_cancel" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:padding="20dp" + android:layout_weight="1" + android:gravity="center" + android:text="取消" + android:textSize="14sp" + android:focusable="true" + android:textColor="@color/text_normal" + android:background="@drawable/btn_white_lb_corner" /> + + <View + android:layout_width="0.5dp" + android:layout_height="match_parent" + android:background="@color/black_20" /> + <TextView + android:id="@+id/txt_confirm" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:padding="20dp" + android:focusable="true" + android:layout_weight="1" + android:gravity="center" + android:textSize="14sp" + android:text="确认" + android:textColor="@color/text_normal" + android:background="@drawable/btn_white_rb_corner" /> + + + </LinearLayout> + + +</LinearLayout> \ No newline at end of file -- Gitblit v1.9.1