软件也要评脸蛋,UI开发的点点滴滴

    • 4.1 该如何编写程序界面
    • 4.2 常用控件的使用方法
      • 1. TextView
      • 2. Button
      • 3. EditText
      • 4. ImageView(i 大写!!!)
      • 5. ProgressBar
      • 6. AlertDialog
    • 4.3 详解3种基本布局
      • 1.LineaLayout
      • 2. RelativeLayout
      • 3.FrameLayout
    • 4.4 系统控件不过用?创建自定义控件
      • 1. 引入布局
      • 2. 创建自定义控件
    • 4.5最常用和最难用的控件:ListView
      • 1. ListView 的简单用法
      • 2. 定制ListView的界面
      • 3.提升ListView的运行效率
      • 4. ListView的点击事件
    • 4.6 更强大的滚动控件:RecycleView
      • 1. RecycleView的基本用法
      • 2. 实现横向滚动和瀑布流布局
      • 3.RecycleView 的点击事件
    • 4.7 编写界面的最佳实践
      • 1. 制作9-Patch 图片
      • 2.编写精美的聊天界面
    • 附录一:颜色查询

4.1 该如何编写程序界面

  1. 编写XML(书里使用此方法)
  2. 使用ConstrainLayou

4.2 常用控件的使用方法

1. TextView

主要用于显示文本信息

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/textView"	//给当前控件定义一个为唯一一个标识符android:layout_width="match_parent"		//和父布局一样android:layout_height="wrap_content"//控件的大小刚刚好包含里面的内容android:gravity="center"// 指定文字的对齐方式 可选 top bottom start end center 等// | 指定多值    文中 center 等同于 center_vertical|center_horizontalandroid:text="This is TextView"/>
</LinearLayout>

TextView还有很多属性,需要的话前往阅读(太多属性还是建议直接百度想要的属性)
https://blog.csdn.net/lizijie7471619/article/details/51164564

2. Button

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="wrap_content"android:textAllCaps="false"//android中默认按钮上英文字母大写   上行代码保留原始文字内容android:text="Button"/>
</LinearLayout>

小插曲:为button 的点击事件注册一个监听器

// 第一种函数式API注册监听器
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)button.setOnClickListener{//在此添加}}
}
//使用实现接口的方式注册监听器
class MainActivity : AppCompatActivity(), View.OnClickListener {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)button.setOnClickListener(this)}override fun onClick(v: View?) {when (v?.id){R.id.button ->{//在此添加}}}
}

3. EditText

用于与用户交互的控件,允许用户在控件里输入和编辑内容,并且可以对这些内容进行处理。

<EditTextandroid:id="@+id/edittext"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="Type something here"	//显示提示性文字android:maxLines="2"/>	//最大限度为两行不会拉伸
//配合button使用 将输入内容传到button的toase
class MainActivity : AppCompatActivity(), View.OnClickListener {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)button.setOnClickListener(this)}override fun onClick(v: View?) {when (v?.id){R.id.button ->{val inputText = edittext.text.toString()Toast.makeText(this,inputText,Toast.LENGTH_SHORT).show()}}}
}

4. ImageView(i 大写!!!)

在界面上展示图片的控件

<ImageViewandroid:id="@+id/imageView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/img1" />	//用src属性给ImageView一张图片
//动态修改ImageView中的图片
override fun onClick(v: View?) {when (v?.id){R.id.button ->{imageView.setImageResource(R.drawable.ic_launcher_background)
//利用ImageView的SetImageResource()方法 对imageView对象经行修改}}}

5. ProgressBar

在界面上显示一个进度条,表示程序正在加载一些数据

<ProgressBarandroid:id="@+id/progressBar"android:layout_width="match_parent"android:layout_height="wrap_content"style="?android:attr/progressBarStyleHorizontal"//设置成水平进度条android:max="100" />	//进度条的最大值100
//利用getVisibility()方法判断进度条是否可见 显示与隐藏间切换
override fun onClick(v: View?) {when (v?.id){R.id.button ->{if (progressBar.visibility == View.VISIBLE){progressBar.visibility = View.GONE}else{progressBar.visibility = View.VISIBLE}}}}
//配合长进度条使用  每点击一次按钮 进度条进度加十 最大为100
override fun onClick(v: View?) {when (v?.id){R.id.button ->{progressBar.progress = progressBar.progress + 10}}}}

6. AlertDialog

提醒非常重要的内容或者警告信息

override fun onClick(v: View?) {when (v?.id){R.id.button ->{AlertDialog.Builder(this).apply {//AlertDialog.Builder()构建对话框//在apply中为对话框设置标题 内容 可否使用Back键关闭对话框setTitle("this is Dialog")setMessage("something important.")setCancelable(false)setPositiveButton("ok"){//确认的点击事件dialog, which ->}setNegativeButton("Cancle"){//取消的点击事件dialog , which ->}show()	//将对话框显示出来}}}}

4.3 详解3种基本布局

布局与控件的关系:
在这里插入图片描述

1.LineaLayout

又称线性布局, 有垂直和水平两种

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"  //默认为horizontal还可以选vertical//选择垂直和水平的值是都要注意控件是刚好包含内容还是和和父类匹配android:layout_width="match_parent"android:layout_height="match_parent">
</LinearLayout>

layout_gravity: 决定按钮的位置

<Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="top"android:text="Button 1"/>

android:layout_weight: 允许我们使用比例的方式来指定控件的大小

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><EditTextandroid:id="@+id/input_message"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"	//表示水平方向平分宽度android:hint="Type something"/><Buttonandroid:id="@+id/send"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"	//表示水平方向平分宽度android:text="Send" />//文本和按钮weight的“1”“1”表示各占1/2
</LinearLayout>

layout_weight: 先求出总权重,和屏幕适配,每个控件的大小 = 总长 * 比例

2. RelativeLayout

又称相对布局(常用布局)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:text="button 1"/><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_alignParentTop="true"android:text="button 2"/><Buttonandroid:id="@+id/button3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:text="button 3"/><Buttonandroid:id="@+id/button4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_alignParentBottom="true"android:text="button 4"/><Buttonandroid:id="@+id/button5"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_alignParentBottom="true"android:text="button 5"/>
</RelativeLayout>

效果图:
在这里插入图片描述
alignParentXXX :表示相对父类的位置

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@+id/button3"android:layout_toLeftOf="@+id/button3"android:text="button 1"/><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@+id/button3"android:layout_toRightOf="@+id/button3"android:text="button 2"/><Buttonandroid:id="@+id/button3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:text="button 3"/><Buttonandroid:id="@+id/button4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/button3"android:layout_toLeftOf="@+id/button3"android:text="button 4"/><Buttonandroid:id="@+id/button5"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/button3"android:layout_toRightOf="@+id/button3"android:text="button 5"/>
</RelativeLayout>

效果图:
在这里插入图片描述
**layout_xxx="@+id/buttonx":**表示相对buttonx的相对位置

3.FrameLayout

又称帧布局 所有的控件默认摆放在布局的左上角

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="left"android:text="This is TextView"/><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="right"android:text="Button"/>
</FrameLayout>

效果图:
在这里插入图片描述
其中,layout_gravity用法和LineaLayout的一样

4.4 系统控件不过用?创建自定义控件

在这里插入图片描述
所有的控件都是直接或者间接继承View的,所有的布局都是直接或者间接继承自ViewGroup的。

1. 引入布局

解决多个Activity采用同一个标题栏导致代码大量重复

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/title_bg"><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_margin="5dp"android:background="@drawable/title_bg"android:text="Back"android:textColor="#fff"/>//定义一个back按钮 高宽恰好包住文本 文本颜色:白 <TextViewandroid:id="@+id/titleText"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_weight="1"android:gravity="center"android:text="Title Text"android:textColor="#faf"android:textSize="24dp"/><Buttonandroid:id="@+id/titleEdit"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_margin="5dp"android:background="@drawable/title_bg"android:text="Edit"android:textColor="#faf"/>//定义一个Edit按钮 高宽恰好包住文本  文本颜色白
</LinearLayout>
//activity_main中
<LinearLayout   xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><include layout="@layout/title" />//使用 include语句  引入标题栏
</LinearLayout>
//需要在MainActivity中隐藏自带的标题栏
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)supportActionBar?.hide()	//调用getSupportActionBar()  获得ActionBar实例 在调用它的hide()方法 将标题栏隐藏}
}

2. 创建自定义控件

解决每个Activity中都需要重新注册返回按钮的点击事件之类的事

//activity_main中
<LinearLayout   xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.uicustomviews.TitleLayout		//在布局文件中添加自定义控件android:layout_width="match_parent"android:layout_height="wrap_content"/>
</LinearLayout>//MainActivity 中
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)supportActionBar?.hide()	// 隐藏系统自带的标题栏}
}
class TitleLayout(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {init {		//定义一个结构体 对标题栏布局进行动态加载LayoutInflater.from(context).inflate(R.layout.title, this)//LayoutInflater.from(context)构建一个LayoutInflate对象//然后调用inflate方法 动态加载一个布局文件//以下为按钮的点击事件注册titleBack.setOnClickListener{val activity = context as Activityactivity.finish()//TitleLayout接受的context是一个Activity的实例  先将其转成Activity类型  调用当前的Activity的finish()销毁}titleEdit.setOnClickListener{Toast.makeText(context,"You clicked Edit button",Toast.LENGTH_SHORT).show()//定义一个Toast 文本为‘You clicked Edit button’}}}

4.5最常用和最难用的控件:ListView

1. ListView 的简单用法

class MainActivity : AppCompatActivity() {private val data = listOf("apple","banana","orange","watermelon","pear","grape","pineapple","strawberry","cherry","mango","apple","banana","orange","watermelon","pear","grape","pineapple","strawberry","cherry","mango")//定义一个集合作为数据(数据可以在数据库中提取 可以网上下载 视情况而定)override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)//使用ArrayAdapter适配器将数据传给ListViewval adapter = ArrayAdapter<String>	(this,android.R.layout.simple_list_item_1,data)//ArrayAdapter<泛型>	(Activity实例,ListView的子项布局的id,数据源)listView.adapter = adapter	//最后调用ListView的SetAdapter()方法,将构建好的适配器对象传递出去}
}

2. 定制ListView的界面

使ListView的界面显示更丰富的内容

package com.example.testlistviewimport android.app.Activity
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.ListView
import android.widget.TextView
import kotlinx.android.synthetic.main.activity_main.*
import java.text.FieldPositionclass MainActivity : AppCompatActivity() {private val fruitList = ArrayList<Fruit>()//创建一个ArrayList实例 在initFruit()传入数据 override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)initFruits()        //该方法初始化水果数据val adapter = FruitAdapter(this, R.layout.fruit_item, fruitList)listView.adapter = adapter  //注意这里的list是小写的l}private fun initFruits(){   //repeat(2){//repeat函数是kotlin中的一个标准函数fruitList.add(Fruit("apple",R.drawable.apple_pic))fruitList.add(Fruit("banana",R.drawable.banana_pic))fruitList.add(Fruit("orange",R.drawable.orange_pic))fruitList.add(Fruit("watermelon",R.drawable.watermelon_pic))fruitList.add(Fruit("pear",R.drawable.pear_pic))fruitList.add(Fruit("pineapple",R.drawable.pineapple_pic))fruitList.add(Fruit("strawberry",R.drawable.strawberry_pic))fruitList.add(Fruit("cherry",R.drawable.cherry_pic))fruitList.add(Fruit("mango",R.drawable.mango_pic))//将数据传入}}
}
class Fruit(val name:String,val imagedId:Int)
//定义一个实体类 name和imageid两个字段
class FruitAdapter(activity: Activity,val  resourId:Int,data: List<Fruit>):ArrayAdapter<Fruit>(activity,resourId,data){//创建FruitAdapter类(自定义适配器) 继承ArrayAdapter//定义主构造函数 传递Activity实例 ListView 子项布局的id 和数据源override fun getView(position: Int,convertView: View?,parent:ViewGroup):View{val view = LayoutInflater.from(context).inflate(resourId,parent,false)/*使用LayoutInflater加载布局 inflate接受三个参数  第一个 加载的布局文件id  第二个是给加载好的布局添加一个父布局第三个指定成false  表示让父布局声明的layout属性失效*/val fruitImage:ImageView =view.findViewById(R.id.fruitName)val fruitName :TextView = view.findViewById(R.id.fruitName)val fruit = getItem(position)if(fruit != null){fruitImage.setImageResource(fruit.imagedId)fruitName.text = fruit.name}return view}
}

3.提升ListView的运行效率

class FruitAdapter(activity: Activity,val  resourceId:Int,data: List<Fruit>):ArrayAdapter<Fruit>(activity,resourceId,data){override fun getView(position: Int,convertView: View?,parent:ViewGroup):View{val view:  View//在getView中判断 convertView 提高效率if (convertView == null) {view = LayoutInflater.from(context).inflate(resourceId,parent,false)}else{ view = convertView}val fruitImage: ImageView = view.findViewById(R.id.fruitImage)val fruitName: TextView = view.findViewById(R.id.fruitName)val fruit = getItem(position) //获取当前的Fruit实例if (fruit != null){fruitImage.setImageResource(fruit.imageId)fruitName.text = fruit.name}return view}
}
class FruitAdapter(activity: Activity,val  resourceId:Int,data: List<Fruit>):ArrayAdapter<Fruit>(activity,resourceId,data){inner class ViewHolder(val fruitImage: ImageView,val fruitName: TextView)override fun getView(position: Int,convertView: View?,parent:ViewGroup):View{val view:  Viewval viewHolder :ViewHolderif (convertView == null) {view = LayoutInflater.from(context).inflate(resourceId,parent,false)val fruitImage: ImageView = view.findViewById(R.id.fruitImage)val fruitName: TextView = view.findViewById(R.id.fruitName)viewHolder = ViewHolder(fruitImage,fruitName)view.tag = viewHolder//创建一个ViewHolder对象 将控件的实例存放进去  最后用setTag()存储在view中}else{view = convertViewviewHolder = view.tag as ViewHolder//调用getTag() 把ViewHolder重新取出}val fruit = getItem(position)if (fruit != null){viewHolder.fruitImage.setImageResource(fruit.imagedId)viewHolder.fruitName.text = fruit.name}return view}
}

4. ListView的点击事件

class MainActivity : AppCompatActivity() {private val fruitList = ArrayList<Fruit>()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)initFruits()val adapter = FruitAdapter(this, R.layout.fruit_item, fruitList)listView.adapter = adapterlistView.setOnItemClickListener{//注册监听器 通过position参数判断用户点击的子项 四个参数 除了position 可以用_省略 不过位置不变_, _, position, _ ->val fruit = fruitList[position]Toast.makeText(this,fruit.name,Toast.LENGTH_SHORT).show()}
}private fun initFruits(){   //repeat(2){//repeat函数是kotlin中的一个标准函数fruitList.add(Fruit("apple",R.drawable.apple_pic))fruitList.add(Fruit("banana",R.drawable.banana_pic))fruitList.add(Fruit("orange",R.drawable.orange_pic))fruitList.add(Fruit("watermelon",R.drawable.watermelon_pic))fruitList.add(Fruit("pear",R.drawable.pear_pic))fruitList.add(Fruit("pineapple",R.drawable.pineapple_pic))fruitList.add(Fruit("strawberry",R.drawable.strawberry_pic))fruitList.add(Fruit("cherry",R.drawable.cherry_pic))fruitList.add(Fruit("mango",R.drawable.mango_pic))}}
}

4.6 更强大的滚动控件:RecycleView

升级版ListView

1. RecycleView的基本用法

为了让所有版本的android都可以使用 需要添加RecycleView库的依赖,如图:

在这里插入图片描述
下面分别是activity_main FruitAdapter Fruit Mainactivity 的代码


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>
package com.example.recyclerviewimport android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflaterclass FruitAdapter(val fruitList: List<Fruit>) : RecyclerView.Adapter<FruitAdapter.ViewHolder>() {
//新建一个FruitAdapter类 为RecycleView准备一个适配器inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {val fruitImage: ImageView = view.findViewById(R.id.fruitImage)val fruitName: TextView = view.findViewById(R.id.fruitName)}/重写onCreateViewHolder  用于创建ViewHolder的实例override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FruitAdapter.ViewHolder {val view = LayoutInflater.from(parent.context).inflate(R.layout.fruit_item, parent, false)return ViewHolder(view)}//重写onBindViewHolder 用于子项数据的赋值override fun onBindViewHolder(holder: FruitAdapter.ViewHolder, position: Int) {val fruit = fruitList[position]holder.fruitImage.setImageResource(fruit.imageId)holder.fruitName.text = fruit.name}override fun getItemCount() = fruitList.size//用于告诉RecycleView数据一共有多少子项   直接返回数据源长度即可
}
package com.example.recyclerview
class Fruit(val name:String,val imageId:Int)
package com.example.recyclerviewimport androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fruit_item.view.*class MainActivity : AppCompatActivity() {private val fruitList = ArrayList<Fruit>()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)initFruits()	//初始化水果数据val layoutManager = LinearLayoutManager(this)//LinearLayoutManager是线性布局的意思 实现与ListView类似的效果recyclerView.layoutManager = layoutManagerval adaper = FruitAdapter(fruitList)//创建FruitAdapter实例 并且将水果数据传入FruitAdapter的构造函数中recyclerView.adapter = adaper
} private fun initFruits(){   //repeat(2){//repeat函数是kotlin中的一个标准函数fruitList.add(Fruit("apple",R.drawable.apple_pic))fruitList.add(Fruit("banana",R.drawable.banana_pic))fruitList.add(Fruit("orange",R.drawable.orange_pic))fruitList.add(Fruit("watermelon",R.drawable.watermelon_pic))fruitList.add(Fruit("pear",R.drawable.pear_pic))fruitList.add(Fruit("pineapple",R.drawable.pineapple_pic))fruitList.add(Fruit("strawberry",R.drawable.strawberry_pic))fruitList.add(Fruit("cherry",R.drawable.cherry_pic))fruitList.add(Fruit("mango",R.drawable.mango_pic))}}
}

2. 实现横向滚动和瀑布流布局

1.横向滚动

//fruit_item中:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="80dp"
android:layout_height="wrap_content">
//LinearLayout 改成垂直方向排列 宽度为80dp(更雅观 不然有大有大小)
<ImageViewandroid:id="@+id/fruitImage"android:layout_width="40dp"android:layout_height="40dp"android:layout_gravity="center_horizontal" //设置为在布局中水平居中android:layout_marginLeft="10dp"/>	//为了让图片保持距离
<TextViewandroid:id="@+id/fruitName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"//设置为在布局中水平居中android:layout_marginTop="10dp"/>	//为了让图片保持距离
</LinearLayout>//MainActivity中的部分文件:
class MainActivity : AppCompatActivity() {private val fruitList = ArrayList<Fruit>()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)initFruits()val layoutManager = LinearLayoutManager(this)layoutManager.orientation = LinearLayoutManager.HORIZONTAL//使用layoutManager的setOrientation() 让布局横向排列recyclerView.layoutManager = layoutManagerval adaper = FruitAdapter(fruitList)recyclerView.adapter = adaper
}
  1. 瀑布流布局
//适当修改  使得瀑布流布局更美观
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content" //这里修改android:layout_margin="5dp">  //这里<ImageViewandroid:id="@+id/fruitImage"android:layout_width="40dp"android:layout_height="40dp"android:layout_gravity="center_horizontal"android:layout_marginLeft="10dp"/><TextViewandroid:id="@+id/fruitName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="left"  //这里android:layout_marginTop="10dp"/>
</LinearLayout>//下面为MainActivity的代码:
class MainActivity : AppCompatActivity() {private val fruitList = ArrayList<Fruit>()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)initFruits()val layoutManager = StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL)//创建一个StaggeredGridLayoutManager   该构造函数中 第一个参数用于指定布局的列数 第二个 用于指定布局的排列方式recyclerView.layoutManager = layoutManagerval adaper = FruitAdapter(fruitList)recyclerView.adapter = adaper
}private fun initFruits(){   //repeat(2){//repeat函数是kotlin中的一个标准函数/*为了显示瀑布流布局的效果  定义getRandomLengthString函数  调用Range对象的random()函数来创造一个 随机数  使得各个水果的名字的长度随机增倍 且 差异较大*/fruitList.add(Fruit(getRandomLengthString("apple"),R.drawable.apple_pic))fruitList.add(Fruit(getRandomLengthString("banana"),R.drawable.banana_pic))fruitList.add(Fruit(getRandomLengthString("orange"),R.drawable.orange_pic))fruitList.add(Fruit(getRandomLengthString("watermelon"),R.drawable.watermelon_pic))fruitList.add(Fruit(getRandomLengthString("pear"),R.drawable.pear_pic))fruitList.add(Fruit(getRandomLengthString("pineapple"),R.drawable.pineapple_pic))fruitList.add(Fruit(getRandomLengthString("strawberry"),R.drawable.strawberry_pic))fruitList.add(Fruit(getRandomLengthString("cherry"),R.drawable.cherry_pic))fruitList.add(Fruit(getRandomLengthString("mango"),R.drawable.mango_pic))}}private fun getRandomLengthString(str:String):String {val n = (1..20).random()val builder = StringBuilder()repeat(n) {builder.append(str)}return builder.toString()}
}

3.RecycleView 的点击事件

class FruitAdapter(val fruitList: List<Fruit>) : RecyclerView.Adapter<FruitAdapter.ViewHolder>() {inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {val fruitImage: ImageView = view.findViewById(R.id.fruitImage)val fruitName: TextView = view.findViewById(R.id.fruitName)}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FruitAdapter.ViewHolder {val view = LayoutInflater.from(parent.context).inflate(R.layout.fruit_item, parent, false)// 创建一个viewHolder实例  然后对最外层布局(itemView)和imageView注册点击事件val viewHolder = ViewHolder(view)viewHolder.itemView.setOnClickListener{val position = viewHolder.adapterPositionval fruit = fruitList[position]Toast.makeText(parent.context,"you clicked view ${fruit.name}",Toast.LENGTH_SHORT).show()}viewHolder.fruitImage.setOnClickListener{val position = viewHolder.adapterPositionval fruit = fruitList[position]Toast.makeText(parent.context,"you clicked image ${fruit.name}",Toast.LENGTH_SHORT).show()}return viewHolder}override fun onBindViewHolder(holder: FruitAdapter.ViewHolder, position: Int) {val fruit = fruitList[position]holder.fruitImage.setImageResource(fruit.imageId)holder.fruitName.text = fruit.name}override fun getItemCount() = fruitList.size
}

4.7 编写界面的最佳实践

1. 制作9-Patch 图片

可以直接看以下链接:
https://www.jianshu.com/p/9fe0b3d9a1dd

上文中还是比较繁琐的 我的理解是:可以当成聊天气泡 你输入的字多 气泡越长或者越宽 然后你该做的就是锁定一个区域让它可以自动伸缩(只是你指定的区域可以,其他区域不行) 就像你气泡的边框一样

2.编写精美的聊天界面

//activity_main文件中:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#d8e0e8"><android.recycleview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><EditTextandroid:id="@+id/inputText"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:hint="Type somgthing here"android:maxLines="2"/><Buttonandroid:id="@+id/send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Send"/></LinearLayout>
</LinearLayout>//创建Msg类:
package com.example.uibestpracticeclass Msg(val content:String,val type:Int){companion object{const val TYPE_RECEIVED = 0const val TYPE_SEND = 1}
}//msg_left_item文件中:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="10dp"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="left"android:background="@drawable/message_left"><TextViewandroid:id="@+id/leftMsg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:textColor="#fff"/></LinearLayout>
</FrameLayout>//msg_right_item文件中:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="10dp"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="right"android:background="@drawable/message_right"><TextViewandroid:id="@+id/rightMsg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_margin="10dp"android:textColor="#1000"/></LinearLayout></FrameLayout>//创建MsgAdapter类:
package com.example.uibestpracticeimport android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.core.os.persistableBundleOf
import androidx.recyclerview.widget.RecyclerViewclass MsgAdapter(val msgList: List<Msg>):RecyclerView.Adapter<RecyclerView.ViewHolder>() {inner class LeftViewHolder(view:View):RecyclerView.ViewHolder(view){val leftMsg : TextView = view.findViewById(R.id.leftMsg)}inner class RightViewHolder(view:View):RecyclerView.ViewHolder(view){val rightMsg : TextView = view.findViewById(R.id.leftMsg)}override fun getItemViewType(position: Int): Int {val msg = msgList[position]return msg.type}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = if(viewType == Msg.TYPE_RECEIVED) {val view = LayoutInflater.from(parent.context).inflate(R.layout.msg_left_item,parent,false)LeftViewHolder(view)}else{val view = LayoutInflater.from(parent.context).inflate(R.layout.msg_right_item,parent,false)RightViewHolder(view)}override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {val msg = msgList[position]when(holder){is LeftViewHolder -> holder.leftMsg.text = msg.contentis RightViewHolder-> holder.rightMsg.text = msg.content}}override fun getItemCount() = msgList.size
}//MainActivity中:
//package com.example.uibestpractice
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.activity_main.*class MainActivity : AppCompatActivity() ,View.OnClickListener{private val msgList = ArrayList<Msg>()private var adapter: MsgAdapter? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)initMsg()val layoutManager = LinearLayoutManager(this)recyclerView.layoutManager = layoutManageradapter = MsgAdapter(msgList)recyclerView.adapter = adaptersend.setOnClickListener(this)}override fun onClick(v: View?){when(v){send -> {val content = inputText.text.toString()if (content.isNotEmpty()){val msg = Msg(content,Msg.TYPE_SEND)msgList.add(msg)adapter?.notifyItemInserted(msgList.size - 1 )//当有新消息时 刷新RecyclerView中的显示recyclerView.scrollToPosition(msgList.size - 1)//将RecyclerView定位到最后一行inputText.setText("")//清空输入框中的内容}}}}private fun initMsg(){val msg1 = Msg("hello guy.",Msg.TYPE_RECEIVED)msgList.add(msg1)val msg2 = Msg("hello. who is that?",Msg.TYPE_SEND)msgList.add(msg2)val msg3 = Msg("This is Tom.Nice talking to you ",Msg.TYPE_RECEIVED)msgList.add(msg3)}}

标准函数repeat:
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/repeat.html

附录一:颜色查询

感叹号前面为代码
#FFFFE0!–亮黄色 -->

#FFFF00!–黄色 -->

#FFFAFA!–雪白色 -->

#FFFAF0!–花白色 -->

#FFFACD!–柠檬绸色 -->

#FFF8DC!–米绸色 -->

#FFF5EE!–海贝色 -->

#FFF0F5!–淡紫红 -->

#FFEFD5!–番木色 -->

#FFEBCD!–白杏色 -->

#FFE4E1!–浅玫瑰色 -->

#FFE4C4!–桔黄色 -->

#FFE4B5!–鹿皮色 -->

#FFDEAD!–纳瓦白 -->

#FFDAB9!–桃色 -->

#FFD700!–金色 -->

#FFC0CB!–粉红色 -->

#FFB6C1!–亮粉红色 -->

#FFA500!–橙色 -->

#FFA07A!–亮肉色 -->

#FF8C00!–暗桔黄色 -->

#FF7F50!–珊瑚色 -->

#FF69B4!–热粉红色 -->

#FF6347!–西红柿色 -->

#FF4500!–红橙色 -->

#FF1493!–深粉红色 -->

#FF00FF</color–紫红色

#FF00FF!–红紫色 -->

#FF0000–红色 -->

以下是一些个人在学习过程中的经验或者说犯的错误
1.

//activity_main文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout   xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><include layout="@layout/title" />	//*** 这里只用了引入布局再使用自定义控件的方法 会使得按件无反应   应该删去引入布局的部分<com.example.uicustomviews.TitleLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"/>
</LinearLayout>
  1. 看书过程在自己编写代码的时候很容易就把大小写看错 还有多或者少了字母,程序错误时候先检查这个。
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 第六周 JDBK使用及基本封装

    JDBC技术 Java访问数据库技术概述 在JDBC出现之前,早期java需要访问数据库时,需要根据不同的数据库管理系统(DBMS)编写不同的数据源,使用一项称之为JDBC-ODBC桥链接模式。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G9IQuuRy-1596978444053)(…...

    2024/4/7 4:46:26
  2. OpenSTF 初体验

    本文主要介绍,Windows下通过虚拟机部署Docker,并通过Docker安装OpenSTF,来完成试用体验。01OpenSTFOpenSTF是一个手机设备管理平台,可以对手机进行远程管理、调试、远程手机桌面监控等操作。这个系统类似于目前很流行的云测服务比如Testin,虽然网页上提供的设备很像模拟器…...

    2024/4/17 21:18:03
  3. 转:德鲁克:把员工当自己人照顾,是取得成功的前提

    个人理解:优先考虑他人的需求,主动承担责任 绝大多数人不可能在未受尊重或受到不公平对待时,仍能包容他人。 你可能不喜欢某个人,但你仍需公平诚实地对待他们,尊重他们。 功劳归于员工,责任自己承担。作为领导,别无选择。 人们只愿意服从在考虑其利益方面比他们自己更睿…...

    2024/4/21 19:29:33
  4. 数据库开发技术的课程记录

    数据库开发技术复习「部分」 oracle的无阻塞读。修改才会加锁,行级锁。读写器不会阻塞写入器。提高了并发效率,缺点,无阻塞设计需要保证一次最多只有一个用户读取一行。 where xxx【 FOR UPDATE】关键字 NULL处理的差异,基本差别(并发控制机制) SQL优化方向:索引,执行计…...

    2024/4/24 17:16:36
  5. 谈下对微*1软“服务*1协议”的一点看法

    如果微*1*软的服务*1协议确实是真的,这基本确定了脱*1钩是必然的了,重建软硬件生态就是我们必须干,而且要加快干的事情了。这当然不是个好消息,但如果他们真的这么做,其实也没什么大不了的,既然都撕破脸了,一是可以放肆破1*解老*1外的东西先顶几年,另外就要老老实实加大…...

    2024/4/22 3:33:26
  6. OpenCV-Python 将摄像头捕获的视频灰度处理并保存(代码+详解)

    import numpy as np import cv2 as cv cap = cv.VideoCapture(0)#通过本地摄像头捕获视频 fourcc = cv.VideoWriter_fourcc(*DIVX)#指定fourcc编码 out = cv.VideoWriter(C:\\Users\\DELL4\\Desktop\\output.mp4,fourcc,20.0,(640,480),0)用于灰度图 这里,out是一个VideoWri…...

    2024/4/7 13:03:51
  7. 安卓GreenDao基本使用

    配置参考github官方https://github.com/greenrobot/greenDAO不过发现配置似乎需要翻墙首先在build.gradlerepositories {google()jcenter()mavenCentral() // add repository}classpath org.greenrobot:greendao-gradle-plugin:3.3.0在build.gradle(app中)上部apply plugin: or…...

    2024/4/7 10:12:33
  8. VMware下的Linux的安装配置详解

    点击创建新的虚拟机自定义创建直接下一步选择一个CentOS镜像文件,可以去官网下载,然后下一步为虚拟机取一个名字,以及虚拟机要安装的位置根据自己电脑的配置分配处理器核数,电脑好一点可以给8个内核,差一点可以给2~4个内核这里根据自己电脑内存大小给定虚拟机内存,我电脑…...

    2024/4/22 16:31:30
  9. Koa2基础入门教程

    一、koa安装与hello world示例: koa需要node v7.6.0以上(因为需要ES6) npm install koa --save 习惯性加上save,不加也可以。 koa的hello world示例 const Koa = require(koa); const app = new Koa(); app.use(async(ctx)=>{ctx.body = hello koa!; }) app.listen(3000)…...

    2024/4/7 12:52:57
  10. VMware 桥接,NAT模式,仅主机模式理解

    VMware网络设置里面有三种模式1,桥接模式:实际是使用电脑的真实网卡和VMware通讯,需要网卡和虚拟机在同一个网段,并且手动分配一个IP地址桥接模式配置方法:VMware选择桥接模式电脑上 -> cmd 输入 ipconfig 查看 电脑使用的网段,因为我是网线直连路由器,所以查看以太网…...

    2024/4/23 23:18:13
  11. PYTHON从娃娃学起教程 教案 第三课键盘的使用

    第一应该是先认识键盘,正好我有两个键盘样板,一个是日语键盘,一个是英语键盘下载图片解释然后下面是快捷键说明,然后用python开发的一个小程序,让孩子熟悉键盘,所以我下载了贪吃蛇,还有打飞机的小游戏,一键运行,前十课不能让孩子觉得编程的枯燥,兴趣教学下面是电脑使…...

    2024/4/23 5:15:21
  12. gradle 各种版本下载(自取自用)

    CSDN全都要积分下载 自取自用(ps:如果没有你想要的版本,可以留言,我帮你下载) 官方地址 官方下载gradel地址 不翻墙不能下载司机 下载地址 gradle-2.0-all下载 gradle-2.1-all下载 gradle-2.2-all下载 gradle-2.3-all下载 gradle-2.4-all下载 gradle-2.5-all下载 gradle-2…...

    2024/4/7 10:48:42
  13. U校园自动刷课浏览器-源代码分析

    每个平台的网课都有相应的测试,然鹅这些测试对于那些坚持快乐学习至上原则的同学就不是那么友好了,本着让这部分同学也能享受考高分的乐趣,找到了一些让网课学习更快乐的小帮手。正式教程:内置刷课插件,添加下列代码,实现自动刷课链接:https://wws.lanzous.com/b01hl6qzc…...

    2024/4/17 4:35:57
  14. 深度学习入门之PyTorch学习笔记:卷积神经网络

    深度学习入门之PyTorch学习笔记绪论1 深度学习介绍2 深度学习框架3 多层全连接网络4 卷积神经网络4.1 主要任务及起源4.2 卷积神经网络的原理和结构4.2.1 卷积层1.概述2.局部连接3.空间排列4.零填充的使用5.步长限制6.参数共享7.总结4.2.2 池化层4.2.3 全连接层4.2.4 卷积神经网…...

    2024/4/16 0:43:46
  15. JVM详解(一)之初识JVM

    前言: 一些有一定工作经验的开发人员,觉得SSM、微服务等上层技术才是重点,而忽略了基础的技术,这其实是不可取的,作为一个想向上发 展的开发人员,打好基础是最关键的,不然基础的知识永远是你的致命缺点! 关于JVM详解的博文将以连载方式持续发布到个人分类专栏的JVM详解…...

    2024/4/14 3:05:23
  16. 博文目录索引

    博文目录索引 整理下博客分类,只按时间分有点乱。一. 基础理论:机器学习基础,深度学习基础 二. 流行技术:生成对抗,强化学习,图神经网络 三. 应用领域:推荐系统,计算机视觉,自然语言处理,多媒体和多模态,金融量化 四. 其他:备忘和github一. 基础理论 机器学习基础文…...

    2024/4/9 9:45:57
  17. AOM(Accessibility Object Model 无障碍对象模型)草案解读

    最近在看 AOM(Accessibility Object Model) 相关的草案,草案推出一两年了,发现还没有相关的中文文档或者博客谈到这个,看来国内做的人还是太少了,一般也只有大厂会去跟进这一块。下面我就介绍 AOM 相关的特性,内容主要翻译自草案,也会加上自己的一些理解,同时复现草案…...

    2024/4/19 1:28:15
  18. 英读廊——一个人的旅行:原汁原味希腊克里特游记

    * 用英语自身来理解和学习英语是最好的方式,《英读廊》是《满庭说英语》中的拓展阅读系列,这一系列的文章力求帮助大家在英语阅读能力上有所提升,并树立英语思维; * 推荐的阅读的方法是:先原文,适当看解析阅读,还有疑惑再看双语对照。 * 解析中英语单词的音标使用Dictco…...

    2024/4/7 17:02:42
  19. 10 监听器 watch

    被监听的变量或对象发生改变就执行相应的方法,不建议过多使用,影响性能。 例如: 监听变量:监听数组:反序:...

    2024/4/7 7:20:09
  20. IDM下载---一键安装版

    IDM下载器 1.平时我们在下载一些外网上面的文件或者网盘上的文件的时候,那个速度那叫一个惨不忍睹.下面我将分享一个我个人正在使用的IDM下载器,下载链接我会放在本文下面,希望对大家有帮助。 这里我就不多解释IDM的原理-----有想法的朋友可以去度娘 2. 使用步骤 1.下载好文…...

    2024/4/13 20:35:23

最新文章

  1. Spring boot + MyBatis-Plus3

    学习 增删改查 在 service 层直接调用。 insert(user) 增selectById(1) 根据id查updateById(user) 更新selectByMap(map) 根据条件查selectBatchIds(list) 根据多个id查selectPage(page, null) 分页查deleteById(1) 删除id为1的用户deleteByMap(map) 删除符合条件的用户d…...

    2024/4/25 5:58:55
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 利用Sentinel解决雪崩问题(一)

    1、解决雪崩问题的常见方式有四种: 超时处理:设定超时时间&#xff0c;请求超过一定时间没有响应就返回错误信息&#xff0c;不会无休止等待;舱壁模式:限定每个业务能使用的线程数&#xff0c;避免耗尽整个tomcat的资源&#xff0c;因此也叫线程隔离;熔断降级:由断路器统计业务…...

    2024/4/24 3:11:43
  4. 腾讯云轻量服务器流量不够用了会怎么样?

    腾讯云轻量应用服务器是限制月流量的&#xff0c;如果当月流量不够用了&#xff0c;流量超额了怎么办&#xff1f;流量超额后&#xff0c;需要另外支付流量费&#xff0c;如果你的腾讯云账号余额&#xff0c;就会自动扣除对应的流量费&#xff0c;如果余额不足&#xff0c;轻量…...

    2024/4/23 6:15:09
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/4/25 1:03:45
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/4/24 1:17:44
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/4/24 11:04:21
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/4/24 9:59:40
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/4/24 11:04:20
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/4/24 11:04:20
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/4/24 9:58:43
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/4/24 11:04:19
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/4/24 11:04:19
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/4/24 11:04:18
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/4/24 11:04:18
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/4/24 11:04:17
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/4/25 3:28:56
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/4/25 3:39:58
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/4/24 11:04:13
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/4/24 11:04:13
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/4/24 11:04:13
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/4/24 9:54:49
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/4/24 10:43:15
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/4/25 1:03:22
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57