怎么说呢  如果有一个这样的工具 既可以灵活配置 又全面丰富的老少咸宜的库是多么的美好的存在。答案是:不存在的。但是又有多少人放弃了?都在为之努力。不正是这种开源精神才能让互联网迸发活波生机吗?身为互联网浪潮中的一员,也需要时刻记着,学无止境,再一次一次次的科技浪潮中,只有勇于投身当中者才有绝地求生的可能,那些原地踏步者只有人仰马翻的结局,从15年跻身互联网行列当中,有幸见证洛基亚的衰败,站在移动开发的风口浪尖。这是一个幸运的年代,也是一个不幸的年代。从AsyncHttp到Xutil 到 Volley 到 Retrofit 再到Nohttp 再到现在的Novate 框架学了又写,当听到别人说:Volley?已经被淘汰了。我也只是心里叫苦。此时才能理解什么叫做“不在乎天长地久,只在乎你曾经拥有。”当然也有很优秀的项目 比如说剪纸堆 (heruoxin),看了他的产品你会发现一片新天地。在感叹作者扎实的功底同时,你也绝不会想使用其中的代码,因为两个字“原生”。此话不带有任何有色字眼,只是感叹作者的扎实功底。有时候框架多得让人眼花缭乱只时,原生也不失为一个好的方法。

以上闲谈可忽略

-----------------------------------------------------一个漂亮的分割线-----------------------------------------------------------

现在进入正题 由于作者只是给了简单的官网和一些简单得功能简介,所以最好的方法还是快去看作者的源码吧。

最好下载下来(本地打开总比在github快),再使用Sublime Text3打开,为什么用这个是因为它能打开文件夹,因为可以查看目录结构,至少我是这么认为的。

这边在库引用中合并了values.xml ,作者的注释以及优秀的命名方式 看了就很明了le

为避免打开项目失败 我会一个个做解释 直接粘贴一下代码 在manifest中一定要引用哦

如下配置基本解决theme的问题

下面简单介绍以下使用方法

QMUITipDialog

var dialog: QMUITipDialog? = null

fun showError(msg: String) {

dialog?.dismiss()

dialog = QMUITipDialog.Builder(this)

.setTipWord(msg)

.setIconType(QMUITipDialog.Builder.ICON_TYPE_FAIL)

.create()

dialog?.show()

dimiss()

}

fun dimiss() {

ShopApp.instance.mainHandler.postDelayed({

dialog?.dismiss()

}, 500)

}

fun complete(msg: String) {

dialog?.dismiss()

dialog = QMUITipDialog.Builder(this)

.setTipWord(msg)

.setIconType(QMUITipDialog.Builder.ICON_TYPE_SUCCESS)

.create()

dialog?.show()

dimiss()

}

fun loadingDialog(msg: String) {

dialog?.dismiss()

dialog = QMUITipDialog.Builder(this)

.setTipWord(msg)

.setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING)

.create()

dialog?.show()

}

QMUIGroupListView

val acount_safe = bottom_list.createItemView(getString(R.string.acount_safe)).apply { accessoryType = QMUICommonListItemView.ACCESSORY_TYPE_CHEVRON }

val my_invite = bottom_list.createItemView(getString(R.string.my_invite)).apply { accessoryType = QMUICommonListItemView.ACCESSORY_TYPE_CHEVRON }

val faq = bottom_list.createItemView(getString(R.string.faq)).apply { accessoryType = QMUICommonListItemView.ACCESSORY_TYPE_CHEVRON }

val feedback = bottom_list.createItemView(getString(R.string.feedback)).apply { accessoryType = QMUICommonListItemView.ACCESSORY_TYPE_CHEVRON }

val about_us = bottom_list.createItemView(getString(R.string.about_us)).apply { accessoryType = QMUICommonListItemView.ACCESSORY_TYPE_CHEVRON }

QMUIGroupListView.newSection(context)

.setUseTitleViewForSectionSpace(false)

.addItemView(merchant_msg, MyOnclickLisetner("merchant_msg"))

.addItemView(my_msg, MyOnclickLisetner("my_msg"))

.addItemView(acount_safe, MyOnclickLisetner("acount_safe"))

.addItemView(my_invite, MyOnclickLisetner("my_invite"))

.addItemView(faq, MyOnclickLisetner("faq"))

.addItemView(feedback, MyOnclickLisetner("feedback"))

.addItemView(about_us, MyOnclickLisetner("about_us"))

.addTo(bottom_list)

QMUIDialog

private fun showAutoDialog(message: String) {

val builder = QMUIDialog.MessageDialogBuilder(this@BarterPayActivity)

builder.setTitle(R.string.tip)

.setMessage(message)

.addAction(0, R.string.cancel, QMUIDialogAction.ACTION_PROP_NEGATIVE) { dialog, index -> dialog.dismiss() }

.addAction(0, R.string.confirm, QMUIDialogAction.ACTION_PROP_POSITIVE) { dialog, index ->

barterPayPresenter.getOrder(barterPayParam)

dialog.dismiss()

}

.show()

}

QMUIListPopup

private fun showMenuPop() {

if (mPopupWindow == null) {

val mGoodArray = resources.getStringArray(R.array.merchant_barter_type)

mPopupWindow = QMUIListPopup(this@BarterConsumDetailActivity,

QMUIPopup.DIRECTION_BOTTOM,

ArrayAdapter(this@BarterConsumDetailActivity, R.layout.simple_list_item, mGoodArray))

mPopupWindow?.create(QMUIDisplayHelper.dp2px(this@BarterConsumDetailActivity, 130),

QMUIDisplayHelper.dp2px(this@BarterConsumDetailActivity, 200)) { _, _, position, _ ->

launchActivity{

putExtra("type", position + 1)

putExtra("type_name", mGoodArray[position])

}

mPopupWindow?.dismiss()

}

}

mPopupWindow?.setAnimStyle(QMUIPopup.ANIM_GROW_FROM_RIGHT)

mPopupWindow?.show(topbar.find(R.id.head_right))

}

QMUIPullRefreshLayout

mPullRefreshLayout.setOnPullListener(this)

QMUITopBar

topbar.addRightImageButton(R.drawable.more_point, R.id.head_right).onClick {

showMenuPop()

}

沉浸式

mCollapsingTopBarLayout.setScrimUpdateListener(object : ValueAnimator.AnimatorUpdateListener {

override fun onAnimationUpdate(animation: ValueAnimator) {

topbar?.background?.alpha = "${animation.animatedValue}".toInt()

}

})

topbar.background.alpha = 0

mQMUIAppBarLayout.addOnOffsetChangedListener(object : AppBarStateChangeListener() {

override fun onStateChanged(appBarLayout: AppBarLayout, state: AppBarStateChangeListener.State) {

Log.d("STATE", state.name)

if (state == AppBarStateChangeListener.State.EXPANDED) {

//展开状态

mPullRefreshLayout.setEnabled(true)

mainCity?.apply {

setCompoundDrawablesWithIntrinsicBounds(null, null, ContextCompat.getDrawable(context, R.drawable.icon_pull_white), null)

textColor = Color.parseColor("#ffffff")

}

topbar.find(R.id.main_head_ll).setBackgroundResource(R.drawable.shape_color_white)

} else if (state == AppBarStateChangeListener.State.COLLAPSED) {

//折叠状态

mPullRefreshLayout.setEnabled(false)

mainCity?.apply {

setCompoundDrawablesWithIntrinsicBounds(null, null, ContextCompat.getDrawable(context, R.drawable.icon_choice_pull), null)

textColor = Color.parseColor("#333333")

}

topbar.find(R.id.main_head_ll).setBackgroundResource(R.drawable.shape_color_gray)

} else {

//中间状态

mPullRefreshLayout.setEnabled(false)

}

}

})

//以下为AppBarStateChangeListener的源码

public abstract class AppBarStateChangeListener implements AppBarLayout.OnOffsetChangedListener {

public enum State {

EXPANDED,

COLLAPSED,

IDLE

}

private State mCurrentState = State.IDLE;

@Override

public final void onOffsetChanged(AppBarLayout appBarLayout, int i) {

if (i == 0) {

if (mCurrentState != State.EXPANDED) {

onStateChanged(appBarLayout, State.EXPANDED);

}

mCurrentState = State.EXPANDED;

} else if (Math.abs(i) >= appBarLayout.getTotalScrollRange()) {

if (mCurrentState != State.COLLAPSED) {

onStateChanged(appBarLayout, State.COLLAPSED);

}

mCurrentState = State.COLLAPSED;

} else {

if (mCurrentState != State.IDLE) {

onStateChanged(appBarLayout, State.IDLE);

}

mCurrentState = State.IDLE;

}

}

public abstract void onStateChanged(AppBarLayout appBarLayout, State state);

}

其他工具类

QMUIStatusBarHelper.setStatusBarLightMode(this)

//QMUIStatusBarHelper.translucent(this, Color.parseColor("#ffffff"))

QMUIStatusBarHelper.setStatusBarLightMode(this)

关注公众号领取更多干货

android novate乱码,QMUI_Android github 上的开发利器相关推荐

  1. 团队在Github上协同开发项目流程

    2019独角兽企业重金招聘Python工程师标准>>> 多用户基于同一个Github上得项目并行开发,当前用户的开发流程: 注: origin:默认的远程主机名 master:默认的 ...

  2. Git教程之一个团队如何在github上协作开发

    1. 在项目的发起者或者Leader上传自己的代码到github上 这次我以Gpwner上的recyclerview这个项目来举例  2.点击项目的setting->Collaborators, ...

  3. android novate乱码,Android RxJava+Retrofit2+RxBinding

    Android RxJava+Retrofit2+RxBinding 本文原创,转载请注明出处.欢迎关注我的 简书. 安利一波我写的开发框架:MyScFrame喜欢的话就给个Star 前言: 之前写了 ...

  4. android novate乱码,Novate 一款Android RxStyle的网络框架

    功能优化设计:加入基础API,减少Api冗余 强大的缓存模式: 支持离线缓存, 无网络智能加载缓存,可配置是否需要缓存 cookie管理:自带cookie管理机制 全方位请求模式:支持多种方式访问网络 ...

  5. android novate乱码,Android 动态加载(四) - 简单demo实现

    前言 1. 动态加载? 此处的动态加载指的是从服务器或者其他地方获取 jar包,在运行的时候,加载jar包,然后与app中的jar包互相调用,这里为了方便演示效果,直接把 jar包放在 assets目 ...

  6. android novate乱码,Android信任指定CA證書+Okhttp+限定https

    以下筆者實測單向驗證可運作(雙向尚未驗證) 安卓指定CA證書步驟: application中加入設定android:networkSecurityConfig 可排除部分僅用http 可排除第三方使用 ...

  7. GitHub上Swift开源项目!

    swift-open-project 这里汇集了目前为止最为流行的Swift开源项目,选取SwiftGuide中的开源部分,这里将每周对项目进行总结,如果大家有推荐的可以联系thinkloki@gma ...

  8. 你会在命令行下高效管理 Github 上的项目吗,用上这个神器后助你秒实现!

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 对于大多数使用 Git 作为版本管理的技术人员来说,应该都接触过 GitHub.GitHub 就像技术人员的淘宝一 ...

  9. GitHub 优秀的 Android 开源项目 淘宝技术牛p博客整理开发中最常用的GitHub上 优秀的 Android 开源项目整理(精品)...

    原文地址为http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea 主要介绍那些不错个性化的View,包括Lis ...

最新文章

  1. linux下svn客户端安装及环境配置(转)
  2. 【数据结构】排序算法总结
  3. ASP.NET温故而知新学习系列之ASP.NET多线程编程—异步编程(九)
  4. css grid 自动高度_2020年你不应该错过的CSS新特性(二)
  5. 画单自由度系统传递函数(实频,虚频,幅频,相位,导纳)
  6. python语句关键词用法_python中关键字as的使用方法简介
  7. 关于Visual Studio 当前不会命中断点.还没有为该文档加载任何符号的解决方法
  8. 如何选择国外虚拟主机空间服务商
  9. WCF服务端基于配置的实现——拦截
  10. 用typescript完成倒计时_TypeScript(一):类型
  11. 安装LR提示缺少vc2005_sp1_with_atl_fix_redist
  12. kali社工密码字典生成
  13. JavaScript延时函数
  14. Unity lua行为树实现(可实现rpg挂机自动战斗)
  15. RK3399 M0 调试-启动
  16. (arxiv-2022)具有自适应距离对齐的时空步态特征
  17. mysql 参考文献_后记amp;参考文献
  18. 突发!人人影视字幕组14人被抓,用户超800万,涉案金额超1600万!网友炸了:免费的片没了...
  19. 全球及中国富维生素矿物质食品行业研究及十四五规划分析报告
  20. google翻译网页不错

热门文章

  1. ArcGIS教程:什么是经验贝叶斯克里金法?
  2. win10如何设置休眠选项
  3. 想学习软件测试,有没有靠谱的培训机构
  4. 贝肯斯坦界(Bekenstein bound)
  5. 表妹求我写个node脚本,把java错误码表转成excel并翻译成英文
  6. w ndows无法与设备或资源,windows无法与设备或资源通信怎么办?
  7. 虚拟桌面eDesktop
  8. 好用、高性能的远程控制软件推荐
  9. 实验结果显示首尔半导体自然光谱LED“SunLike”比白色LED更有助于植物成长,植物营养成分也增加了41%
  10. ABAP 程序运行超时