一个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
android:title=”@string/menu_test2”/>
其中title属性应该指的是菜单显示的文字

2.在navigation.xml中新建一个
android:id=”@+id/menu_test2”
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.xmlimage.png
当输入名字之后 会出现这样一个设计器
image.png
刚进来的时候 基本上这个导航设计器是空的
然后点击下面这个New destination
image.png
选择自己刚才新建的fragment 需要导航的东西就能够出现在设计器的中央
可以在两个fragment中间添加导航线表名可以从某一个fragment到达另外一个fragment 导航还可以进行数据的传递
添加Host有两种方式:
一: 在应用主的Activy的xml布局文件间中 添加NavHostfragment
android:id=”@+id/fragment2”
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,操作步骤如下;

  1. 在项目文件列表中,双击 Activity 的布局 XML 文件,以在 Layout Editor 中将其打开。
  2. Palette 窗格内,选择 Containers 类别,或者搜索“NavHostFragment”。

image.png

  1. NavHostFragment 视图拖动到您的 Activity 上。
  2. 接下来,在随即显示的 Navigation Graphs 对话框中,选择需要与此 NavHostFragment 相关联的相应导航图,然后点击 OK