环境
引入外部jar
1 | android { |
支持HttpClient
1 | android { |
界面UI相关
状态栏透明(沉浸式体验)
Style
1 | <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> |
Java
1 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { |
Kotlin
1 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { |
设置横屏竖屏
代码中配置
1 | //设置横屏代码 |
因为横屏有两个方向的横法,而这个设置横屏的语句,如果不是默认的横屏方向,会把已经横屏的屏幕旋转180°。
所以可以先判断是否已经为横屏了,如果不是再旋转,不会让用户觉得转的莫名其妙啦!代码如下:
1 | if(this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT){ |
XML中配置
在AndroidManifest.xml
中配置
找到你所指定的activity
中加上android:screenOrientation
属性,它有以下几个参数:
- unspecified–默认值,由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向
- landscape–横屏显示(宽比高要长)
- portrait–竖屏显示(高比宽要长)
- user–用户当前首选的方向
- behind–和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
- sensor–有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换
- nosensor–忽略物理感应器,这样就不会随着用户旋转设备而更改了(”unspecified”设置除外)
移除 View 的背景色
setBackgroundResource(0)
可以移除 View 的背景色
Activity 背景透明
1 | <style name="TransparentTheme" parent="AppTheme"> <!--window背景透明--> |
添加阴影
1 | android:elevation="2dp" |
translationZ
相当于灯光的高度 值越大 阴影约淡也越大
绘制虚线
代码方式
1 | import android.content.Context; |
onSizeChanged
方法是为了做渐变
XML方式
建一个 shape_line_dash.xml
放在 drawable
目录中
1 |
|
使用方式
1 | <View |
注意点
- View的高度要比虚线的
android:width="1px"
的值大 相等是不显示的- 要添加
android:layerType="software"
关闭硬件加速 否则显示为实线
获取屏幕宽高
Resources.getSystem().getDisplayMetrics().density
可以不用 Context 也能获取屏幕密度哦
Kotlin
1 | val resources = this.resources |
屏幕的密度与资源的关系
ldpi | mdpi | hdpi | xhdpi | xxhdpi | |
---|---|---|---|---|---|
密度 | 0.75 | 1 | 1.5 | 2 | 3 |
密度DPI | 120 | 160 | 240 | 320 | 480 |
代表分辨率 | 240x320 | 320x480 | 480x800 | 720x1280 | 1080x1920 |
注意的是并不一定是尺寸超过1080x1920
就要用xxhdpi
的资源
- 比如华为M3平板 就还是建议做
xhdpi
的图
分辨率 | DP | 密度 | 密度DPI |
---|---|---|---|
1920x1200 | 853x533 | 2.25 | 360 |
用原图上切图 在853x533
尺寸上做标注
EditText
去掉下划线
1 | android:background="@null" |
光标颜色和文字一样
1 | android:textCursorDrawable="@null" |
自定义光标颜色
1 |
|
然后 android:textCursorDrawable="@drawable/edit_cursor_color"
光标置顶
1 | android:gravity="top" |
光标显示在最后
1 | name_edittext.setSelection(name_edittext.text.length) |
监听值变化
1 | num_textview.addTextChangedListener(object : TextWatcher { |
监听焦点变化
1 | num_textview.setOnFocusChangeListener { view, b -> |
默认不获取焦点
在非EditText的控件中找一个,设置成
1 | android:focusable="true" |
软键盘不遮挡
解决Android软键盘在全屏下设置adjustResize无效的问题
页面显示时不显示输入法
1 | getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); |
键盘上显示搜索
1 | android:imeOptions="actionSearch" |
Kotlin代码
1 | search_edittext.setOnEditorActionListener { textView, i, keyEvent -> |
获取资源
1 | ContextCompat.getDrawable(context, drawableId); |
ScrollView 设置内部充满全屏
1 | <ScrollView |
RecycleView
禁止上下滑动
Kotlin
1 | val linearLayoutManager = object : LinearLayoutManager(mContext, |
Java
1 | LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context) { |
登录自动切换输入框
1 | <EditText |
主要是这几行
1 | //账号输完 键盘中就可以跳转到下一个输入框 |
但是这样并没有点击登录 要想密码输入后也触发提交 就添加如下代码
1 | userpwd_edittext.setOnEditorActionListener { textView, i, keyEvent -> |
Button
去阴影
1
style="?android:attr/borderlessButtonStyle"
去背景
1
android:background="@null"
TextView
行间距
1
2android:lineSpacingExtra="0dp"
android:lineSpacingMultiplier="1.3"字间距
1
android:letterSpacing="0.1"
涟漪效果
drawable
1 |
|
drawable-v21
1 |
|
背景圆角
1 |
|
Button背景圆角+涟漪
涟漪效果用的色值#9ccc
本来的设想是设置圆角的XML 再设置涟漪效果 但是实际发现效果是 涟漪的效果并不是圆角的
所以就变通了一下 背景只设置颜色 再在外层添加一个android.support.v7.widget.CardView
- login_button_bg_anim.xml(drawable)
1 |
|
- login_button_bg_anim.xml(drawable-v21)
1 |
|
- layout
1 | <android.support.v7.widget.CardView |
软键盘默认不弹出
方法一:在OnCreate()
函数中,加上下面的代码
1 | getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); |
方法二:在AndroidManifest.xml
中,在所要设置的activity中设置以下属性就行了
1 | android:windowSoftInputMode = "stateAlwaysHidden|adjustPan" |
属性值的介绍:
stateUnspecified
这个是软件盘行为默认的设置。软键盘的状态(是否它是隐藏或可见)没有被指定。系统将选择一个合适的状态或依赖于主题的设置。
stateUnchanged
当主窗口出现在前面时,软键盘被保持它上次是什么状态,无论上次是可见或隐藏。
stateHidden
当用户选择该Activity时,软键盘被隐藏——也就是说,当用户确定导航到该Activity时,不管他离开的Activity的软键盘是可见还是隐藏都会被隐藏,不过当用户离开一个Activity而导致另一个被覆盖的Activity显示出来时,软键盘会使用默认的设置。
stateAlwaysHidden
当该Activity主窗口获取焦点时,软键盘总是被隐藏的,不管是确认导航到该Activity还是Activity被覆盖后显示出来。
stateVisible
当用户导航到Activity主窗口时,软键盘是可见的。不过当用户离开一个Activity而导致另一个被覆盖的Activity显示出来时,软键盘会使用默认的设置。
stateAlwaysVisible
当该Activity主窗口获取焦点时,软键盘总是显示的,不管是确认导航到该Activity还是Activity被覆盖后显示出来。
adjustUnspecified
这个是软件盘行为默认的设置。它不被指定是否该Activity主窗口调整大小以便留出软键盘的空间,或是否窗口上的内容得到屏幕上当前的焦点是可见的。系统将自动选择这些模式中一种主要依赖于是否窗口的内容有任何布局视图能够滚动他们的内容。如果有这样的一个视图,这个窗口将调整大小,这样的假设可以使滚动窗口的内容在一个较小的区域中可见的。
adjustResize
该Activity主窗口总是被调整屏幕的大小以便留出软键盘的空间
adjustPan
该Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互操作。
隐藏软键盘
Kotlin
1 | object ZJInputUtils { |
点击空白隐藏键盘
Kotlin
1 | /** |
Kotlin中Fragment获取实例
必须在onViewCreated
中获取
1 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { |
Fragment
XML
1 | <FrameLayout |
Kotlin
1 | fun initFragment() { |
对于宿主Activity,getSupportFragmentManager()
获取的FragmentActivity
的FragmentManager
对象;
对于Fragment,getFragmentManager()
是获取的是父Fragment(如果没有,则是FragmentActivity)的FragmentManager对象,而getChildFragmentManager()
是获取自己的FragmentManager对象。
跑马灯效果
1 | <TextView |
主要属性
1 | //设置为跑马灯显示 |
getColor getDrawable 的替代方法
Kotlin
1 | ContextCompat.getColor(mContext,android.R.color.background_light) |
屏幕常亮
1 | Window window = activity.getWindow(); |
BottomSheetBehavior使用
用这种方式作出的BottomSheet效果可以拖动高度 要想禁止拖动还是要用Popwindow
网上有说设置behavior_hideable
的值 但其实上它只能禁止拖动关闭 拖动高度变高依旧没法禁用
必须外层是CoordinatorLayout
弹出的Layout用一下属性
1 | app:behavior_hideable="true" |
XML
1 | <android.support.design.widget.CoordinatorLayout |
获取BottomSheetBehavior
1 | var behavior = BottomSheetBehavior.from(design_bottom_sheet) |
显示隐藏
1 | private fun showBottomSheet(behavior: BottomSheetBehavior<LinearLayout>) { |
CustomPopWindow
1 | private fun showPopListView() { |
常用方法
TextUtils.isEmpty()
如果传入的String 为NULL或者Length为0的话就返回 trueFastjson
转对象带泛型Java
1
JSON.parseObject(bodyInfo, new TypeReference<ResultVo<TUserBean>>() {});
Kotlin
1
2JSON.parseObject(bodyInfo, object : TypeReference<ResultVo<TUserBean>>() {
})
ListView获取子视图
ListView
有一个getChildAt()
方法,参数传的不是子视图的position
,而是当前显示区域的位置,所以正确的获取position
位置视图的方法为
1 | int firstVisiblePosition = mListView.getFirstVisiblePosition(); |
华为设备不显示日志
华为手机无法显示log解决方案,.拨号界面输入
*#*#2846579#*#*
依次选择ProjectMenu—后台设置—-LOG设置—AP日志 点击打开
华为平板 打开计算器 横屏状态 输入
()()2846579()()
Eventbus
注册
1 | override fun onStart() { |
发送粘性事件
1 | EventBus.getDefault().postSticky(questionBean) |
接收粘性事件
1 |
|