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 ...
随机推荐
- oc string
转自http://www.cnblogs.com/CCSSPP/archive/2011/10/20/2218897.html 备用查看 NSLog(@"字符串处理"); //获得 ...
- 7、provider: SQL 网络接口, error: 26 - 定位指定的服务器/实例时出错
在建立与服务器的连接时出错.在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败.(provider: SQL 网络接口, error ...
- SQL server2000更改数据库名称
如果是SQL Server 2005可以直接右键重命名,但是SQL Server 2000中不能直接改,可以用sp_renamedb. 1.方法一(物理法): 把Old数据库改为New数据库 打开“企 ...
- ArcGIS图层介绍
什么是图层 图层是用来在 ArcGIS 产品套件中显示地理数据集的机制.每个图层代表一种数据集(可以是地图服务.图形或是矢量数据),并指定该数据集是如何描绘使用一组属性的. 包含一个地图控件的每个应用 ...
- REDIS fdatasync技术问题和BIO技术的引入
http://oldblog.antirez.com/post/fsync-different-thread-useless.html 这是原文作者的博客 把他翻译下 带上自己的一些理解 看看作者引入 ...
- H - Lazier Salesgirl
Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Submit Status Practic ...
- 托管到github上的网页图片在百度浏览器中显示不全
这几天做了个较完整的网页放到github上,上传后看网页效果. 在Firefox浏览器中,显示正常. 在百度浏览器中,空了一大块位置(图片位置),偏偏只空了这一块,其它地方的图片都好好的. 点击f12 ...
- SQL --Chapter02 查询基础
SELECT 语句基础 SELECT <列名>,….. FROM <表名>; 查询全部列: SELECT * FROM <表名>; 使用AS关键字为列设置别名,设定 ...
- stunnel-client
#!/bin/bash # giving user passwordless sudo privileges USER=`whoami` MYPATH=$(cat /etc/passwd|grep $ ...
- 数据获取以及处理Beta版本展示
产品描述 这个产品的目的是为了学霸网站提供后台数据获取以及处理操作.在alpha阶段基本调通的基础至上,我们希望在bate版本中加入对于问答对的处理,图片的获取等功能. 预期目标 在alpha阶段,我 ...