首页 文章 精选 留言 我的

精选列表

搜索[鸿蒙课程],共9186篇文章
优秀的个人博客,低调大师

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

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

【大数据新手上路】“零基础”系列课程--如何通过大数据开发套件Data IDE玩转大数据

免费开通大数据服务:https://www.aliyun.com/product/odps 老板每天都要出这些业务数据(销售总额、总交易量、总点击次数、总加入购物车次数、总加入收藏夹次数...),我得想个一劳永逸的方法了… 幸好,我有数加神器大数据开发套件Data IDE,搞定业务工作流调度,每日定时自动执行任务,分分钟输出计算结果。 妈妈再也不用担心我焦头奋战了…… 本教程是一个大数据开发套件Data IDE零基础教程,通过Data IDE将多源异构的数据集导入云端MaxCompute,进行计算、分析;然后通过Data IDE系统调度定时处理,最终,通过Quick BI实现企业T-1天的业务报表及分析; 大数据计算服务(MaxCompute) 快速、完全托管的TB/PB级数据仓库解决方案,向用户提供了完善的数据导入方案以及多种经典的分布式计

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

Android官方开发文档Training系列课程中文版:电池续航时间优化之监测电池电量及充电状态

原文地址:http://android.xsoftlab.net/training/monitoring-device-state/index.html 引言 作为一款优秀的APP应用,应该总是想方设法的降低电量的消耗。通过这节课的学习,你将有能力使APP可以基于设备的状态来调整APP的功能及行为。 我们可以通过比如在断开连接时关闭后台服务,或者在电量低的时候降低更新的频率等等手段来降低电量的消耗。 监测电池电量及充电状态 在更改后台的更新频次时,检查当前的电池电量及充电状态是我们先要做的。 应用程序的更新频率取决于电池的电量以及充电状态。由于设备处于充电状态时应用的耗电量几乎可以忽略,所以,在设备连接到充电器时,你可以将应用的刷新频率开到最大,如果设备没有在充电,那么降低更新频率可以延长电池的使命时间。 检查当前的充电状态 首先我们需要检查当前的充电状态。BatteryManager会将电池信息以及充电信息通过粘性Intent将其广播。 因为是粘性Intent,所以不需要注册BroadcastReceiver,只需要在调用registerReceiver()时传一个null就可以,当前的电池状态由该方法直接返回。你也可以在这里传递一个BroadcastReceiver对象,但是我们接下来的处理方式并不是在其中做的,所以这并不是必须的。 IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter); 如果设备当前处于充电状态,那么可以获得当前的充电状态,无论它是通过USB还是通过AC适配器充电的。 // Are we charging / charged? int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; // How are we charging? int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; 通常的做法是:应当是在连接到AC电源适配器时,将后台的更新频率加到最大,如果当前处于USB状态,这个频率应当适当降低,如果断开充电,则应当进一步降低。 监测充电状态的变化 设备的充电状态很容易随着充电器的插入、拔出而发生变化。所以随着充电状态的变化应当相应的调整应用的刷新频率。 当设备插上充电器或是拔出充电器时,BatteryManager都会广播一个Action,所以应当注册一个BroadcastReceiver用来监听这些事件。在清单文件中需要定义ACTION_POWER_CONNECTED及ACTION_POWER_DISCONNECTED的意图过滤器。 <receiver android:name=".PowerConnectionReceiver"> <intent-filter> <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/> <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/> </intent-filter> </receiver> 在该BroadcastReceiver内,你可以获取当前的充电状态: public class PowerConnectionReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; } } 检查电池的剩余电量 在一些情况下还需要检查设备的剩余电量。当电量较低时可能需要降低应用的后台服务频率。 你可以通过以下方式获得设备的剩余电量: int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryPct = level / (float)scale; 监测电量的重要变化 应用不能一直连续不断的监听电池的状态。 通常来说,一直不断的监听电池电量会使监听电池的任务大于应用的实际任务,所以最好是只监听一些比较重要的变更事件。 下面的清单文件摘自一段广播接收器内。该广播接收器会在电池的电量很低时或者是在电量恢复到安全水平时被触发。它监听了两个事件:ACTION_BATTERY_LOW及ACTION_BATTERY_OKAY. <receiver android:name=".BatteryLevelReceiver"> <intent-filter> <action android:name="android.intent.action.ACTION_BATTERY_LOW"/> <action android:name="android.intent.action.ACTION_BATTERY_OKAY"/> </intent-filter> </receiver> 通常情况下,在电量很低时要关闭所有的后台更新。加载在使用APP之前,手机关机了,那么应用的数据是否是最新的就没那么重要了。 在很多情况下,手机充电时是被放在一个固定的位置上的。下节课我们将会学习如何检查设备的放置环境以及如何监测设备的放置状态。

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

Android官方开发文档Training系列课程中文版:键盘输入处理之控制输入法的显示方式

原文地址:http://android.xsoftlab.net/training/keyboard-input/visibility.html 当输入的焦点进入或者离开文本框时,Android会适时的显示或隐藏输入法。系统还会决定UI及文本框如何出现在输入法的上方。比如,当垂直方向上的可用空间非常紧张时,那么文本框可能就会填充输入法上方的整个区域。对于大多数的APP来说,这样的默认行为是它们所需要的。 不过在另一些情况中,你可能需要直接控制输入法的显示方式,以及需要在输入法可见的时候控制UI的排布方式。那么这节课主要就是介绍如何实现这些。 在Activity启动的时候显示输入法 尽管在Activity启动的时候Android将焦点给了第一个文本框,但是它是不会触发输入法弹出的。这样的行为是符合正常的习惯的,因为进入文本框可能不会Activity启动后的首要任务。不管怎么说,如果进入文本框是Activity的首要任务的话(比如登录界面),那么你可能希望默认情况下进入Activity后就会弹出输入法。 为了在Activity启动后可以显示输入法,需要在清单文件中对应的Activity的元素中添加属性android:windowSoftInputMode。如下: <application ... > <activity android:windowSoftInputMode="stateVisible" ... > ... </activity> ... </application> Note:如果用户的设备含有实体按键,那么软键盘是不会弹出的。 按需求弹出输入法 如果在Activity的生命周期内有这么一个方法:你希望确保在该方法调用后输入法是可见的,那么你可以使用InputMethodManager来将它弹出。 举个例子,下面的方法持有了一个View对象,用户会在这个View内部输入点什么,所以调用requestFocus()方法可以将焦点赋给它,然后showSoftInput()就会将输入法打开: public void showSoftKeyboard(View view) { if (view.requestFocus()) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT); } } Note: 一旦输入法被弹出,那么最好不要使用代码隐藏它。系统会在用户终止文本框中的任务后将它隐藏或者用户通过系统隐藏了它(比如使用了返回按钮)。 指明你的UI应该如何响应输入法的弹出 当输入法出现在屏幕上时,它会减少APP在屏幕上的使用空间。那么系统会决定如何调整UI的部分区域,但是它可能不是最准确的。为了确保APP拥有最佳的用户体验,应该指明系统如何调整UI。 为了声明Activity的首选方式,应当在项目的清单文件中对应的Activity下添加android:windowSoftInputMode属性,并使用其中一个含有”adjust”的值。 举个例子,为了确保系统可将UI调整到可用区域,应当使用”adjustResize”: <application ... > <activity android:windowSoftInputMode="adjustResize" ... > ... </activity> ... </application> 除了以上的方法,你还可以使用组合的的方式来声明UI调整规则与输入法的可见性规则: <activity android:windowSoftInputMode="stateVisible|adjustResize" ... > ... </activity> 指明”adjustResize”是很重要的:如果UI中含有一些用户可能需要迅速访问的按键或者需要操作的文本框的话。举个例子,如果你使用相对布局将一个按钮放置到了屏幕的底部,那么使用”adjustResize”调整布局可以使该按钮出现在输入法的顶部,这样在输入完成之后就可以直接点击该按钮。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

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

用户登录
用户注册