2021-10-09 FrameLayou、BottomNavigationView、selector、回顾MVVM架构

FrameLayout

在FrameLayout布局里,放在布局里的控件是按照放入的顺序层次堆叠在屏幕的左上角,定义任何控件放入位置相关的属性都不起作用。但是子控件可以通过android : layout_gravity 属性来控制自己在父控件中的位置。

这里在此区分android : layout_gravity 、和 android : gravity 的区别,android : gravity是控制在自身内容对自己的限定,就比如说一个文本框的width设置的为fill_parent,然后android:gravity=“right”,那么这个文本框内容就会跑到布局的右边。这是因为它的宽度是占满,所以设置了自己内容相对自身的位置后就改变了位置。

BottomNavigationView

底部导航栏 使用BottomNavigationView,在这个控件中设置属性,其中有一个App:menu是加载进来画好的menu,那么就需要画好menu。在menu中需要哪几个控制栏属性,就设置几个item。

实现过程:BottomNavigationView
这是 Google 给我们提供的一个专门用于底部导航的 View,你只需要在新建 Activity 的时候选择 “Bottom Navigation Activity”,IDE 就会自动使用 BottomNavigationView 帮你生成好相应的代码了。

  1. 在 xml 中使用
 <android.support.design.widget.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="0dp"
        android:layout_marginStart="0dp"
        android:background="?android:attr/windowBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/navigation" />
这里面唯一要注意的就是 app:menu 属性了,它指定了你的导航栏显示的页面菜单是怎样的。
  1. menu 的布局文件
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
 
    <item
        android:id="@+id/navigation_home"
        android:icon="@drawable/ic_home_black_24dp"
        android:title="@string/title_home" />
 
    <item
        android:id="@+id/navigation_dashboard"
        android:icon="@drawable/ic_dashboard_black_24dp"
        android:title="@string/title_dashboard" />
 
    <item
        android:id="@+id/navigation_notifications"
        android:icon="@drawable/ic_notifications_black_24dp"
        android:title="@string/title_notifications" />
 
</menu>
  1. 各个item 的 图标 ic_home_black_24dp 等实现点击和不点击放置不同的图片
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:drawable="@drawable/button_bg_press" />
    <item android:state_focused="true" android:drawable="@drawable/button_bg_press" />
    <item android:state_pressed="true" android:drawable="@drawable/button_bg_press"  />
    <item android:drawable="@drawable/button_bg_normol"  />
</selector>

学习selector

这个属性一般用于在不同情况下设置不同的颜色或者是不同的图片,

color-selector 就是颜色状态列表

语法:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:color="hex_color"       //颜色值,#RGB,$ARGB,#RRGGBB,#AARRGGBB
        android:state_pressed=["true" | "false"]//是否触摸 
        android:state_focused=["true" | "false"]//是否获得焦点
        android:state_selected=["true" | "false"]//是否被状态
        android:state_checkable=["true" | "false"]//是否可选
        android:state_checked=["true" | "false"]//是否选中
        android:state_enabled=["true" | "false"]//是否可用
        android:state_window_focused=["true" | "false"] />//是否窗口聚焦
</selector>

使用:

在/res/color/文件夹下新建test_color_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:color="#ffff0000"/> <!-- pressed -->
    <item android:state_focused="true"
          android:color="#ff0000ff"/> <!-- focused -->
    <item android:color="#ff000000"/> <!-- default -->
</selector>
<Button
    android:id="@+id/bt_about"
    style="@style/Button_style"
    android:layout_width="250dp"
    android:layout_height="50dp"
    android:layout_margin="5dp"
    android:textColor="@color/test_color_selector"
    android:text="@string/about" />

同理使用drawable-selector

语法:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:constantSize=["true" | "false"]//drawable的大小是否当中状态变化,true表示是变化,false表示不变换,默认为false
    android:dither=["true" | "false"]//当位图与屏幕的像素配置不一样时(例如,一个ARGB为8888的位图与RGB为555的屏幕)会自行递色(dither)。设置为false时不可递色。默认true
    android:variablePadding=["true" | "false"] >//内边距是否变化,默认false
    <item
        android:drawable="@[package:]drawable/drawable_resource"//图片资源
        android:state_pressed=["true" | "false"]//是否触摸
        android:state_focused=["true" | "false"]//是否获取到焦点
        android:state_hovered=["true" | "false"]//光标是否经过
        android:state_selected=["true" | "false"]//是否选中
        android:state_checkable=["true" | "false"]//是否可勾选
        android:state_checked=["true" | "false"]//是否勾选
        android:state_enabled=["true" | "false"]//是否可用
        android:state_activated=["true" | "false"]//是否激活
        android:state_window_focused=["true" | "false"] />//所在窗口是否获取焦点
</selector>

使用:

在res/drawable文件夹下建xml,

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:drawable="@drawable/button_bg_press" />
    <item android:state_focused="true" android:drawable="@drawable/button_bg_press" />
    <item android:state_pressed="true" android:drawable="@drawable/button_bg_press"  />
    <item android:drawable="@drawable/button_bg_normol"  />
</selector>
 <Button
        android:id="@+id/bt_about"
        style="@style/Button_style"
        android:background="@drawable/button_selector"
        android:layout_width="250dp"
        android:layout_height="50dp"
        android:layout_margin="5dp"
        android:textColor="@color/test_color_selector"
        android:text="@string/about" />

重新再次回顾MVVM架构

项目整体模块:

  • app 关于app的入口module
  • lib_basemvvm 整个项目的底层mvvm封装,并不涉及到项目相关的任何业务代码
  • lib_common 关于项目公用的业务代码
  • 其他的模块看App的需求,就比如 core、secutity等

mvvm架构:

  • dagger 存放dagger注入的相关代码

    • core 存放Application类的相关代码,比如说整个app的application、activity、fragment的生命周期进行逻辑注入。如果使用第三方代码也在这里进行实现
    • component 提供需要注入的桥梁,用于标记接口,负责把提供依赖的类和使用的类串联起来
    • module 提供需要注入的实体,用于标记提供对象的类,这个类负责提供一些我们需要的对象。
      • AppModule 提供App需要的单例类,比如网络请求/数据库
      • ActivityModule 提供Activity类
      • FragmentModule 提供Fragment类
      • ViewModelModule 提供ViewModel类
  • mvvm

    • view 主要是activity和fragment
    • viewmodel 所有的viewmodel
    • model这里主要还是网络的请求apiservice,其实是省略了model模块

    Model层,主要负责数据的提供。Model层提供业务逻辑的数据结构(比如,实体类),提供数据的获取(比如,从本地数据库或者远程网络获取数据),提供数据的存储。
    View层,主要负责界面的显示。View层不涉及任何的业务逻辑处理,它持有ViewModel层的引用,当需要进行业务逻辑处理时通知ViewModel层。
    ViewModel层,主要负责业务逻辑的处理。ViewModel层不涉及任何的视图操作。通过官方提供的Data Binding库,View层和ViewModel层中的数据可以实现绑定,ViewModel层中数据的变化可以自动通知View层进行更新,因此ViewModel层不需要持有View层的引用。ViewModel层可以看作是View层的数据模型和Presenter层的结合。
    MVVM模式建议按照业务功能进行划分结构,

    每一个业务功能独立一个包存放,每一个业务功能包下面按照model、viewmodel、view进行划分。

Guess you like

Origin blog.csdn.net/qq_45204129/article/details/120675667