一个xml对应一个相应名字的.kt文件(或者是.java文件)
Fragment类
class TerminalLoginFragment : CustomFragment()
一般继承CustomFragment类
private var _binding: TerminalLoginFragmentBinding? = null
private val binding get() = _binding!!
用来获取对应页面的所有元素
!! 操作符 非空断言运算符,(!!)将任何值转化为非空类型,若该值为空则刨除异常。当我们写b!! 这个时候会返回一个非空的b值,
如果它为空的话会抛出一个NPE异常。
?表明该变量可能会为空
三个重写的函数:
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = TerminalLoginFragmentBinding.inflate(inflater, container, false)
return binding._root
}
获取页面绑定的元素
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
当页面销毁的时候调用
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
}
当页面交互的时候调用
companion object {
fun newInstance() = TerminalLoginFragment()
}
companion 表明是一个伴生对象,类似于java中的静态方法 在这个里面声明的可以直接用过类名进行直接调用
private lateinit var viewModel: TerminalLoginViewModel
获取这个页面对应的viewModel对象,然后通过对页面元素的相关操作 获取相应的数据存储到view中
lateinit 表示延迟初始化,因为kotlin中不允许初始化为null值,那么如果初始化的时候没有默认的值的时候可以采用这种方式
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = TerminalLoginFragmentBinding.inflate(inflater, container, false)
return binding._root}
该类的重写的方法,加载页面的时候默认会进行调用,这个方法返回的是一个View对象
通过:
private var _binding: TerminalLoginFragmentBinding? = null
_binding = TerminalLoginFragmentBinding.inflate(inflater, container, false)
来对页面的元素进行绑定
通过:
private lateinit var viewModel: TerminalLoginViewModel
//__获取数据模型_viewModel = ViewModelProvider(this).get(TerminalLoginViewModel::class._java)
来获取这个对应的数据model, lateinit 表示延迟初始化
Model类
@ActivityScopedclass TerminalLoginViewModel @Inject constructor() : ViewModel()
@ActivityScoped 可以被扫描到
@Inject 自动注入 这边作用在构造函数上
var terminalLoginService = TerminalLoginService()
声明一个Service变量 只有service能够操作JNI接口
_/* PIN码信息 */_private val _keyPin = MutableLiveData
val keyPin: LiveData
get() = _keyPin
model中的实体对应的信息, MutableLiveData 和 LiveData两个类型分别表示能够实时的检测该数据的变化,如果后台这个数据变了,那么前面显示的页面也会立刻改变
LiveData与MutableLiveData的其实在概念上是一模一样的.唯一几个的区别如下:
1.MutableLiveData的父类是LiveData
2.LiveData在实体类里可以通知指定某个字段的数据更新.
3.MutableLiveData则是完全是整个实体类或者数据类型变化后才通知.不会细节到某个字段
/ description: 添加字符串 author: hugang params: return * create time: 2021/2/19 21:52 /_fun appendCode(code: String) {
if (_keyPin._value != null) {
if (keyPin._value?.length!! < 8) {
keyPin._value += code
}
} else {
keyPin._value = code
}
}
这个modle中包含的功能 一般用于自我交互
开发常识
@Parcelizedata class ClickData @Inject constructor(
var fragment: String,
var viewText: String) : Parcelable
Parcelable 表示一个序列化接口 类似于java中的Serializable
@Parcelize 在新版的 Kotlin 插件中,已经自动包含了一个自动 Parcelable 实现生成器。简单来说,只需要再主函数中,声明序列化的属性并添加一个 @Parcelize
注解,它将自动为我们创建 writeToParcel()
和 createFromParcel()
。也就是对开发者而言,只需要加一个 @Parcelize
注解,其他的和正常的类没有区别。
所以继承了 : Parcelable接口表明是可以实现序列化 但是使用这种接口需要我们自己实现太多的模板代码 使用@Parcelize就可以直接让编译器帮我们实现这些模板代码
data 类似于java中lombok注解 自动帮我们实现get,set方法以及构造方法
新建导航菜单
1.在menu.xml中新建一个item
其中title属性应该指的是菜单显示的文字
2.在navigation.xml中新建一个
android:name=”com.cslc.minipos.ui.system.settingstype.MenuTest2Fragment”
android:label=”@string/menu_test2”
tools:layout=”@layout/menu_test2_fragment” />
其中:android:id=”@+id/menu_test2” 中对应的一定要是想要导航到的fragment的id
android:name=”com.cslc.minipos.ui.system.settingstype.MenuTest2Fragment” 指该fragment对应的类
android:label=”@string/menu_test2” 指在菜单项上面显示的文字
tools:layout=”@layout/menu_test2_fragment” fragment对应的布局文件
在MainActivity中配置了侧边栏 便可以自动导航到相应的fragment
普通的导航是如何进行跳转的
1 首先可以新建两个fragment
2 然后新建一个导航文件 通常情况下可以起一个名字为my_nav_graph.xml
当输入名字之后 会出现这样一个设计器
刚进来的时候 基本上这个导航设计器是空的
然后点击下面这个New destination
选择自己刚才新建的fragment 需要导航的东西就能够出现在设计器的中央
可以在两个fragment中间添加导航线表名可以从某一个fragment到达另外一个fragment 导航还可以进行数据的传递
添加Host有两种方式:
一: 在应用主的Activy的xml布局文件间中 添加NavHostfragment
android:name=”androidx.navigation.fragment.NavHostFragment”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
app:defaultNavHost=”true”
app:layout_constraintBottom_toBottomOf=”parent”
app:layout_constraintStart_toStartOf=”parent”
app:layout_constraintTop_toTopOf=”parent”
app:navGraph=”@navigation/my_nav_graph” />
请注意以下几点:
android:name
属性包含NavHost
实现的类名称。app:navGraph
属性将NavHostFragment
与导航图相关联。导航图会在此NavHostFragment
中指定用户可以导航到的所有目的地。app:defaultNavHost="true"
属性确保您的NavHostFragment
会拦截系统返回按钮。请注意,只能有一个默认NavHost
。如果同一布局(例如,双窗格布局)中有多个宿主,请务必仅指定一个默认NavHost
。
二:可以使用布局编辑器向Activity添加布局NavHostFragment,操作步骤如下;
- 在项目文件列表中,双击 Activity 的布局 XML 文件,以在 Layout Editor 中将其打开。
- 在 Palette 窗格内,选择 Containers 类别,或者搜索“NavHostFragment”。
- 将
NavHostFragment
视图拖动到您的 Activity 上。 - 接下来,在随即显示的 Navigation Graphs 对话框中,选择需要与此
NavHostFragment
相关联的相应导航图,然后点击 OK。