持续更新,主要记录CloudReader及工作上所遇到的问题。
DataBinding
DataBindingHelper.jar的使用:作为插件导入后,和生成
Get、Set方法
的使用类似。在对应的Bean
里,可自动生成@Bindable
和notifyPropertyChanged(BR.title);
。此杰作是同事做的。网上也有类似的插件可以使用。神坑!windows下databinding引入文字会有问题,而mac上没有!使用
@string/string_type
引入字符串!
layout
节点写了xmlns:android="http://schemas.android.com/apk/res/android
后,子布局不能写.include 子布局时子布局根节点也要声明id,不然引用不到子布局id
内部类加”private”,导致编译不通过,DataBinding出问题的bug。Adapter里有多个Holder,Holder类前加
private
后编译不通过,去掉就好了。暂时不清楚具体原因!databinding 绑定子布局。先绑定,后父布局再
addView()
注入 databinding 后,AndriodStudio包结构变乱。解决:Android Studio2.2会出现此情况,升级到2.2.2就可以了。
databinding绑定
bean
时,里面的子类也需要继承BaseObservable
,否则会报错。recyclerview 的viewhodler 里,获得绑定 view 的databinding:
DataBindingUtil.getBinding(this.itemView);
。布局里没有声明
id
,则对应的 ItemEverydayBinding 无法生成。更改包名之后(rename – gradle.applicationId), databinding 相关文件会报错,进入
Build --> Rebuild Project
就好了!AS里更改包名:保险的方法(费了几个小时的时间的总结):在目录下新建想要的工程目录,把
activity
等包拖到新建的目录底下,然后修改gradle
下的applicationId
。这时候已经好了,可以跑起来了。但是AndroidManifest.xml
未更改package
,更改后你会发现项目中的databinding
会报错,需要使用全局替换,将之前的包名替换成想要的包名,然后进入Build --> Rebuild Project
就好了!注意:引用如:android:showImg=’@{bean.images.large}’时,里面的
bean
写错会造成编译错误!注意:
text='@{xx}'
里面的值应为String
类型。引用方法里的参数类型应一致。报错是不告诉具体的哪行代码,写多了只能自己一个个地方找。android:showImg=’@{bean.images.large}’这样设置图片会闪一下!尤其是在recyclerview里面,效果很不好,如果是写在 adapter里就好了:ImgLoadUtil.displayEspImage(bean.getImages().getLarge(), binding.ivTopPhoto, 0);。不仅仅图片,文字也会闪。加上这句就好了:
binding.executePendingBindings();
,意思是:当数据改变时,binding会在下一帧去改变数据,如果我们需要立即改变,就去调用executePendingBindings方法。布局里面的子布局里引用的bean可以一样(type一样),但是最好name不一样,不然可能会导致
setBean()
无效。改变name名就好了。布局里使用了引用方法,一定要生成该布局的databinding类,不然方法会失效。
文件里引用bean:
123<variablename="subjectsBean"type="com.example.jingbin.bean.moviechild.SubjectsBean" />文件里调用静态方法:
123<import type="com.example.yunyue.utils.StringFormatUtil"/>// 布局调用android:text="@{StringFormatUtil.formatName(subjectsBean.directors)}"字符串和静态方法拼接(注意外层引号的区别,里面没有字符串时任意都行,有则使用单引号):
1android:text='@{"类型:"+StringFormatUtil.formatGenres(subjectsBean.genres)}'使用
@BindingAdapter()
,自定义loader用来异步载入图像:- 一个参数时:
1234567// 任意类里声明"android:showImgBg")(public static void showImgBg(ImageView imageView,String url) {displayGaussian(imageView.getContext(),url,imageView);}// 布局调用android:showImgBg='@{subjectsBean.images.large}'- 两个或多个参数时:
123456789101112/*** 妹子,电影列表图* @param defaultPicType 妹子:1 电影:0*/"android:displayFadeImage","android:defaultPicType"})({public static void displayFadeImage(ImageView imageView, String url,int defaultPicType) {displayEspImage(url, imageView, defaultPicType);}// XML里使用:android:defaultPicType="@{1}"android:displayFadeImage="@{bean.url}"
注意:
- 1. 方法参数第一个是控件声明,放在第二位不可以!
- 2. 布局调用时,命名空间可自动生成。
建议:
- 1.
android:showImgBg
可任意写,但是项目里不能出现相同的命名,否则会被后来的覆盖掉!- 2. 如果 imgload:showImgBg 这样写,第一次编译会提示找不到该命名空间,跳到声明处。建议写成 android:showImgBg。
三元运算法:
123导入:<import type="android.text.TextUtils" />使用:android:text='@{TextUtils.isEmpty(resultsBean.who)?"佚名":resultsBean.who}'也可以直接使用这时返回为null会不显示。若在EditText中使用双向绑定,则设置值的时候要使用
android:text="@={viewmodel.username}"
,注意中间的=
不然会达不到双向绑定的效果。
RecyclerView
✔️
NestedScrollView
里嵌套 RecyclerView 官方后期已经解决了显示不全问题!看引用的包是什么版本的!还需要加上这两行代码:(这样不推荐,会把内容全部一次性的加载进内存,造成卡顿)12recyclerView.setNestedScrollingEnabled(false);recyclerView.setHasFixedSize(false);❌ NestedScrollView里嵌套 RecyclerView ,在
recyclerView.setLayoutManager(new FullyLinearLayoutManager(getActivity()));
之后,需要加上,不然滑动不流畅:12recyclerView.setNestedScrollingEnabled(false);recyclerView.setHasFixedSize(false);以上切换还是会卡顿,原因是角标越界,虽然
try
了,还是会卡。使用MyScrollView
也不可以。显示不全!FullyLinearLayoutManager& MyScrollView- RecyclerView 的item显示出现控件显示不全,item只显示一部分,非常怪异!在adapter中的onCreateViewHolder()中
View inflate = layoutInflater.inflate(R.layout.xxx, parent, false);
注意要依附于parent。这样就好了!
- RecyclerView: No adapter attached; skipping layout 没有数据时,
gone
掉,不然一直会提示这个! addFooterView
时,使用LinearLayout 包裹时会显示部分,改为RelativeLayout或FrameLayout正常。NestedScrollView
包裹RecyclerView
如果没关联下面design包会显示不出,加了就好了!1compile 'com.android.support:design:24.2.1'同时此包里还含有
Toolbar
的属性:12app:layout_collapseMode="pin"app:layout_scrollFlags="enterAlways|scroll"NestedScrollView里嵌套 RecyclerView 需要在
onResume
里加上.setFocusable(false)
,不然进入页面会定位到列表第一条或其他问题。添加
headerview
后,隐藏显示,进度条不会到达屏幕顶端。把WebView做为headerview添加,会有很多问题:
- 1.有时候webview底部会显示会出现一大片的空白区域:把WebView的
layout_height
设置为wrap_content
。 - 2.加载完成后,点击webview区域,会滚动到webview的顶部:使其失去焦点,在headerview的根布局里加上:
android:descendantFocusability="blocksDescendants"
- 3.点击item进入详情后返回,会自动滚动到webview的顶部,在activity里加上:12345678910protected void onResume() {super.onResume();if (detailBinding!=null) {detailBinding.getRoot().setFocusable(false);detailBinding.getRoot().setFocusableInTouchMode(false);detailBinding.wvDetail.setFocusable(false);detailBinding.wvDetail.setFocusableInTouchMode(false);}}
- 1.有时候webview底部会显示会出现一大片的空白区域:把WebView的
ViewPager 与 Fragment
父布局使用
FrameLayout
或Scrollview
下拉会有阴影效果,颜色是你配置的主题上指定的颜色。viewpager左右预加载页面的个数设置:
setOffscreenPageLimit(3);
,设置后保证页面不被销毁,切换时就不会卡顿了(显示时加载数据)。注意,如果是这个viewpager本身就在父一个viewpager的一个页面里,则设置adapter时,应传getChildFragmentManager()
,不然以上会设置不上,非法状态异常!Fragment 和当前自身所在的Activity 走一套生命周期,意思就是
Activity
走了onResume()
,fragment
才会走自身的onResume()
,多个Fragment 相互切换是不走onResume()和onDestroy()的。如果listview 里
addHeaderView()
添加轮播图,则轮播图滚动时会调用 listview 的滚动监听,且返回的firstVisiblePosition = 0
。Activity 里放多个fragment,当加载过其中一个
fragment A
后,切到其他的fragment,直至销毁fragment A后,再直接切到fragment A,这时fragmentA.getUserVisibleHint() = false
。所以依赖getUserVisibleHint() = true的逻辑要注意了!最好的方式是在 viewpager 的监听里,手动fragment.setUserVisibleHint(true)
。根据
setUserVisibleHint()
方法的调用时间,来实现 fragment 的懒加载。setUserVisibleHint() 会在onActivityCreated()
之前调用,所以可以在onActivityCreated() 进行一系列初始化的操作,然后在 setUserVisibleHint() 里请求数据。具体请见这里。如从子页面回到主页面并切到对应type的fragment里,这里的
.commit()
要改为.commitAllowingStateLoss()
,不然会出现Can not perform this action after onSaveInstanceState
错误。
Retrofit
使用
retrofit
请求时,Bean里如有Drawable
字段,而且没有赋值,会数据解析异常,出现StackOverflowError
错误。使用
retrofit
请求时,若请求成功且有数据返回还报错,看Bean
里字段或字段类型是否写错。retrofit
设置post
请求时,传数组时使用image_ids[]
12345"/vip/diagnostic_explains")(Observable<ErrorBean> postDiagnosticExplains(@Header("a") String a,@Field("userkey") String userkey, @Field("comment") String comment,@Field("image_ids[]") List<Integer> image_ids);
自己搭建服务端,Post传值出现中文乱码问题
12345"{user}/setDeviceName")("Content-Type:application/x-www-form-urlencoded; charset=utf-8") //添加(Observable<String> updateName(@Header("Authorization") String header,@Path("user") String user, @Field("deviceMac") String mac, @Field("type") String type, @Field("name") String name);
ACache
使用
ACache
工具缓存时,如果缓存的bean
类名一致,或类里面的内部类一致,这时logcat会提示有两个相同bean的id,就是无效的类,或找不到该类。所以:缓存的文件里的类名最好不要一样!使用
ACache
工具缓存时,subList没有实现序列化!缓存List
时会出错!详情
TextView
使
TextView
实现长按复制文本的功能,加上属性:android:textIsSelectable="true"
textView
中间加横线:textView .getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG );
EditText
如设置搜索模式,还要加上单行显示,不然可以一直换行。TextView
增加属性maxEms、maxLines=1、ellipsize
这样会出现”…”。
hexo
给域名加上https,有的页面没有显示【安全】的绿色标识,是因为页面内有“http”的链接,给相关链接全改为https就好了!
[Jingbin_](http://blog.csdn.net/jingbin_)
用hexo d
上传时会报错,因为中间的_
原因。用markdown写文章时,想要呈现多级关系,比如在引用代码时,要注意格式,清除最后残留的空格,不然会出现错乱的情况。
Material Desgin
兼容5.0以下水波纹效果:新建drawable-21文件,里面放ripple文件,其他正常,详情。
Android 5.1的SDK把
Button
的默认Style改了,使Button上显示因为全为大写,加上属性android:textAllCaps="false"
就好了,详情。toolbar
中设置标题和副标题文字颜色和大小时,在xml文件配置app:titleTextAppearance="@style/ToolBar.Title"
可以,其中1234<style name="ToolBar.Title" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Title"><item name="android:textSize">18.0sp</item><item name="android:textColor">@color/colorWhite</item></style>也可以在activity中设置:
binding.titleToolBar.setTitleTextAppearance(this, R.style.ToolBar_Title);
如何删除默认 button 中的样式android? 加上属性:
style="?android:attr/borderlessButtonStyle"
Android7.0
WebView在Android7.0中会显示不全,这是WebView本身的控件大小应
wrap_content
,父布局为match_parent
12345678910<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:descendantFocusability="blocksDescendants"android:orientation="vertical"><WebViewandroid:id="@+id/wv_apply"android:layout_width="match_parent"android:layout_height="wrap_content" />太大的数据不要通过Intent之间传递,传递的数据最好不要超过1M,不然会报错,报错的地方不一定是当前传值的地方,可能是下一个页面。
Do not exchange huge data (>1MB) between services and application
,可以通过SharedPreferences
转json转bean来解决。popuwindow显示有两个方法,每个方法只能在Android7.0之前或之后适应,需要辨别版本使用两和方法。链接
其他
listview
某图标显示亮或不亮的问题:先全部不亮,再根据条件变亮。- 当ScrollView里的元素想填满ScrollView时,使用 fill_parent 是不管用的,必需为ScrollView设置:
android:fillViewport="true"
。
设置透明状态栏时,布局根节点不要设置
android:fitsSystemWindows="true"
否则状态栏会一直存在,被这个问题坑了一整天!!还有整块布局也不要给设置颜色。ImageView
图片直接src
会内存泄漏,图片宽高大时会很严重,建议代码设置。1920*1080(1080p) 小米3,小米5等,属于xxhdpi,将图片放在这个文件夹内,这个分辨率的手机显示图片会很清晰,放在xhdpi清晰度会降低。
1.文字颜色选择器:里面的根节点应为
color
且最好放在新建color
文件下。2.作为背景选择器来说,根节点应该是drawble
,最好放在drawble
文件夹下。Glide
加载图片:自动缓存当前图片的尺寸,如果其他地方取这个比例的图片则取的是缓存。不缓存等比例的图片!如果其他地方想要取当前图片的缓存,可加载时设置当前图片的宽高,用这个方法:override(300,400)
,值在dimens
里取,直接设置会损失清晰度。引用的库文件里,关于gradle配置
compileSdkVersion
,buildToolsVersion
需和主工程配置一致,不然可能还会出现无法编译及点击xml文件失效等问题。adapter使用多种类别的item时,
getItemViewType
要从0开始,不然会出现角标越界异常。RatingBar
不设置半星:android:stepSize="1"
,不可滑动:android:isIndicator="true"
后台返回值为
Integer
类型的话,不能直接以!=0
判断,而是以!=null
判断,不然会调用请求失败的方法showErr()
。Postman请求出现
Invalid CORS request
,解决方法:Then add a header to your request. The header Key should be "Origin" and the header Value should be the full URL of your server (Do not forget the http:// or https://).
sourcetree “重置”是丢弃所有修改。
webview与js交互中,“遍历所有的a节点,将节点里的属性传递过去(属性自定义,用于页面跳转) ”,如果遍历两次a节点,最后一次的会覆盖前面的。
mac更新后git出错can’t start git:usr/bin/git(Android Studio2.3.3版本)出现这个问题是因为该目录下的git无法执行,解决方法:在终端界面输入
sudo /usr/bin/git
这个命令,时候会提示invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
,然后再输入xcode-select --install
就解决了!阿里百川CPS上传apk包,只能使用编译环境为gradle3.0以下的包
selector 里
android:drawable="@color/color_theme"
这样使用可能导致颜色变色,应使用android:color="@color/color_theme"
。Mac下使用
java -jar cracker2017.jar
打开jar包打开cmd命令界面,输入ping www.baidu.com,查询网站ip
About me
- Blog:http://jinbeen.com
- GitHub:https://github.com/youlookwhat