ps:一个提醒机制
抛出异常:kotlin.NotImplementedError: An operation is not implemented: not implemented
在实现接口的时候IDE会自动为我们添加上:
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
“TODO("not implemented")”这句代码,这句代码在运行的时候会抛出以上异常,这样做的好处是促使我们去实现接口方法或者手动删掉这句代码。
【https://www.cnblogs.com/claruarius/p/GenyMotion_intelliJ_config.html】使用Genymotion
1.在app.buildgradle中的依赖添加anko库
//app目录添加anko库
dependencies {
implementation "org.jetbrains.anko:anko:$anko_version"
}
implementation "org.jetbrains.anko:anko:0.10.8"
https://github.com/Kotlin/anko
2.anko库由gradle.buildgradle中jcenter()库自动获取
https://bintray.com/jetbrains/anko/anko
3.anko好处例如简化Toast
toast("Hi there!")
toast(R.string.message)取代 Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
4.配置androidManifest.xml文件 设置主类界面与全屏显示
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.ywjh.farawayplayer">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name=".ui.activity.SplashActivity"
android:theme="@style/AppTheme.FullScreen">//xml调用全屏
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ui.activity.MainActivity"/>
</application>
</manifest>
4.2配置apptheme全屏组件与无toolbar“css”
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme.FullScreen">
<item name="windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
</style>
<style name="pop">
<item name="android:windowEnterAnimation">@anim/pop_enter</item>
<item name="android:windowExitAnimation">@anim/pop_exit</item>
</style>
</resources>
4.3创建背景xml,调用FullScreen
src会有空白设置scalex,y进行等比拉伸
background随屏幕拉伸
<ImageView
android:id="@+id/imageView"
android:scaleX="1.5"
android:scaleY="1.5"
android:scaleType="centerCrop"
android:src="@mipmap/default_splash_bg"//背景background 与src
android:layout_width="match_parent"
android:layout_height="match_parent"/>
5.主界面封装抽取tolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize4"//根据主题适配不同高度
android:orientation="vertical">
</android.support.v7.widget.Toolbar>
6.使用插件库引入第三方控件:https://github.com/roughike/BottomBar 底部BottomBar 打开有xml配置声明
关于规约 id必须为id=xxx 以后可以判断调用 android:id会报错
<tabs>
<tab
id="@+id/tab_favorites"
icon="@drawable/ic_favorites"
title="Favorites"
barColorWhenSelected="#5D4037" />
<!-- You can use @color resources too! -->
</tabs>
Gimme that Gradle sweetness, pls?
gradle加点小cookie
compile 'com.roughike:bottom-bar:2.3.1'
配置Activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!--<include layout="@layout/toolbar"/>-->
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<com.roughike.bottombar.BottomBar
android:id="@+id/bottomBar"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_alignParentBottom="true"
app:bb_tabXmlResource="@xml/bottombar_tabs" />
</LinearLayout>
7.关于惰性加载
线程安全且初始化toolbar用到的时候才findviewbyid
override val toolbar by lazy{find<Toolbar>(R.id.tb_toolbar)}
8.发送网络请求->通过网络框架 不 使用二次封装好的框架 直接使用okhttp自己封装
https://github.com/square/okhttp
话说安卓8.0对http有特殊处理
9.0不是https都没法玩 我滴妈 去tm的新特性 让我整半天
问了问小胖子百度了一下终于搞定了
https://www.jianshu.com/p/6369d9616c13
https://blog.csdn.net/it_mr_lu/article/details/89022807
感谢,配置下东西就好了
ps:打印异常
e.printStackTrace()这个意外的很好用==之前都是一个个地方找断言
9.第三框架 加载网上抓取的图片
https://github.com/square/picasso
添加依赖
implementation 'com.squareup.picasso:picasso:2.71828'
10.添加下拉刷新效果可以利用谷歌自带的控件 在xml布局里添加
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout>包裹
在Fragment添加
refreshLayout.setColorSchemeColors(Color.RED,Color.YELLOW,Color.GREEN)三色交叠刷新 传int也行
11.列表滑动监听
override fun initListener(){
//初始化layout的 recycler_view1
recycler_view1.layoutManager=LinearLayoutManager(context)
//适配 调用HomeAdapter
recycler_view1.adapter=adapter
// 谷歌自带的刷新效果默认有点丑 初始化刷新控件
refreshLayout.setColorSchemeColors(Color.RED,Color.YELLOW,Color.GREEN)
//设置刷新监听
// 可选1.内部只有一个方法 直接打开 2.和之前一样传一个匿名内部类
refreshLayout.setOnRefreshListener {
//加载刷新数据
loadDatas()
}
//监听列表滑动 定义一个匿名内部类
recycler_view1.addOnScrollListener(object:RecyclerView.OnScrollListener(){
//滑动状态的改变
//点击左边角标 可以看源类与三种状态
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
//上拉加载更多 滑动到最后并且停止时 所以 不用监听onScrolled
/* when(newState){
//空闲状态 所以监听idel状态即可
RecyclerView.SCROLL_STATE_IDLE ->{
println("idel")
}
//拖动状态
RecyclerView.SCROLL_STATE_DRAGGING ->{
println("drag")
}
RecyclerView.SCROLL_STATE_SETTLING ->{
println("setting")
}
}*/
if(newState==RecyclerView.SCROLL_STATE_IDLE){
//并且监听是否是最后一条
//要求是LinearLayoutManager 才是列表
val layoutManager=recycler_view1.layoutManager
// 判断是线性layout
if(layoutManager is LinearLayoutManager){
//后面不用写强转 定义类型 自己就会转换
val manager:LinearLayoutManager=layoutManager
val lastPosition=manager.findLastVisibleItemPosition()
if (lastPosition==adapter.itemCount-1){
//最后一条显示了
// loadMore(adapter.itemCount-1)
}
}
}
}
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
//x y 偏移量 onScrolled会一直执行 打印偏移量
println("onscrolled dx=$dx dy=$dy")
}
})
}
12.发现个问题
13.kotlin一种写法
list?.let { this.list.clear()
this.list.addAll(list)//牛逼
notifyDataSetChanged()//刷新一下 }
}
若list不为空 则执行let内方法,为空则不执行
14.封装网络请求 使用google volley框架工具
https://blog.csdn.net/u012602304/article/details/79170137
详细的可以参考这位dalao的博客
1.一个http网络请求(request)
1.1请求方式(包含地址) 1.2请求的回调
2.专门的网络请求类(如 mQueue.add(网络请求)) 就可以发送网络请求了
来源:CSDN
作者:Kirika39
链接:https://blog.csdn.net/qq_38304672/article/details/102715081