JingBin's Home

开发中所遇问题归纳

持续更新,主要记录CloudReader及工作上所遇到的问题。

DataBinding

  • DataBindingHelper.jar的使用:作为插件导入后,和生成Get、Set方法的使用类似。在对应的Bean里,可自动生成@BindablenotifyPropertyChanged(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类,不然方法会失效。

  1. 文件里引用bean:

    1
    2
    3
    <variable
    name="subjectsBean"
    type="com.example.jingbin.bean.moviechild.SubjectsBean" />
  2. 文件里调用静态方法:

    1
    2
    3
    <import type="com.example.yunyue.utils.StringFormatUtil"/>
    // 布局调用
    android:text="@{StringFormatUtil.formatName(subjectsBean.directors)}"
  3. 字符串和静态方法拼接(注意外层引号的区别,里面没有字符串时任意都行,有则使用单引号):

    1
    android:text='@{"类型:"+StringFormatUtil.formatGenres(subjectsBean.genres)}'
  4. 使用@BindingAdapter(),自定义loader用来异步载入图像:

    • 一个参数时:
    1
    2
    3
    4
    5
    6
    7
    // 任意类里声明
    @BindingAdapter("android:showImgBg")
    public static void showImgBg(ImageView imageView,String url) {
    displayGaussian(imageView.getContext(),url,imageView);
    }
    // 布局调用
    android:showImgBg='@{subjectsBean.images.large}'
    • 两个或多个参数时:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /**
    * 妹子,电影列表图
    * @param defaultPicType 妹子:1 电影:0
    */
    @BindingAdapter({"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。
  • 三元运算法:

    1
    2
    3
    导入:<import type="android.text.TextUtils" />
    使用:android:text='@{TextUtils.isEmpty(resultsBean.who)?"佚名":resultsBean.who}'
    也可以直接使用这时返回为null会不显示。
  • 若在EditText中使用双向绑定,则设置值的时候要使用android:text="@={viewmodel.username}",注意中间的=不然会达不到双向绑定的效果。


RecyclerView

  • ✔️ NestedScrollView里嵌套 RecyclerView 官方后期已经解决了显示不全问题!看引用的包是什么版本的!还需要加上这两行代码:(这样不推荐,会把内容全部一次性的加载进内存,造成卡顿)

    1
    2
    recyclerView.setNestedScrollingEnabled(false);
    recyclerView.setHasFixedSize(false);
  • ❌ NestedScrollView里嵌套 RecyclerView ,在recyclerView.setLayoutManager(new FullyLinearLayoutManager(getActivity()));之后,需要加上,不然滑动不流畅:

    1
    2
    recyclerView.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包会显示不出,加了就好了!

    1
    compile 'com.android.support:design:24.2.1'

    同时此包里还含有Toolbar的属性:

    1
    2
    app:layout_collapseMode="pin"
    app:layout_scrollFlags="enterAlways|scroll"
  • NestedScrollView里嵌套 RecyclerView 需要在onResume里加上.setFocusable(false),不然进入页面会定位到列表第一条或其他问题。

  • 添加headerview后,隐藏显示,进度条不会到达屏幕顶端。

  • 完美解决隐藏Listview和RecyclerView去掉滚动条和滑动到边界阴影的方案

  • 把WebView做为headerview添加,会有很多问题:

    • 1.有时候webview底部会显示会出现一大片的空白区域:把WebView的layout_height设置为wrap_content
    • 2.加载完成后,点击webview区域,会滚动到webview的顶部:使其失去焦点,在headerview的根布局里加上:android:descendantFocusability="blocksDescendants"
    • 3.点击item进入详情后返回,会自动滚动到webview的顶部,在activity里加上:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      @Override
      protected void onResume() {
      super.onResume();
      if (detailBinding!=null) {
      detailBinding.getRoot().setFocusable(false);
      detailBinding.getRoot().setFocusableInTouchMode(false);
      detailBinding.wvDetail.setFocusable(false);
      detailBinding.wvDetail.setFocusableInTouchMode(false);
      }
      }

ViewPager 与 Fragment

  • 父布局使用FrameLayoutScrollview下拉会有阴影效果,颜色是你配置的主题上指定的颜色。

  • 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[]

    1
    2
    3
    4
    5
    @FormUrlEncoded
    @POST("/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传值出现中文乱码问题

    1
    2
    3
    4
    5
    @FormUrlEncoded
    @POST("{user}/setDeviceName")
    @Headers("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"可以,其中

    1
    2
    3
    4
    <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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:descendantFocusability="blocksDescendants"
    android:orientation="vertical">
    <WebView
    android: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