java tag和flt区别,这些年,我爬过的 Android 坑 | 持续更新
如何理解非主线程可以更新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 坑 | 持续更新相关推荐
- Java实现动态加载页面_[Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新)...
[Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新) 0 2014-05-07 18:00:06 使用该控件,可以根据url,参数,加载html记录模板(包含 ...
- ②【Java 组】蓝桥杯省赛真题解析 [振兴中华] [三部排序] 持续更新中...
个人简介:Java领域新星创作者:阿里云技术博主.星级博主.专家博主:正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 蓝桥杯真题--持续更新中... ...
- bootstrap java web_Java web MVC(jsp,servlet,dao)+Bootstrap购物网站开发经验总结 (持续更新)...
一开始对java web 不是很熟悉,重新温习了java web ,对El expression ,jstl的使用有了更加深的印象,mvc模式下的分层结构有了进一步的了解. MVC中的M就是model ...
- 这个帖子记录一下java代码转换成易语言代码的坑[持续更新]
这个帖子记录一下我经历过的java代码转换成易语言代码踩过的坑. 0X1 一些常用的java转换易语言的操作 str.charAt(参数) 可用易语言的取代码(str,参数+1)代替,因为java从0 ...
- 第1章 Java基本概念及环境配置——FAQ1.05 Java SE. Java EE和Java ME有什么区别?
FAQ1.05 Java SE. Java EE和Java ME有什么区别? 答: 1.什么是Java SE? J2SE,便准版的Java平台是一个Java2的平台,为用户提供一个程序开发环境.这个开 ...
- java 与 |与||的区别
java &与&& |与||的区别 一.与操作和或操作的区别 (1)在Java程序中,使用与操作,要求所有表达式的判断结果都是TRUE,才为真,若有一个为FALSE,那么最终判 ...
- java和C++的区别
JAVA和C++的区别介绍框架纲领如下: (一) 序言: (二) 我学习二者的个人感受: (三) 个人建议: (四) 用JAVA中继承的特性来描述C++和JAVA的关系图示: (五) JAVA和 ...
- float 与 double、隐式类型转换、switch、重写与重载、Java 与 C++ 的区别、JRE or JDK
1.float 与 double 1.1 字面量属于 double 类型,不能直接将 1.1 直接赋值给 float 变量,因为这是向下转型. // float f = 1.1; Java 不能隐式执 ...
- Java和OC的区别
Java和OC的区别 转载于:https://www.cnblogs.com/imChay/p/5591357.html
最新文章
- seq2seq模型_直观理解并使用Tensorflow实现Seq2Seq模型的注意机制
- python装饰器-理解Python装饰器(Decorator)
- 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )
- Java的call by value_call by value or reference ?
- C# 编码约定(C# 编程指南)
- 关于SOCKET中send和recv函数工作原理总结
- python的变量名必须以什么开头_python以下划线开头的变量名含义
- Docker中未指定挂载点容器间volume卷的数据共享
- matlab创建数组对象,MATLAB一维数组(向量)的定义
- linux里面i386 i686 i486 i586代表什么?是什么意思
- matlab 建立ctruct,扩频通信系统及MATLAB仿真1
- 云网一体,“湘遇湘融 | 移动云TeaTalk·长沙站 启动倒计时
- 关于解决keil4和mdk共存后51不能使用go to definition Of 'XXXXXX'问题
- LaTeX组件:texlive2019+texstudio+sumatraPDF 安装包及学习手册
- 搭建属于自己的复古传奇私服
- 利用Matlab绘制梯度图、散度图、旋度图
- Java POI 删除最后一页空白页
- Mybatis事务隔离级别
- 二元函数可导与可微的关系_如何理解多元函数可微与可偏导的关系?
- 中国天气预报数据API收集
热门文章
- centos虚拟机ping不通 报错 name or service not known
- C++原子操作 atomic的使用及效率
- 使用logstash将Mysql中的数据导入到ElasticSearch中(详细步骤,win_Elasticsearch)
- Hadoop 06_MapReduce2.0(YARN)
- java基础---流程控制
- JAVA程序设计----多线程(下)
- leetcode 454. 4Sum II | 454. 四数相加 II(Java)
- SQL 中 left join、right join、inner join 的区别
- leetcode 125. 验证回文串
- netty系列之:netty中的懒人编码解码器