如何理解非主线程可以更新UI

谷歌在 viewRootImpl 中检查更新ui的线程

void checkThread() {

if (mThread != Thread.currentThread()) {

throw new CalledFromWrongThreadException(

"Only the original thread that created a view hierarchy can touch its views.");

}

}

复制代码

在执行onCreate的时候这个判断并没有执行到

dialogFragment 全屏时左右留空的解决方案

在 fragment#onResume 中重新调整 window 布局

android.view.WindowManager.LayoutParams lp = window.getAttributes();

lp.width = WindowManager.LayoutParams.MATCH_PARENT;

lp.height = WindowManager.LayoutParams.WRAP_CONTENT;

window.setAttributes(lp);

复制代码

dialogFragment 全屏时状态栏出现黑色布局的解决方案

在主题中设置

true

复制代码

此时 window 为 wrap_content,如果出现左右空白,则考虑使用上个问题的方案。

recyclerview 调用 notifyItemRemoved 方法移除某个 Item 之后因为引用 position 引起 crash 的原因

`notifyItemRemoved`方法并不会移除列表的数据源的数据项导致数据源中的数据与列表Item数目不一致,需要同步刷新数据源。

recyclerview 局部刷新Item时会因为默认动画导致闪烁的解决方案

因为recyclerview存在ItemAnimator,且在删除/更新/插入Item时会触发,可设置不支持该动画即可。

((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);

复制代码

recyclerview 中的 item 出现莫名的偏移滚动

这个问题经过定位存在于 viewholder 中的某个 view 可能提前获取到焦点。 同时在。alibaba-vlayout 库中也发现有人反馈改问题。 issues-255 解决的方法是在 Recyclerview中外层父布局中添加 android:descendantFocusability="blocksDescendants" 用于父布局覆盖 Recyclerview 优先抢占焦点。

recyclerview 内容超过一屏时,findFistCompletelyVisibleItemPosition 会返回 -1 的原因

原因是在 findOneVisibleChild 计算出来的 start 和 end 已经超过了 reclclerview 的 start 和 end.经过研究源码得到以下。

findFirstCompletelyVisibleItemPosition -> -1

findLastCompletelyVisibleItemPosition -> -1

findFirstVisibleItemPosition -> 正常

findLast

复制代码

textview 中富文本点击事件拦截了长按事件的解决方案

这个问题常见于消息列表中,某条消息使用了ClickableSpan用于处理富媒体的点击事件,同时这个消息又需要支持长按复制。由于LinkMovementMethod方法在onTouchEvent一直返回true,可以通过自定义View.onTouchListener来替换setMovenmentMethod达到效果。

public class ClickMovementMethod implements View.OnTouchListener {

private LongClickCallback longClickCallback;

public static ClickMovementMethod newInstance() {

return new ClickMovementMethod();

}

@Override

public boolean onTouch(final View v, MotionEvent event) {

if (longClickCallback == null) {

longClickCallback = new LongClickCallback(v);

}

TextView widget = (TextView) v;

// MovementMethod设为空,防止消费长按事件

widget.setMovementMethod(null);

CharSequence text = widget.getText();

Spannable spannable = Spannable.Factory.getInstance().newSpannable(text);

int action = event.getAction();

if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_UP) {

int x = (int) event.getX();

int y = (int) event.getY();

x -= widget.getTotalPaddingLeft();

y -= widget.getTotalPaddingTop();

x += widget.getScrollX();

y += widget.getScrollY();

Layout layout = widget.getLayout();

int line = layout.getLineForVertical(y);

int off = layout.getOffsetForHorizontal(line, x);

ClickableSpan[] link = spannable.getSpans(off, off, ClickableSpan.class);

if (link.length != 0) {

if (action == MotionEvent.ACTION_DOWN) {

v.postDelayed(longClickCallback, ViewConfiguration.getLongPressTimeout());

} else {

v.removeCallbacks(longClickCallback);

link[0].onClick(widget);

}

return true;

}

} else if (action == MotionEvent.ACTION_CANCEL) {

v.removeCallbacks(longClickCallback);

}

return false;

}

private static class LongClickCallback implements Runnable {

private View view;

LongClickCallback(View view) {

this.view = view;

}

@Override

public void run() {

// 找到能够消费长按事件的View

View v = view;

boolean consumed = v.performLongClick();

while (!consumed) {

v = (View) v.getParent();

if (v == null) {

break;

}

consumed = v.performLongClick();

}

}

}

}

textView.setOnTouchListener(ClickMovementMethod.newInstance());

复制代码

如何禁止 ViewPager 的滑动

重写ViewPager onTouchEvent 和 onInterceptTouchEvent 并返回false,不处理任何滑动事件

@Override

public boolean onTouchEvent(MotionEvent arg0) {

return false;

}

@Override

public boolean onInterceptTouchEvent(MotionEvent arg0) {

return false;

}

复制代码

如何仿蘑菇街/马蜂窝 Viewpager 装载图片之后切换时动态变更高度

imageViewPager 为普通的 Viewpager 对象

imageListInfo为存放图片信息的list,imageShowHeight为业务需要显示高度,通过切换时动态计算调整

imageViewPager.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

@Override

public void onGlobalLayout() {

imageViewPager.getViewTreeObserver().removeOnGlobalLayoutListener(this);

//根据viewpager的高度,拉伸显示图片的宽度调整高度。

ViewGroup.LayoutParams layoutParams = imageViewPager.getLayoutParams();

layoutParams.height = imageListInfo.imageShowHeight[0];

imageViewPager.setLayoutParams(layoutParams);

}

});

imageViewPager.setAdapter(imagePagerAdapter);

imageViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

@Override

public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

if (position == imageListInfo.getImageListSize() - 1) {

return;

}

int height = (int) (imageListInfo.imageShowHeight[position] * (1 - positionOffset) + imageListInfo.imageShowHeight[position + 1] * positionOffset);

ViewGroup.LayoutParams params = imageViewPager.getLayoutParams();

params.height = height;

imageViewPager.setLayoutParams(params);

}

@Override

public void onPageSelected(int position) {

if (!clickListBySelf) {

toSelectIndex(imageListInfo.selected, position);

}

}

@Override

public void onPageScrollStateChanged(int state) {

}

});

复制代码

如何控制 appbarLayout 随时定位到某个位置

```

CoordinatorLayout.Behavior behavior =((CoordinatorLayout.LayoutParams)mAppBarLayout.getLayoutParams()).getBehavior();

if (behavior instanceof AppBarLayout.Behavior) {

AppBarLayout.Behavior appBarLayoutBehavior = (AppBarLayout.Behavior) behavior;

int topAndBottomOffset = appBarLayoutBehavior.getTopAndBottomOffset();

if (topAndBottomOffset != 0) {

appBarLayoutBehavior.setTopAndBottomOffset(0);

}

```

如何禁止 appbarLayout 滚动

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();

AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();

behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() {

@Override

public boolean canDrag(@NonNull AppBarLayout appBarLayout) {

return false;

}

});

复制代码

edittext 未能响应 onClickListener 事件的解决方案

Edittext监听未获取焦点的Edittext的点击事件,第一次点击触发OnFocusChangeListener,在获取焦点的情况下才能响应onClickListener

使用 listview 或gridview 的处理 item 的 state_selected 事件是无效的解决方案

在xml布局中对listview或gridview设置Android:choiceMode="singleChoice",并使用state_activated状态来代替state_selected状态。(2016.12.10)

解决5.0以上Button自带阴影效果的方案

在xml定义的Button中,添加以下样式定义

style="?android:attr/borderlessButtonStyle"

复制代码

针对 onSingleTapUp 和 onSIngleTapConfirmed 的使用区别

前者在按下并抬起时发生,后者有一个附加条件时Android会确保点击之后在短时间内没有再次点击才会触发。常用于如果需要监听单击和双击事件。

如何使用layer-list画三角形

//左

android:fromDegrees="45"

android:pivotX="85%"

android:pivotY="135%">

android:width="16dp"

android:height="16dp" />

//右

android:fromDegrees="45"

android:pivotX="15%"

android:pivotY="-35%">

android:width="16dp"

android:height="16dp" />

//上/正

android:fromDegrees="45"

android:pivotX="-40%"

android:pivotY="80%">

android:width="16dp"

android:height="16dp"/>

//下

android:fromDegrees="45"

android:pivotX="135%"

android:pivotY="15%">

android:width="16dp"

android:height="16dp"/>

复制代码

java tag和flt区别,这些年,我爬过的 Android 坑 | 持续更新相关推荐

  1. Java实现动态加载页面_[Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新)...

    [Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新) 0 2014-05-07 18:00:06 使用该控件,可以根据url,参数,加载html记录模板(包含 ...

  2. ②【Java 组】蓝桥杯省赛真题解析 [振兴中华] [三部排序] 持续更新中...

    个人简介:Java领域新星创作者:阿里云技术博主.星级博主.专家博主:正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 蓝桥杯真题--持续更新中... ...

  3. bootstrap java web_Java web MVC(jsp,servlet,dao)+Bootstrap购物网站开发经验总结 (持续更新)...

    一开始对java web 不是很熟悉,重新温习了java web ,对El expression ,jstl的使用有了更加深的印象,mvc模式下的分层结构有了进一步的了解. MVC中的M就是model ...

  4. 这个帖子记录一下java代码转换成易语言代码的坑[持续更新]

    这个帖子记录一下我经历过的java代码转换成易语言代码踩过的坑. 0X1 一些常用的java转换易语言的操作 str.charAt(参数) 可用易语言的取代码(str,参数+1)代替,因为java从0 ...

  5. 第1章 Java基本概念及环境配置——FAQ1.05 Java SE. Java EE和Java ME有什么区别?

    FAQ1.05 Java SE. Java EE和Java ME有什么区别? 答: 1.什么是Java SE? J2SE,便准版的Java平台是一个Java2的平台,为用户提供一个程序开发环境.这个开 ...

  6. java 与 |与||的区别

    java &与&& |与||的区别 一.与操作和或操作的区别 (1)在Java程序中,使用与操作,要求所有表达式的判断结果都是TRUE,才为真,若有一个为FALSE,那么最终判 ...

  7. java和C++的区别

     JAVA和C++的区别介绍框架纲领如下: (一) 序言: (二) 我学习二者的个人感受: (三) 个人建议: (四) 用JAVA中继承的特性来描述C++和JAVA的关系图示: (五) JAVA和 ...

  8. float 与 double、隐式类型转换、switch、重写与重载、Java 与 C++ 的区别、JRE or JDK

    1.float 与 double 1.1 字面量属于 double 类型,不能直接将 1.1 直接赋值给 float 变量,因为这是向下转型. // float f = 1.1; Java 不能隐式执 ...

  9. Java和OC的区别

    Java和OC的区别 转载于:https://www.cnblogs.com/imChay/p/5591357.html

最新文章

  1. seq2seq模型_直观理解并使用Tensorflow实现Seq2Seq模型的注意机制
  2. python装饰器-理解Python装饰器(Decorator)
  3. 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )
  4. Java的call by value_call by value or reference ?
  5. C# 编码约定(C# 编程指南)
  6. 关于SOCKET中send和recv函数工作原理总结
  7. python的变量名必须以什么开头_python以下划线开头的变量名含义
  8. Docker中未指定挂载点容器间volume卷的数据共享
  9. matlab创建数组对象,MATLAB一维数组(向量)的定义
  10. linux里面i386 i686 i486 i586代表什么?是什么意思
  11. matlab 建立ctruct,扩频通信系统及MATLAB仿真1
  12. 云网一体,“湘遇湘融 | 移动云TeaTalk·长沙站 启动倒计时
  13. 关于解决keil4和mdk共存后51不能使用go to definition Of 'XXXXXX'问题
  14. LaTeX组件:texlive2019+texstudio+sumatraPDF 安装包及学习手册
  15. 搭建属于自己的复古传奇私服
  16. 利用Matlab绘制梯度图、散度图、旋度图
  17. Java POI 删除最后一页空白页
  18. Mybatis事务隔离级别
  19. 二元函数可导与可微的关系_如何理解多元函数可微与可偏导的关系?
  20. 中国天气预报数据API收集

热门文章

  1. centos虚拟机ping不通 报错 name or service not known
  2. C++原子操作 atomic的使用及效率
  3. 使用logstash将Mysql中的数据导入到ElasticSearch中(详细步骤,win_Elasticsearch)
  4. Hadoop 06_MapReduce2.0(YARN)
  5. java基础---流程控制
  6. JAVA程序设计----多线程(下)
  7. leetcode 454. 4Sum II | 454. 四数相加 II(Java)
  8. SQL 中 left join、right join、inner join 的区别
  9. leetcode 125. 验证回文串
  10. netty系列之:netty中的懒人编码解码器