View 的 focus 和 selected 状态, TabContainer实现
View的 isFocusableInTouchMode() 默认是 false, 需调用 setFocusableInTouchMode(true) 才为true
要让 button 等 view 调用 requestFocus 方法起作用, 需要 isFocusableInTouchMode() 为true才行。
setFocusable(false) 会到导致 isFocusable() 和 isFocusableInTouchMode() 都为false,
要设为true只能分别调用 setFocusable(true) 和 setFocusableInTouchMode(true)
只能有一个View得到焦点,其他的View将失去焦点.
Selected
可以有多个View同时处于 Selected状态。
View 的 setSelected方法,会调用 dispatchSetSelected 向子View传递 select状态。
public void setSelected(boolean selected) {
if (((mPrivateFlags & SELECTED) != 0) != selected) {
mPrivateFlags = (mPrivateFlags & ~SELECTED) | (selected ? SELECTED : 0);
if (!selected) resetPressedState();
invalidate();
refreshDrawableState();
dispatchSetSelected(selected);
}
}
ViewGroup 的 dispatchSetSelected 方法。
public void dispatchSetSelected(boolean selected) {
final View[] children = mChildren;
final int count = mChildrenCount;
for (int i = 0; i < count; i++) {
children[i].setSelected(selected);
}
}
Selector
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/black" android:state_selected="true"/>
<item android:drawable="@drawable/white"/>
</selector>
ViewGroup 有多个重载的 addView方法
在xml布局文件里面添加的子View,是通过下面这个重载方法加到ViewGroup中的。
public void addView(View child, ViewGroup.LayoutParams params);
利用上述机制,可以简单的实现一个类似 TabWidget 的 tab 切换容器,支持用 selector 改变 tabView 和 tabView 子 View 的背景.
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout; public class TabContainer extends LinearLayout {
private int mCurrentTab = -1; public TabContainer(Context context, AttributeSet attrs) {
super(context, attrs);
} public void setCurrentTab(int index) {
if (getChildCount() == 0) {
return;
} if (index >= 0 && index <= getChildCount() - 1) {
getChildAt(index).performClick();
}
} @Override
public void addView(View child, int index, android.view.ViewGroup.LayoutParams params) {
super.addView(child, index, params); child.setOnClickListener(mOnClickListener);
child.setSelected(false);
} private View.OnClickListener mOnClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
int index = indexOfChild(v);
if (index != mCurrentTab) {
if (mCurrentTab >= 0) {
getChildAt(mCurrentTab).setSelected(false);
}
getChildAt(index).setSelected(true);
mCurrentTab = index; if (mOnTabSelectChangeListener != null) {
mOnTabSelectChangeListener.onTabSelectChanged(index, v);
}
}
}
}; private OnTabSelectChangeListener mOnTabSelectChangeListener; public void setOnTabSelectChangeListener(OnTabSelectChangeListener listener) {
mOnTabSelectChangeListener = listener;
} public interface OnTabSelectChangeListener {
public void onTabSelectChanged(int index, View tab);
}
}
View 的 focus 和 selected 状态, TabContainer实现的更多相关文章
- Android监听view的attached或detached状态
我们在开发中,希望监听View的attached或detached状态,来进行比如eventbus的注册与解注册的操作,非常的方便实用. 可以使用系统给我们提供的listener,代码使用如下: mV ...
- iOS之UIButton的normal和selected状态切换
1.问题? 改变播放器按钮状态,发现从selected切回到normal状态时候,中间会切换normal-selected-normal的图片? 2.原因…… normal-->selected ...
- jquery去掉或者替换字符,设置指定options为selected状态
<html> <body> <div><select id="queryYear"> <opt ...
- VMware View 要求操作句柄的状态错误
win10系统安装的VMware-viewclient,版本是
- View Focus的处理过程及ViewGroup的mFocused字段分析
通过上篇的介绍,我们知道在对KeyEvent的处理中有非常重要的一环,那就是KeyEvent在focus view的path上自上而下的分发, 换句话说只有focus的view才有资格参与KeyEve ...
- android中正确保存view的状态
英文原文: http://trickyandroid.com/saving-android-view-state-correctly/ 转载此译文须注明出处. 今天我们聊一聊安卓中保存和恢复view状 ...
- Android view状态保存
为什么我们需要保存View的状态? 这个问题问的好!我坚信移动应用应该帮助你解决问题,而不是制造问题. 想象一下一个非常复杂的设置页面: 这并不是从一个移动应用的截图(这不是典型的win32程序吗.. ...
- View的onSaveInstanceState和onRestoreInstanceState过程分析
为什么要介绍这2个方法呢?这是因为在我们的开发中最近遇到了一个很诡异的bug.大体是这样的:在我们的ViewPager中 有2页的root view都是ScrollView,我们在xml里面都用了an ...
- Qt Model/View(官方翻译,图文并茂)
http://doc.trolltech.com/main-snapshot/model-view-programming.html 介绍 Qt 4推出了一组新的item view类,它们使用mode ...
随机推荐
- c++11新的小猫腻
1.void*指针的使用,平时见得也很多了,至于为什么使用void* 指针,很多人有自己的见解,反正普通指针轻轻松松的转向void * 指针,但是void*指针转向其他的指针都要采用强制转换的. 2. ...
- vimperator setting records
vimperator confugration files :highlight Hint color:#000;background:rgb(250,230,150);border-radius:4 ...
- 一款基于bootstrap的datetimepicker
<!DOCTYPE HTML> <html> <head> <link href="http://netdna.bootstrapcdn.com/t ...
- 调用接口传递的XML 及排查原因
2fq3ej15nv8fgns30firbqtlo3 <Interface type="edit" model="object" value=" ...
- 关于string,我今天科普的
今天下午朋友讨论组上讨论一个关于string的问题,问题是这样的,string a="aaa";string b=a;a="bbb",为什么测试b的值不改变?之 ...
- Huffman编码(测试源代码)
1.此程序为c++程序 2.以下代码可实现手动输入,即去掉代码中的/*...*/注释符,并同时去掉赋值代码段 3.源代码 #include<iostream> using namespac ...
- What Is Mathematics?
What Is Mathematics? The National Council of Teachers of Mathematics (NCTM), the world's largest org ...
- PLS-00306错误
ORA-06550: line 1, column 7:PLS-00306: wrong number or types of arguments in call to 'P'ORA-06550: l ...
- Makefile 学习&binutils工具集,软件开发利器
gcc -E 能有效的帮助我们解决与宏有关的编译错误: gcc -S能获得一个C源程序文件的汇编程序: gcc -v能获得系统头文件的路径 生成依赖关系: gcc -M gcc -MM 生成不包含系统 ...
- Servlet3.0 jsp跳转到Servlet 出现404错误的路径设置方法
最近又遇到了这种问题,百度了好久,发现有人说要在action的路径里面写Servlet文件的绝对路径,比如说,单独打开servlet的地址为http://localhost:8080/TomcatTe ...