当前位置: 首页 > news >正文

做手机网站哪家好网站开发宣传方法

做手机网站哪家好,网站开发宣传方法,服务商的英文简称,做数据的网站有哪些先上效果#xff1a; 4个view的文字都是通过DataBinding填充的。交互事件#xff1a;点击图片#xff0c;切换图片 创建项目#xff08;android Studio 2023.3.1#xff09; Build.gradle(:app) 引入依赖库#xff08;完整源码#xff09; buildFeatures { vie…先上效果 4个view的文字都是通过DataBinding填充的。交互事件点击图片切换图片 创建项目android Studio 2023.3.1 Build.gradle(:app) 引入依赖库完整源码 buildFeatures {         viewBinding true         compose true     }     dataBinding {         enabled true     } plugins {alias(libs.plugins.android.application)alias(libs.plugins.jetbrains.kotlin.android)id kotlin-kapt }android {namespace com.example.lanidemoktcompileSdk 31defaultConfig {applicationId com.example.lanidemoktminSdk 24targetSdk 30versionCode 1versionName 1.0testInstrumentationRunner androidx.test.runner.AndroidJUnitRunner}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile(proguard-android-optimize.txt), proguard-rules.pro}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}kotlinOptions {jvmTarget 1.8}lintOptions {abortOnError false}buildFeatures {viewBinding truecompose true}dataBinding {enabled true} }dependencies {implementation org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2implementation org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2implementation androidx.compose.ui:ui:1.0.1implementation androidx.appcompat:appcompat:1.4.1implementation androidx.appcompat:appcompat-resources:1.4.1implementation com.google.android.material:material:1.5.0implementation androidx.compose.material:material:1.0.1implementation com.github.bumptech.glide:compiler:4.11.0implementation com.github.bumptech.glide:glide:4.11.0 } 1. 基本使用意向绑定数据显示在界面  MainActivity.kt 完整源码 在MainActivity.kt里Databinding和我们的XML文件绑定起来了现在你点击Databinding会发现直接可以跳转到对应的XML文件里面去了 package com.example.lanidemoktimport android.os.Bundle import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.databinding.BaseObservable import androidx.databinding.DataBindingUtil import com.catchpig.utils.LogUtils import com.example.lanidemokt.adapter.MainActivityBindingAdapter import com.example.lanidemokt.databinding.ActivityMainBinding import com.example.lanidemokt.viewmodel.ButtonClickListener import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.util.Dateclass MainActivity : AppCompatActivity() {/** DataBinding 对应一个Binding对象对象名是布局文件文称加上Binding后缀* binding,activity_main.xml的布局实例* xml上所有变量与点击事件必须是binding的成员属性或者成员方法函数否则操作界面无效** */var binding: ActivityMainBinding? null // 操作布局实例private var login: Login? null //声明一个响应式对象用于uivar clickListener: ButtonClickListener? null // 布局点击对象封装override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState) // setContentView(R.layout.activity_main)binding DataBindingUtil.setContentView(this, R.layout.activity_main)ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -val systemBars insets.getInsets(WindowInsetsCompat.Type.systemBars())v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)insets}initView()initData()corGlobalTest()}private fun initData() {LogUtils.init(this)}/* ** 在Controller层将我们的data与model相关联* */data class Login(var name: String LLL, var msg: String) //意向绑定响应式data class Student(var name: String LLL, var score: Int) : BaseObservable() //双击绑定响应式private fun initView() {binding?.msg?.setText(我是谁)login Login(LANI, 我是谁)// binding?.login Login(LANI, 我是谁)// 这一步必须要否则点击没反应否则界面不显示对应的名字与信息binding?.setLogin(Login(LANI, 我是谁))binding?.setStudent(Student(LEE, 199))binding?.picture1?.setOnClickListener {println(图片点击)MainActivityBindingAdapter.loadStudentDetails(it as ImageView,http://192.168.1.207:8080/download/88.jpg)}clickListenerButtonClickListener()binding?.btnHandler clickListener}/** 协程创建* */fun corGlobalTest() {GlobalScope.launch {println(|--开始global${Date()})delay(1000)println(|--END global${Date()})}println(|--END ${Date()})} } activity_main.xml 现在我们就来看看如何给我们的XML文件里面的View设置值。 在XML文件的layout标签下创建data标签在data标签中再创建variable标签variable标签主要用到的就是name属性和type属性类似于Java语言声明变量时需要为该变量指定类型和名称。新建一个名为Login的数据类。 在XML文件中声明好variable属性后接下来就可以在XML使用它了。 使用variable属性时需要使用到布局表达式 { }。 可以在布局表达式{ }中获取传入variable对象的 activity_main.xml 源码 ?xml version1.0 encodingutf-8? layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdatavariablenamelogintypecom.example.lanidemokt.MainActivity.Login /variablenamestudenttypecom.example.lanidemokt.MainActivity.Student //dataandroidx.constraintlayout.widget.ConstraintLayoutandroid:idid/mainandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivityTextViewandroid:idid/msgandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{login.name}app:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparenttools:text名字 /TextViewandroid:idid/msg2android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{login.msg}app:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/msgtools:text消息 /TextViewandroid:idid/msg4android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{ student.score}app:layout_constraintBottom_toBottomOfid/loginapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/msg2tools:text消息2 //androidx.constraintlayout.widget.ConstraintLayout /layout 2. 给控件View添加响应事件 方式一直接在Controller层通过原来的方式添加 binding?.login?.setOnClickListener {} 方式二 创建一个工具类在类中定义响应的点击事件 第一步创建点击的工具类 ButtonClickListener.kt 第二步在XML文件中添加工具类 在XML文件中添加响应事件 第三步在XML文件中添加响应事件 android:onClick{btnHandler::click} 第四步在Controller里面进行关联 binding?.btnHandler clickListener activity_main.xml  增加点击事件的完整源码 ?xml version1.0 encodingutf-8? layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdata!--需要使用到响应数据类引入data标签中再创建variable标签variable标签主要用到的就是name属性和type属性 类似于Java语言声明变量时需要为该变量指定类型和名称--import typeandroid.view.View /!-- import typecom.example.lanidemokt.MainActivity /--!-- variablenamelogintypecom.example.lanidemokt.MainActivity.Login /--variablenamebtnHandlertypecom.example.lanidemokt.viewmodel.ButtonClickListener /variablenamelogintypecom.example.lanidemokt.MainActivity.Login /variablenamestudenttypecom.example.lanidemokt.MainActivity.Student //dataandroidx.constraintlayout.widget.ConstraintLayoutandroid:idid/mainandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivityTextViewandroid:idid/msgandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{login.name}app:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparenttools:text名字 /TextViewandroid:idid/msg2android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{login.msg}app:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/msgtools:text消息 /TextViewandroid:idid/msg4android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{ student.score}app:layout_constraintBottom_toBottomOfid/loginapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/msg2tools:text消息2 /Buttonandroid:idid/loginandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text杀生丸哥哥android:onClick{btnHandler::msgTextClickListener}android:layout_marginBottom20dpapp:layout_constraintBottom_toBottomOfid/picture1app:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/msg4tools:text消息2 /ImageViewandroid:idid/picture1android:layout_width300dpandroid:layout_height200dpandroid:layout_marginBottom20dpandroid:layout_marginTop20dpapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/loginapp:layout_constraintBottom_toBottomOfparentapp:url{http://192.168.1.207:8080/download/kn.png} //androidx.constraintlayout.widget.ConstraintLayout /layout ButtonClickListener.kt 源码 package com.example.lanidemokt.viewmodelimport android.view.View import android.widget.TextView import com.example.lanidemokt.utils.LogSettingclass ButtonClickListener {/** 界面点击事件封装* */fun msgTextClickListener(view: View) {view.text 杀生丸丸哥哥一直很帅 // view.setText( 杀生丸丸哥哥一直很帅) //Use of setter method instead of property access syntax} } 3. XXXBindingAdapter方法实现响应 使用DataBinding库时DataBinding会针对控件属性生成对应的XXXBindingAdapter类如TextViewBindingAdapter类其对TextView的每个可以使用DataBinding的属性都生成了对应的方法而且每个方法都使用了BindingAdapter注解注解中的参数就是对应View的属性。 自定义BindingAdapter 编写一个处理图片的自定义BindingAdapter类。然后定义一个静态方法主要用于添加 BindingAdapter 注解注解值是 ImageView 控件自定义的属性名如下所示。 MainActivityBindingAdapter.kt 源码 图片资源是部署到本地的Nginx上的 http://192.168.1.207:8080/download/kn.png package com.example.lanidemokt.adapterimport android.util.Log import android.widget.ImageView import androidx.databinding.BindingAdapter import com.bumptech.glide.Glide import com.catchpig.utils.LogUtils import com.example.lanidemokt.utils.LogSettingclass MainActivityBindingAdapter {companion object {val TAG: String MainActivityBindingAdapter/** 通过默认adapter 设置自定app:xxx属性并设置xx属性值实现响应式修改更新** */BindingAdapter(url)JvmStaticfun loadStudentDetails(view: ImageView,url: String http://192.168.1.207:8080/download/kn.png) {Glide.with(view!!).load(url).into(view)}} } 多个参数的话修改BindingAdapter有value BindingAdapter(value [url, placeholder, error])         JvmStatic  4.双向响应绑定输入框 输入数字时消息text同步更新 Build.gradle(:app) 引入依赖库完整源码 增加自动生成BR实体的依赖库  id kotlin-kapt kapt {generateStubs true } kapt androidx.room:room-compiler:2.4.0 plugins {alias(libs.plugins.android.application)alias(libs.plugins.jetbrains.kotlin.android)id kotlin-kapt }android {namespace com.example.lanidemoktcompileSdk 31defaultConfig {applicationId com.example.lanidemoktminSdk 24targetSdk 30versionCode 1versionName 1.0testInstrumentationRunner androidx.test.runner.AndroidJUnitRunner}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile(proguard-android-optimize.txt), proguard-rules.pro}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}kotlinOptions {jvmTarget 1.8}lintOptions {abortOnError false}buildFeatures {viewBinding true // dataBinding truecompose true}dataBinding {enabled true}kapt {generateStubs true} } dependencies {implementation org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2implementation org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2implementation androidx.compose.ui:ui:1.0.1implementation androidx.appcompat:appcompat:1.4.1implementation androidx.appcompat:appcompat-resources:1.4.1implementation com.google.android.material:material:1.5.0implementation androidx.compose.material:material:1.0.1implementation com.github.bumptech.glide:compiler:4.11.0implementation com.github.bumptech.glide:glide:4.11.0kapt androidx.room:room-compiler:2.4.0 } MainActivity.kt 源码 增加绑定viewmodel    binding?.order OrderViewModel() // 绑定双向响应实体 package com.example.lanidemoktimport android.os.Bundle import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.databinding.BaseObservable import androidx.databinding.DataBindingUtil import com.catchpig.utils.LogUtils import com.example.lanidemokt.adapter.MainActivityBindingAdapter import com.example.lanidemokt.databinding.ActivityMainBinding import com.example.lanidemokt.viewmodel.ButtonClickListener import com.example.lanidemokt.viewmodel.OrderViewModel import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.util.Dateclass MainActivity : AppCompatActivity() {/** DataBinding 对应一个Binding对象对象名是布局文件文称加上Binding后缀* binding,activity_main.xml的布局实例* xml上所有变量与点击事件必须是binding的成员属性或者成员方法函数否则操作界面无效* 布局取响应式值 -表达式 { }** */var binding: ActivityMainBinding? null // 操作布局实例private var login: Login? null //声明一个响应式对象用于uivar clickListener: ButtonClickListener? null // 布局点击对象封装var vm: OrderViewModel OrderViewModel()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState) // setContentView(R.layout.activity_main)binding DataBindingUtil.setContentView(this, R.layout.activity_main)ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -val systemBars insets.getInsets(WindowInsetsCompat.Type.systemBars())v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)insets}initView()initData()corGlobalTest()}private fun initData() {LogUtils.init(this)}/* ** 在Controller层将我们的data与model相关联* */data class Login(var name: String LLL, var msg: String) //意向绑定响应式data class Student(var name: String LLL, var score: Int) : BaseObservable() //双击绑定响应式private fun initView() {binding?.msg?.setText(我是谁)login Login(LANI, 我是谁)// binding?.login Login(LANI, 我是谁)// 这一步必须要否则点击没反应否则界面不显示对应的名字与信息binding?.setLogin(Login(LANI, 我是谁))binding?.setStudent(Student(LEE, 199))MainActivityBindingAdapter.loadStudentDetails(binding?.picture1 as ImageView,http://192.168.1.207:8080/download/kn.png)binding?.picture1?.setOnClickListener {println(图片点击)LogUtils.d(图片点击)MainActivityBindingAdapter.loadStudentDetails(it as ImageView,http://192.168.1.207:8080/download/88.jpg)}clickListener ButtonClickListener()binding?.btnHandler clickListener //给控件添加响应事件 :点击事件binding?.order OrderViewModel() // 绑定双向响应实体}/** 协程创建* */fun corGlobalTest() {GlobalScope.launch {println(|--开始global${Date()})delay(1000)println(|--END global${Date()})}println(|--END ${Date()})} } OrderViewModel.kt 源码 实现双向绑定 viewmodel,BaseObservable :普通的数据对象包装成一个可观察的数据对象 package com.example.lanidemokt.viewmodelimport androidx.databinding.BaseObservable import androidx.databinding.Bindable import com.catchpig.utils.LogUtils import com.example.lanidemokt.BRclass OrderViewModel : BaseObservable() {/** 实现双向绑定 viewmodel,* BaseObservable :普通的数据对象包装成一个可观察的数据对象* 当使用name字段发生变更后若想UI自动刷新* 要求方法名必须以get开头并且标记Bindable注解* 注解才会自动在build目录BR类中生成entry* 数据模型继承 BaseObservable* 要求获取数据方法名必须以 get 开头并且标记 Bindable 注解;* 设置数据方法必须以 set 开头然后调用 notify() 函数既可以刷新视图。* BR 类是 BaseObservable 子类中由 Bindable 注解修饰的函数生成* BR 类生成位置在 //app\build\generated\source\kapt\debug\com\example\lanidemokt** */get:Bindablevar orderCount: String? 100set(orderCount) {LogUtils.d(当前orderCount${orderCount})field orderCountnotifyPropertyChanged(BR.orderCount)}}activity_main.xml源码 引入viewmodel: variable nameorder  typecom.example.lanidemokt.viewmodel.OrderViewModel / ?xml version1.0 encodingutf-8? layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdataimport typeandroid.view.View /variablenameordertypecom.example.lanidemokt.viewmodel.OrderViewModel /variablenamebtnHandlertypecom.example.lanidemokt.viewmodel.ButtonClickListener /variablenamelogintypecom.example.lanidemokt.MainActivity.Login /variablenamestudenttypecom.example.lanidemokt.MainActivity.Student //dataandroidx.constraintlayout.widget.ConstraintLayoutandroid:idid/mainandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivityButtonandroid:idid/loginandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginTop20dpandroid:onClick{btnHandler::msgTextClickListener}android:text杀生丸哥哥app:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/msg4tools:text杀生丸哥哥 /TextViewandroid:idid/msg5android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginTop20dpandroid:text{ 当前订单数量order.orderCount}app:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/logintools:text消息2 /!-- 双向响应数据赋值语法 {xx.xx}--EditTextandroid:idid/usernameandroid:layout_width100dpandroid:layout_heightwrap_contentandroid:text{order.orderCount}app:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/msg5 /!-- XXXBindingAdapter方式设置app:url --ImageViewandroid:idid/picture1android:layout_width300dpandroid:layout_height200dpandroid:layout_marginTop20dpandroid:layout_marginBottom20dpapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/loginapp:url{http://192.168.1.207:8080/download/kn.png} //androidx.constraintlayout.widget.ConstraintLayout /layout 双向响应完结。 -- 设置网络图片在ImageView 打开网络权限 AndroidManifest.xml ?xml version1.0 encodingutf-8? manifest xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsuses-permission android:nameandroid.permission.INTERNET/applicationandroid:allowBackuptrueandroid:dataExtractionRulesxml/data_extraction_rulesandroid:fullBackupContentxml/backup_rulesandroid:iconmipmap/ic_launcherandroid:labelstring/app_nameandroid:roundIconmipmap/ic_launcher_roundandroid:supportsRtltrueandroid:networkSecurityConfigxml/network_security_configandroid:themestyle/Theme.LaniDemoKttools:targetApi31activityandroid:name.MainActivityandroid:usesCleartextTraffictrueandroid:exportedtrueintent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER //intent-filter/activity/application/manifest app\src\main\res\xml\network_securit_config.xml ?xml version1.0 encodingutf-8? network-security-configbase-config cleartextTrafficPermittedtrue / /network-security-config
http://www.w-s-a.com/news/893904/

相关文章:

  • 网页网站开发公司天津seo推广
  • 网站线框图用什么做共享门店新增礼品卡兑换模式
  • 互联网建站是什么seo服务公司上海
  • 象山县城乡建设局网站做网站客户要求分期
  • 什么是网络营销型网站手机网站 图标
  • 全国新农村建设网站外包和劳务派遣哪个好
  • 网站权限控制什么软件做网站描述
  • 建网络商城网站wordpress关于
  • 专业网站建设分类标准重庆网站开发哪家专业
  • 织梦的网站关键词如何自己搭建微信小程序
  • 怎么做基金公司网站韩都衣舍网站建设ppt
  • 外贸网站模板aspnet网站开发 视频
  • 上海植物租赁做网站南浔网站建设
  • 怎么做学校网站做兼职工作上哪个网站招聘
  • 软件下载网站哪个比较好杭州开发小程序
  • 做网站都用什么技术学做名片的网站
  • 备案网站忘记密码乐装网
  • 电商扶贫网站建设淄博网站建设小程序
  • 网站群建设代理丰城网站建设公司
  • 青岛网站建设服务器wordpress迁移跳转原网站
  • 泰安网站建设哪里有公司如何注册网站
  • 做网站开专票税钱是多少个点上海市有哪些公司
  • 寿县有做网站开发的吗宁波网站建设方式
  • 网站建设和网站推广服务器怎么发布网站
  • 比较好的摄影网站雅安市政建设公司网站
  • 网站与微信区别wordpress 站内信
  • 宁夏网站开发设计说明书源码下载脚本之家
  • 邱县做网站百度搜索排名机制
  • 运城个人网站建设智慧团建系统官方网站登录
  • 公司营业执照可以做几个网站一家专门做母婴的网站