
Kotlin
nicolelili1
这个作者很懒,什么都没留下…
展开
-
Extension with name ‘android‘ does not exist. Currently registered extension names: [ext, kotlin, ko
Caused by: org.gradle.api.UnknownDomainObjectException: Extension with name 'android' does not exist. Currently registered extension names: [ext, kotlin, kotlinTestRegistry]原创 2023-07-17 02:12:08 · 1215 阅读 · 0 评论 -
Kotlin lazy函数和泛型
1、Kotlin lazy函数延迟属性(lazy properties)是Kotlin标准库中的标准委托之一,可以通过by lazy来实现。其中,lazy()是一个函数,可以接受一个Lambda表达式作为参数,第一次调用时会执行Lambda表达式,以后调用该属性会返回之前的结果。2、泛型参数话类型:将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用、调用时传入具体的类型(类型实参)类型擦除:java的泛型是伪原创 2022-05-10 02:47:23 · 987 阅读 · 0 评论 -
Kotlin对象和伴生对象
1、objectkotlin中的对象是指的是使用object关键字定义的类型声明,一般用作单例模式和伴生对象。它让单例变得十分简单2、伴生对象kotlin的一个特性:没有静态成员静态成员在java中有很大的作业,因为java没有全局变量,也不存在包级函数,一切属性和方法都是在类里面,所以在写一些工具函数和全局变量时,都需要用到static关键字修饰的静态成员。kotlin之所以能抛弃静态成员,主要原因在于它允许包级属性和函数的存在。经典做饭:kotlin允许在类中使用co原创 2022-05-10 02:08:55 · 1492 阅读 · 0 评论 -
协程的启动和取消
1、协程构建器launch与async构建器都用来启动新协程launch,返回一个Job并且不附带任何结果值async,返回一个Deferred,Deferred也是一个Job,可以使用await()在一个延期的值上得到它的最终结果等待一个作业launch通过joinasync通过await2、协程的启动模式DEFAULT:协程创建后,立即开始调度,在调度前如果协程被取消,其将直接进入取消响应的状态ATOMIC:协程创建后,立即开始调度,协程执行到第一个挂起点之前原创 2022-05-10 01:43:31 · 900 阅读 · 0 评论 -
协程简单介绍
1、协程是什么协程基于线程,它是轻量级的线程协程让异步逻辑同步化,杜绝回调地狱协程最核心的点就是,函数或者一段程序能够被挂起,稍后再在挂起的位置回复2、协程用来解决什么问题处理耗时任务,这种任务常常会阻塞主线程保证主线程安全,即确保安全地从主线程调用任何suspend函数3、协程的挂起和恢复常规函数基础操作包括:invoke(或call)和return,协程新增了suspend和resume:suspend --- 也称为挂起或暂停,用于暂停执行当前协程,并保存所原创 2022-05-09 21:35:24 · 5982 阅读 · 1 评论 -
创建带图片的Notification
1、定义变量,并生成数据package com.example.mynotificationimport android.app.NotificationManagerimport androidx.core.app.NotificationCompatobject InboxStyleMockData { const val mContentTitle = "5 new emails" const val mContentText = "from Jane, Jay, Al原创 2022-05-09 18:53:48 · 776 阅读 · 0 评论 -
创建Notification
1、定义变量和数据package com.example.mynotificationimport android.app.NotificationManagerimport androidx.core.app.NotificationCompatobject InboxStyleMockData { const val mContentTitle = "5 new emails" const val mContentText = "from Jane, Jay, Alex原创 2022-05-09 18:07:07 · 641 阅读 · 0 评论 -
修改bottom navigationbar的图片
原创 2022-05-09 03:19:22 · 349 阅读 · 0 评论 -
修改Bottom NavigationBar的标题
修改navigation文件夹下的mobile_navigation.xml,将所需要的标题在对应fragment标签下的lable修改运行结果为:原来的界面:修改后标题为:原创 2022-05-09 03:05:16 · 212 阅读 · 0 评论 -
卡片式界面
1、添加recyclerview的布局fragment_all_dishes.xml<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.co原创 2022-05-09 02:35:21 · 321 阅读 · 0 评论 -
Palette的集成与使用
1、在build.gradle中添加依赖 implementation 'com.github.bumptech.glide:glide:4.13.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.13.0' implementation 'androidx.palette:palette:1.0.0'2、添加网络权限 <uses-permission android:name="andr原创 2022-05-08 19:57:49 · 1417 阅读 · 0 评论 -
显示和隐藏 Bottom Navigation bar
1、定义viewbinding变量,初始化,并设置界面定义变量: private lateinit var binding: ActivityFavDishBinding初始化并将布局设置给activity: binding = ActivityFavDishBinding.inflate(layoutInflater) setContentView(binding.root)2、定义controller变量并初始化定义变量 privat原创 2022-05-07 22:49:25 · 1272 阅读 · 0 评论 -
Navigation Compopent的使用之fragment之间使用Safe Args安全地传递数据
1、在project的build.gradle的dependencies中添加依赖def nav_version = "2.4.2"classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"2、在modle的build.gradle中的plugins代码块中添加下面的id id 'androidx.navigation.safeargs.kotlin'3、在navigation.原创 2022-05-07 21:00:14 · 571 阅读 · 0 评论 -
Navigation Compopent的使用之fragment之间Bundle数据传递
1、发送string和long型数据val bundle = bundleOf( "name" to firstName, "mobile" to mobile.toLong() )findNavController() .navigate(R.id.action_exampleFragment_to_verifyFragment,原创 2022-05-07 03:17:38 · 794 阅读 · 0 评论 -
Navigation Compopent的使用之添加第二个fragment的返回键效果
1、添加controller变量 private lateinit var navController: NavController2、初始化 navController = Navigation.findNavController(this,R.id.fragment)3、重写onSupportNavigateUp方法,并调用返回上一个fragment的方法NavigationUI.navigateUp(navController,null) override fun o原创 2022-05-07 02:39:02 · 449 阅读 · 0 评论 -
Navigation Compopent的使用之从一个Fragment跳转到另一个Fragment
1、在build.gradle中添加依赖 implementation 'androidx.navigation:navigation-fragment-ktx:2.4.2' implementation 'androidx.navigation:navigation-ui-ktx:2.4.2' implementation 'androidx.legacy:legacy-support-v4:1.0.0'2、创建EnterDetailsFragmentpackage com原创 2022-05-07 02:24:33 · 1014 阅读 · 0 评论 -
activity中添加Fragment
1、在build.gradle中添加如下依赖 def fragment_version = "1.4.1" //kotlin implementation "androidx.fragment:fragment-ktx:$fragment_version"2、创建一个fragmentpackage com.example.mykotlin2import android.os.Bundleimport androidx.fragment.app.Fragment原创 2022-05-07 00:44:17 · 4111 阅读 · 0 评论 -
Room Database 之保存和搜索数据
1、报错数据到数据库将要保存的数据传入FavDish的构造函数,调用viewModule的insert方法进行保存val favDishDetails : FavDish = FavDish( 0, mImagePath, Constants.DISH_IMAGE_SOURCE_LOCAL,原创 2022-05-06 21:56:44 · 600 阅读 · 0 评论 -
Room Database 之设置MVVM
注:官方文档:Android Room with a View - Kotlin | Android Developers原创 2022-05-06 18:03:51 · 571 阅读 · 0 评论 -
Room Database 之创建Repository
Repository管理查询和使用后端,即可以从数据库查询数据或将数据保存到数据库注:官方文档:Android Room with a View - Kotlin | Android Developers原创 2022-05-06 17:33:30 · 410 阅读 · 0 评论 -
Room Database 之创建RoomDatabase
1、定义一个抽象类继承RoomDatabaseabstract class FavDishRoomDatabase : RoomDatabase() {}2、添加注解@Database,参数entities为定义表的内容时的类,version为数据库版本号,当更新数据库时可以改变版本号3、单例获取database @Volatile private var INSTANCE : FavDishRoomDatabase ?= null fun getDatabas原创 2022-05-06 17:19:33 · 1095 阅读 · 0 评论 -
Room Database 之设置接口Dao
1、在接口上添加注解@Dao@Daointerface FavDishDao {}2、添加插入的方法,因为是异步,所以需要添加suspend关键字,并添加注解@Insertsuspend fun insertFavDishDetails(favDish : FavDish)3、添加抽象方法,每个子类必须重写该方法abstract fun favDishDao() : FavDishDao注:1、官方文档Android Room with a View - Kot原创 2022-05-06 17:02:20 · 814 阅读 · 0 评论 -
Room Database 之设置Entity
1、设置表名在类名上面添加Entity注解,并为tableName赋值@Entity(tableName = "fav_dishes_table")class FavDish {}2、保存数据的条目@ColumnInfo + val + 变量名 + : + 保存类型如保存的名称是image,数据类型是String设置主key为id自增长@PrimaryKey(autoGenerate = true) val id : Int = 0注:官方文档:原创 2022-05-06 16:56:50 · 684 阅读 · 0 评论 -
viewModels 找不到
问题:import androidx.activity.viewModels 导包时 viewModules找不到解决办法:添加依赖implementation "androidx.activity:activity-ktx:1.4.0"原创 2022-05-06 01:04:09 · 969 阅读 · 0 评论 -
viewModelScope找不到
问题:viewModelScope找不到 fun insert (dish : FavDish) = viewModelScope.launch{ }引入依赖: def roomVersion = "2.4.2" implementation("androidx.room:room-runtime:$roomVersion") annotationProcessor("androidx.room:room-compiler:$原创 2022-05-05 22:43:55 · 1916 阅读 · 0 评论 -
Room Database 之引入依赖
1、在moudule的gradle中的plugins代码中添加如下代码 id 'kotlin-kapt'plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-kapt'}2、在moudule的gradle中的android代码块中添加如下代码 packagingOptions { exclude 'META-INF/a.原创 2022-05-05 19:07:20 · 1079 阅读 · 0 评论 -
recyclerview的条目添加点击事件
在adapter的onBindViewHolder中给view设置点击事件holder.itemView.setOnClickListener{ }注:adapter代码:package com.example.mykotlin1.adaptersimport android.app.Activityimport android.view.LayoutInflaterimport android.view.ViewGroupimport原创 2022-05-04 19:55:34 · 916 阅读 · 0 评论 -
RecyclerView的使用
1、定义recyclerview的布局dialog_custom_list.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"原创 2022-05-04 19:41:14 · 648 阅读 · 0 评论 -
将图片保存到内存
1、定义下载图片所要保存的地址 IMAGE_DIRECTORY companion object{ private const val CAMERA = 1 private const val GALLERY = 2 private const val IMAGE_DIRECTORY = "FavDishImages" }2、定义保存图片的方法,参数为bitmapprivate fun saveImageToInterna原创 2022-05-04 15:21:50 · 451 阅读 · 0 评论 -
集成Glide SDK
1、在build.gradle文件中添加依赖implementation 'com.github.bumptech.glide:glide:4.13.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.13.0'2、在manifes.xml中添加权限<uses-permission android:name="android.permission.INTERNET"/>3、在代码中显示下载图原创 2022-05-04 14:46:45 · 634 阅读 · 0 评论 -
从画廊Gallery中选择图片,并接收返回的数据
1、通过intent打开gallery val galleryIntent = Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI)startActivityForResult(galleryIntent, GALLERY)2、接收返回的数据 if(resultCode == Activity.RESULT_OK){ if(requestCode == GALLERY原创 2022-05-04 06:09:53 · 407 阅读 · 0 评论 -
打开相机并接收返回的数据
1、打开相机 val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) startActivityForResult(intent,CAMERA)2、接收返回的数据 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, d原创 2022-05-04 04:46:26 · 583 阅读 · 0 评论 -
使用Deter添加申请Camera运行时权限
1、在Mainfest.xml中添加权限 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/> <uses-permission and原创 2022-05-04 03:59:04 · 578 阅读 · 0 评论 -
创建AlertDialog并跳转到设置界面
AlertDialog.Builder(this).setMessage("It looks like you have turned off permissions " + "required for this feature.It can be enabled under Application Settings") .setPositiveButton("GO TO SETTINGS") {_,_ -> ...原创 2022-05-04 03:49:13 · 595 阅读 · 0 评论 -
scrollview的使用
crollview中只允许有一个直接子类效果图:代码:activity_add_update_dish.xml<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.原创 2022-05-04 02:33:33 · 382 阅读 · 0 评论 -
创建dialog并添加点击事件
1、创建dialog的布局dialog_custom_image_selection.xml<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res原创 2022-05-04 02:10:34 · 977 阅读 · 0 评论 -
view添加点击事件
1、让类实现接口 View.OnClickListenerclass AddUpdateDishActivity : AppCompatActivity(), View.OnClickListener2、给id为iv_add_dish_image的view设置点击事件 mBinding.ivAddDishImage.setOnClickListener(this)3、实现onClick方法 override fun onClick(v: View?) {原创 2022-05-03 19:22:32 · 947 阅读 · 0 评论 -
kotlin使用SDP进行android屏幕适配
1、在build.gradle文件中添加依赖dependencies { implementation 'com.intuit.sdp:sdp-android:1.0.6'}2、在需要设置大小的地方使用 "_"+数字+“sdp”的形式, 例如 16dp写为 _16sdp注:sdp在github的地址https://github.com/intuit/sdp...原创 2022-05-03 17:39:11 · 1303 阅读 · 0 评论 -
constrainlayout布局属性layout_constraintVertical_chainStyle=“spread_inside“的使用
1、界面控件之间太紧凑2、设置constrainlayout的属性app:layout_constraintVertical_chainStyle="spread_inside"即: <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="wrap_content"原创 2022-05-03 17:38:27 · 3030 阅读 · 0 评论 -
重构代码设置MVVM模式
1、项目运行的界面2、项目结构图一个界面Mainactivity和三个Fragmen、三个 ViewModel3、修改界面结构包含三个包model:存储数据view:存储界面(activity+fragment)viewmodel:存放viewmodel...原创 2022-05-02 17:03:28 · 450 阅读 · 0 评论