首页 文章 精选 留言 我的

精选列表

搜索[SpringBoot4],共10000篇文章
优秀的个人博客,低调大师

4月1日云栖精选夜读 | 代号“凤凰”,阿里新零售秘密武器,今年要打入100个城市

【点击订阅云栖夜读周刊】 2019年,淘鲜达要在100个城市完成1000个门店的新零售改造。 热点热议 代号“凤凰”,阿里新零售秘密武器,今年要打入100个城市 作者:技术小能手发表在:天下网商 阿里小二的日常工作要被TA们“接管”了! 作者:隐林发表在:阿里巴巴大数据 —玩家社区 说说我为什么看好Spring Cloud Alibaba 作者:程序猿dd 知识整理 SQL Server删除数据库 作者:金澎 ECS和RDS连接条件 作者:金澎 好程序员web前端培训分享Javascript中原型属性 作者:好程序员 基于ECS使用FileZilla Server建立安全的SSL/TLS FTP 作者:bbskkb发表在:阿里云MVP 如何通过报表单元格右键控制报表跳转到不同链接地址 作者:飘然轻落 美文回顾 最快1秒鉴定真假,AI谣言粉碎机来了! 作者:技术小能手 藏经阁计划发布一年,阿里知识引擎有哪些技术突破? 作者:技术小能手发表在:阿里技术 数据报表多种序号生成方式 作者:飘然轻落 好程序员分享做HTML5页面你要懂得这些 作者:好程序员 Android环境下hanlp汉字转拼音功能的使用介绍 作者:大数据资讯 常见的七种Hadoop和Spark项目案例 作者:小猪佩佩 mysql,sqlserver数据库单表数据过大的处理方式 作者:季雨林 有奖话题讨论 程序猿们的反击,如何看待996ICU现象 数据江湖唯快不破 云数据库迈入百万IOPS时代,快到飞起是怎样的体验? 往期精彩回顾 3月29日云栖精选夜读 | 阿里云发布国内首个云原生图数据库GDB,多度关系信息查询仅需毫秒级 3月28日云栖精选夜读 | 六年打磨!阿里开源混沌工程工具 ChaosBlade 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 3月26日云栖精选夜读 | 如果我是一线技术主管…… 3月25日云栖精选夜读 | 2019阿里云峰会·北京 十年再出发 【点击订阅云栖夜读周刊】

优秀的个人博客,低调大师

4.kotlin安卓实践课程-用kotlin写第一个activity(构建mvvm和mvp基本页面)

简介 主要会通过安卓实战来讲解kotlin语法和实际应用,本教程设及知识点包括框架模式mvp+mvvm, Databinding(数据绑定框架),Dagger2(依赖注入框架),DeepLink(页面路由框架),Rxjava,RxAndroid(异步操作框架),Retrofit,Okhtttp等,不过本教程重点在kotlin所以这些框架需要了解可自行百度。 针对人群:Android中级以上,kotlin入门 现在开始写我们的第一个页面代码 1.第一步创建我们的activity类 class MainActivity : BaseBindingActivity<ActivityMainBinding>() { override fun createDataBinding(savedInstanceState: Bundle?): ActivityMainBinding { return DataBindingUtil.setContentView(this, R.layout.activity_main) } override fun initView() { } } 2.这里说明一下这里我们还定义了一个基类BaseBindingActivity,先看看它的代码 /** * Created by bigman on 18-05-18. */ abstract class BaseBindingActivity<B : ViewDataBinding> : AppCompatActivity() { lateinit var mBinding: B override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //完成databinding页面绑定 mBinding = createDataBinding(savedInstanceState) initView() } abstract fun initView() abstract fun createDataBinding(savedInstanceState: Bundle?): B //设置toolbar fun setupToolbar(toolbar: Toolbar){ toolbar.title = "" toolbar.setNavigationIcon(R.drawable.icon_back) setSupportActionBar(toolbar) } //目录菜单点击事件 override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { android.R.id.home -> onBackPressed() } return super.onOptionsItemSelected(item) } } 这个基类其实就是提供了两个抽象方法,使得每个页面必须提供一个ViewDataBinding类型实现databinding的绑定和视图初始化,这个类型其实在定义了符合databinding标准的layout文件xml就能自动生成,比如我们这里的ActivityMainBinding class MainActivity : BaseBindingActivity<ActivityMainBinding>() 3.然后我们看看什么格式的xml可以生成这个ViewDataBinding的类 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:app="http://schemas.android.com/apk/res-auto"> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.bigman.kotlin.ui.activity.MainActivity"> <com.bigman.kotlin.ui.widget.NoScrollViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent"> </com.bigman.kotlin.ui.widget.NoScrollViewPager> <android.support.design.widget.BottomNavigationView app:layout_behavior="@string/bye_burger_bottom_behavior" android:id="@+id/navigationView" android:layout_gravity="bottom" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorPrimary" app:itemIconTint="#fff" app:itemTextColor="#fff" app:menu="@menu/bottom" > </android.support.design.widget.BottomNavigationView> <android.support.design.widget.FloatingActionButton android:src="@drawable/random" android:id="@+id/floatingButton" app:layout_behavior="@string/bye_burger_float_behavior" android:layout_gravity="bottom|right" app:backgroundTint="@color/colorPrimary" android:layout_marginBottom="70dp" android:layout_marginRight="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </android.support.design.widget.CoordinatorLayout> </layout> 用过Databinding的同学很熟悉这个xml,但是没接触过的同学一定很好奇这个父布局标签layout,不懂的同学可以去学习一下Databinding 我们加入MVP,直接看看代码 class MainActivity : BaseBindingActivity<ActivityMainBinding>() ,RandomContract.View { //MVP的P层 @Inject lateinit var mPresenter : RandomPresenter override fun createDataBinding(savedInstanceState: Bundle?): ActivityMainBinding { return DataBindingUtil.setContentView(this, R.layout.activity_main) } override fun initView() { //依赖注入 getMainComponent().plus(RandomModule(this)).inject(this) } } } 这里先简单讲一下加入的mvp架构,首先是我们的MainActivity实现了RandomContract.View接口,然后用注解@Inject注入了RandomPresenter,最后在initView方法内部注入依赖 getMainComponent().plus(RandomModule(this)).inject(this) getMainComponent()这个函数被我定义到一个kt文件里面 /** * create by bigman * description:扩展函数 * 参考url:https://blog.csdn.net/comwill/article/details/77206508 * 三个特点: * 1.Kotlin的扩展函数功能使得我们可以为现有的类添加新的函数,实现某一具体功能 。 * 2.扩展函数是静态解析的,并未对原类添加函数或属性,对类本身没有任何影响。 * 3.扩展属性允许定义在类或者kotlin文件中,不允许定义在函数中。 */ fun Context.getMainComponent() = App.instance.apiComponent fun Context.toast(msg:String,length:Int = Toast.LENGTH_SHORT){ Toast.makeText(this, msg, length).show() } fun Any.toString():String{ if(this == null) return "null" else{ return toString() } } // 使用扩展函数 fun View.dp_f(dp: Float): Float { // 引用View的context return TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, dp, context.resources.displayMetrics) } // 转换Int fun View.dp_i(dp: Float): Int { return dp_f(dp).toInt() } 这里的知识点就是扩展函数 ,我在代码里写了什么是扩展函数,扩展函数可以方便我们书写包装方法,大家可以仔细看看我们的编写和使用方法 欢迎一起交流,有问题加群交流 kotlin实战交流群群二维码.png

优秀的个人博客,低调大师

【读书笔记《Android游戏编程之从零开始》】4.Android 游戏开发常用的系统控件(EditText、CheckBox、Radiob...

3.4 EditText EditText类官方文档地址:http://developer.android.com/reference/android/widget/EditText.html EditText继承TextView,所以EditText具有TextView的属性特点,下面主要介绍一些EditText的特有的输入法的属性特点 android:layout_gravity="center_vertical":设置控件显示的位置:默认top,这里居中显示,还有bottom android:hin:Text为空时显示的文字提示信息,可通过textColorHint设置提示信息的颜色。 android:singleLine:设置单行输入,一旦设置为true,则文字不会自动换行。 android:gray="top" :多行中指针在第一行第一位置et.setSelection(et.length());:调整光标到最后一行 android:autoText :自动拼写帮助。这里单独设置是没有效果的,可能需要其他输入法辅助才行 android:capitalize :设置英文字母大写类型。设置如下值:sentences仅第一个字母大写;words每一个单词首字母大小,用空格区分单词;characters每一个英文字母都大写。 android:digits :设置允许输入哪些字符。如“1234567890.+-*/%\n()” android:singleLine :是否单行或者多行,回车是离开文本框还是文本框增加新行android:numeric :如果被设置,该TextView接收数字输入。有如下值设置:integer正整数、signed带符号整数、decimal带小数点浮点数。 android:inputType:设置文本的类型 android:password :密码,以小点”.”显示文本 android:phoneNumber :设置为电话号码的输入方式。 android:editable :设置是否可编辑。仍然可以获取光标,但是无法输入。 android:autoLink=”all” :设置文本超链接样式当点击网址时,跳向该网址 android:textColor = "#ff8c00":字体颜色 android:textStyle="bold":字体,bold, italic, bolditalic android:textAlign="center":EditText没有这个属性,但TextView有 android:textColorHighlight="#cccccc":被选中文字的底色,默认为蓝色 android:textColorHint="#ffff00":设置提示信息文字的颜色,默认为灰色 android:textScaleX="1.5":控制字与字之间的间距 android:typeface="monospace":字型,normal, sans, serif, monospace android:background="@null":空间背景,这里没有,指透明 android:layout_weight="1":权重在控制控件显示的大小时蛮有用的。 android:textAppearance="?android:attr/textAppearanceLargeInverse":文字外观,这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。 <?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" android:orientation="vertical" > <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/hello_world" /> <EditText android:id="@+id/et" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/txt_hint" /> <Button android:id="@+id/btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btn_GetEditTextStr" /> </LinearLayout> public class MainActivity extends Activity { private EditText et; // 创建一个文本编辑器对象 private Button btn; private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et = (EditText) findViewById(R.id.et); btn = (Button) findViewById(R.id.btn); tv = (TextView) findViewById(R.id.tv); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // 获取EditText中的文本内容 String str = et.getText().toString(); // 让TextView将获取到的EditText内容str显示出来 tv.setText(str); } }); } } 3.5 CheckBox CheckBox类官方文档地址:http://developer.android.com/reference/android/widget/CheckBox.html <?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" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/hello_world" /> <CheckBox android:id="@+id/cb1" android:layout_width="match_parent" android:layout_height="wrap_content" android:button="@drawable/checkboxstyle" android:text="@string/checkbox1" /> <CheckBox android:id="@+id/cb2" android:layout_width="match_parent" android:layout_height="wrap_content" android:button="@drawable/checkboxstyle" android:text="@string/checkbox2" /> <CheckBox android:id="@+id/cb3" android:layout_width="match_parent" android:layout_height="wrap_content" android:button="@drawable/checkboxstyle" android:text="@string/checkbox3" /> </LinearLayout> import android.app.Activity; import android.os.Bundle; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.Toast; public class MainActivity extends Activity implements OnCheckedChangeListener { private CheckBox cb1, cb2, cb3; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 实例化3个CheckBox cb1 = (CheckBox) findViewById(R.id.cb1); cb2 = (CheckBox) findViewById(R.id.cb2); cb3 = (CheckBox) findViewById(R.id.cb3); cb1.setOnCheckedChangeListener(this); cb2.setOnCheckedChangeListener(this); cb3.setOnCheckedChangeListener(this); } // 重写监听器的抽象函数 /* * onCheckedChanged(CompoundButton buttonView, boolean isChecked) * 第一个参数确定哪一个CheckBox状态发生改变 第二个参数确定改变的CheckBox的具体状态值,true为勾选,false为未勾选。 */ @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // buttonView 选中状态发生改变的那个按钮 // isChecked 表示按钮新的状态(true/false) if (cb1 == buttonView || cb2 == buttonView || cb3 == buttonView) { if (isChecked) { // 显示一个提示消息 toastDisplay(buttonView.getText() + "选中"); } else { toastDisplay(buttonView.getText() + "取消选中"); } } } private void toastDisplay(String str) { /* * Toast.makeText(Context context, CharSequence text,int duration); * 第一个参数是上下文对象 第二个参数是显示的文本内容 * 第三个参数是显示提示消息的持续时间;其值有2个参数LENGTH_SHORT(短暂持续)和LENGTH_LONG(略长持续): * 最后,使用Toast对象调用show()方法即可 */ Toast.makeText(this, str, Toast.LENGTH_SHORT).show(); } } CheckBox样式修改: 在res/drawable中添加checkbox自定义样式的xml文件。 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 选中状态样式 --> <item android:drawable="@drawable/checkbox_checked" android:state_checked="true"></item> <!-- 未选中状态样式 --> <item android:drawable="@drawable/checkbox_normol" android:state_checked="false"></item> </selector> 然后在布局文件中引用就可以了。 <CheckBox android:id="@+id/cb1" android:layout_width="match_parent" android:layout_height="wrap_content" android:button="@drawable/checkboxstyle" android:text="@string/checkbox1" /> 3.6 Radiobutton Radiobutton类官方文档地址:http://developer.android.com/reference/android/widget/RadioButton.html RadioButton与CheckBox监听步骤类似,但RadioButton监听需要注意三点: 1.RadioButton与CheckBox使用的监听器不同。 2.RadioButton绑定监听的时候,不是每个RadioButton都去绑定,因为所有的RadioButton都被放在了RadioGroup单选组中,所以只需要将RadioGroup绑定上监听器即可。 3.重写监听器函数onCheckedChanged(RadioGroup group, int checkedId),这个函数的第一个参数是单选组,注意第二个参数,这里的checkedId不是RadioGroup单选组中的每个RadioButton的下标,而是发生状态改变的RadioButton的内存ID。所以在进行判断哪个RadioButton发生状态改变的时候,可以利用RadioButton.getID来与checkedId进行对比 <?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" android:orientation="vertical" > <RadioGroup android:id="@+id/radGrp" android:layout_width="wrap_content" android:layout_height="wrap_content" > <RadioButton android:id="@+id/rb1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/rb1" /> <RadioButton android:id="@+id/rb2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/rb2" /> <RadioButton android:id="@+id/rb3" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/rb3" /> </RadioGroup> </LinearLayout> import android.app.Activity; import android.os.Bundle; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.RadioGroup.OnCheckedChangeListener; import android.widget.Toast; public class MainActivity extends Activity implements OnCheckedChangeListener { private RadioButton rb1, rb2, rb3; private RadioGroup rg; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rb1 = (RadioButton) findViewById(R.id.rb1); rb2 = (RadioButton) findViewById(R.id.rb2); rb3 = (RadioButton) findViewById(R.id.rb3); rg = (RadioGroup) findViewById(R.id.radGrp); rg.setOnCheckedChangeListener(this);// 将单选组绑定监听器 } // 重写监听器函数 /* * onCheckedChanged(RadioGroup group, int checkedId) 第一个参数是单选组 * 第二个参数这里的checkedId发生改变的RadioButton的内存ID。 * 在进行判断哪个RadioButton发生状态改变的时候,可以利用RadioButton.getID来与checkedId进行对比 */ @Override public void onCheckedChanged(RadioGroup group, int checkedId) { if (group == rg) { String rbName = null; if (checkedId == rb1.getId()) { rbName = rb1.getText().toString(); } else if (checkedId == rb2.getId()) { rbName = rb2.getText().toString(); } else if (checkedId == rb3.getId()) { rbName = rb3.getText().toString(); } Toast.makeText(this, "选择了下标为“" + rbName + "”的单选按钮", Toast.LENGTH_SHORT).show(); } } } 本文转自叶超Luka博客园博客,原文链接:http://www.cnblogs.com/yc-755909659/p/3737949.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册