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。
比如:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:visible="false"
android:id="@+id/navigation_home"
android:icon="@drawable/main_botton_nav_icon_home"
android:title="@string/navigate_home_page" />
<item
android:id="@+id/navigation_controller"
android:icon="@drawable/main_botton_nav_icon_controll"
android:title="@string/navigate_control" />
<item
android:id="@+id/navigation_mine"
android:icon="@drawable/main_botton_nav_icon_mine"
android:title="@string/navigate_mine" />
</menu>
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类
-
AppModule
-
core
-
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进行划分。
-
view