做demo:
画画板 | 记事本 | 食物商城 |
---|
使用kotlin开发完整项目
需要技术:
Navigation组件:https://blog.csdn.net/wangzhaung/article/details/103062735
safe args传值
ROOM DATABASE
Data bingding绑定适配
RecyclerView数据搜索、数据排序
LiveData
ViewModel
Repository
网格布局、瀑布布局
RecyclerView搜索
客户端-服务器端交互
Dagger-Hilt
Retrofit
Offline Cache离线缓存
kotlin Coroutines协程
LiveData
食物api:https://spoonacular.com/food-api
xml和项目关联:把layout的id给到主函数:setContentView(R.layout.activity_main)
**LinearLayout,RelativeLayout,ConstraintLayout
通过TextView在主函数获取xml的内容
一、用代码写控件
——在MainAcitivity中用代码写demo而不是design:
context中getResources方法
创建容器,需要传入context上下文
如果min SDK不符合版本,在Gradle Script——build.gradle更改即可(第二个)
代码中需要的是dp,但写的是px
dp=px*屏幕密度
东哥 12:01:39
class MainActivity : AppCompatActivity() {
@SuppressLint("UseCompatLoadingForDrawables")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//创建一个容器 LinearLayout,RelativeLayout,ConstraintLayout
var container = LinearLayout(this)
//设置容器的尺寸 宽度和高度
var mLayoutParams = LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
container.layoutParams = mLayoutParams
//设置排列方向
container.orientation = LinearLayout.VERTICAL
//设置颜色
container.background = getDrawable(R.color.purple_200)
//关联容器
setContentView(container)
//创建你一个LinearLayout容器 图片和标题
var head = LinearLayout(this).apply {
//布局参数
layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
)
orientation = LinearLayout.HORIZONTAL
background = getDrawable(R.color.white)
weightSum = 2f
}
//添加图片
ImageView(this).apply {
//设置尺寸
layoutParams = ViewGroup.LayoutParams(
dp2px(120),dp2px(100))
scaleType = ImageView.ScaleType.CENTER_CROP
//设置图片
setImageResource(R.drawable.dance)
//添加到容器中
head.addView(this)
}
//添加标题
TextView(this).apply {
//设置尺寸
layoutParams = ViewGroup.MarginLayoutParams(
dp2px(210),dp2px(100)).apply {
leftMargin = dp2px(30)
}
text = "参考消息网7月29日报道美国消费者新闻与商业频道网站近日发表美国退役四星上将、布鲁金斯学会会长约翰·艾伦和布鲁金斯学会治理研究中心副主任达雷尔·韦斯特的文章称,部署基于人工智能的武器有重大机遇,但也存在日益增加的重大威胁。虽然人工智能可以放大军事能力,但它也可能在本质上破坏稳定。文章摘编如下:\n" +
"\n" +
"美国最近派遣两个航母战斗群进入南海,以显示军事实力。这一举动是回应中国在南海水域举行军事演习。当中美这两个“超级大国”都在人工智能、远程成像和无人化武器系统方面发展先进技术能力之际,这场对峙加剧了全球紧张关系。重要的是,两国官员都应明白,新兴技术能够加快决策过程,但同时也会加大误判的风险。"
setTextColor(getColor(R.color.black))
//添加到容器中
head.addView(this)
}
//将这个容器添加到外部容器中
container.addView(head)
//Activity 生命周期 跳转(自己的界面 系统) 传值
}
//将dp值转化为px
fun dp2px(dp:Int):Int{
Log.v("pxd","${resources.displayMetrics.density}")
return (resources.displayMetrics.density * dp).toInt()
}
}
东哥 15:02:50
class MainActivity : AppCompatActivity() {
lateinit var container:ConstraintLayout
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
createContainer()
setContentView(container)
addChilds()
}
@SuppressLint("ResourceType")
fun createContainer(){
container = ConstraintLayout(this).apply {
layoutParams = ConstraintLayout.LayoutParams(
ConstraintLayout.LayoutParams.MATCH_PARENT,
ConstraintLayout.LayoutParams.MATCH_PARENT
)
background = getDrawable(R.color.purple_200)
id = resources.getInteger(R.id.mContainer)
}
}
@SuppressLint("ResourceType")
fun addChilds(){
//图片
ImageView(this).apply {
layoutParams = ConstraintLayout.LayoutParams(
dp2px(120),dp2px(100)).apply {
startToStart = resources.getInteger(R.id.mContainer)
topToTop = resources.getInteger(R.id.mContainer)
leftMargin = dp2px(16)
topMargin = dp2px(16)
}
setImageResource(R.drawable.dance)
scaleType = ImageView.ScaleType.CENTER_CROP
container.addView(this)
}
//标题
//新闻内容
}
//将dp值转化为px
fun dp2px(dp:Int):Int{
Log.v("pxd","${resources.displayMetrics.density}")
return (resources.displayMetrics.density * dp).toInt()
}
}
二、Acitivity窗口
每一个容器都有LayoutParams
avtivity详解:https://www.jianshu.com/p/fb44584daee3
BootLoader-》系统-》启动管理手机页面的进程-》SystemService!AcitivityManagerService-》Lauch-》调用onclick方法-》startApp-》ActivityThread-》创建application-》activity-》显示
ActivityClientRecord r,会记录上一次登入的记录
输出语句log:调试用,暴力输出:
v:Verbose,tag是用来过滤信息的,msg要输出的信息
i:Info
e: Error
w: Warn
响应用户的触摸事件:Down、Move、Up、Cancel
三、页面调转:
使用方法:onTouchEvent,motionEvent:
if(event.action== MotionEvent.ACTION_DOWN UP){
}
Intent意图
显示意图:当前程序内部的页面
隐式意图:跳转到其他系统或其他App的页面
在MainAcitivity:触摸一下跳转到SecondAcicitivity(下图)
四、总结
手动创建控件(容器、子控件)
LinearLayout.LayoutParams
ConstraintLayout.LayoutParams
dp density密度 px
onCreate
onStart onRestart
onResume
onPause
onStop
onDestory
创建Activity
手动创建一个类继承于AppCompatActivity()
-重写onCreate方法
-创建layout文件
-关联xml文件
-manifest中注册
getResource(resource)获取系统的资源 文本,颜色,图片
getDrawable(id)
getColor(id)
getString(id)
触摸事件onTouchEvent(event:MotionEvent)
event.action == MotionEvent.ACTION_DOWN UP MOVE CANCEL
启动页面:startActivity-finish
intent:显示意图 (此,彼class.java)
Log.v("tag","内容")
Logcat日志查看 verbose error