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实现的更多相关文章

  1. Android监听view的attached或detached状态

    我们在开发中,希望监听View的attached或detached状态,来进行比如eventbus的注册与解注册的操作,非常的方便实用. 可以使用系统给我们提供的listener,代码使用如下: mV ...

  2. iOS之UIButton的normal和selected状态切换

    1.问题? 改变播放器按钮状态,发现从selected切回到normal状态时候,中间会切换normal-selected-normal的图片? 2.原因…… normal-->selected ...

  3. jquery去掉或者替换字符,设置指定options为selected状态

    <html> <body> <div><select id="queryYear">                 <opt ...

  4. VMware View 要求操作句柄的状态错误

    win10系统安装的VMware-viewclient,版本是

  5. View Focus的处理过程及ViewGroup的mFocused字段分析

    通过上篇的介绍,我们知道在对KeyEvent的处理中有非常重要的一环,那就是KeyEvent在focus view的path上自上而下的分发, 换句话说只有focus的view才有资格参与KeyEve ...

  6. android中正确保存view的状态

    英文原文: http://trickyandroid.com/saving-android-view-state-correctly/ 转载此译文须注明出处. 今天我们聊一聊安卓中保存和恢复view状 ...

  7. Android view状态保存

    为什么我们需要保存View的状态? 这个问题问的好!我坚信移动应用应该帮助你解决问题,而不是制造问题. 想象一下一个非常复杂的设置页面: 这并不是从一个移动应用的截图(这不是典型的win32程序吗.. ...

  8. View的onSaveInstanceState和onRestoreInstanceState过程分析

    为什么要介绍这2个方法呢?这是因为在我们的开发中最近遇到了一个很诡异的bug.大体是这样的:在我们的ViewPager中 有2页的root view都是ScrollView,我们在xml里面都用了an ...

  9. Qt Model/View(官方翻译,图文并茂)

    http://doc.trolltech.com/main-snapshot/model-view-programming.html 介绍 Qt 4推出了一组新的item view类,它们使用mode ...

随机推荐

  1. difference between forward and sendredirect

    Difference between SendRedirect and forward is one of classical interview questions asked during jav ...

  2. Python基于websocket实时通信的实现—GoEasy

    Python websocket实时消息推送 在这里我记录一下之前如何实现服务器端与客户端实时通信: 实现步骤如下: 1.        获取GoEasy appkey. 在goeasy官网上注册一个 ...

  3. your local repository contains non-ascii

    安装CCS时候遇到  your local repository contains non-ascii 问题. 解决方法:  不要在中文目录下安装.

  4. capwap协议重点分析

    一.     CAPWAP概述 CAPWAP由两个部分组成:CAPWAP协议和无线BINDING协议. (1)CAPWAP协议是一个通用的隧道协议,完成AP发现AC等基本协议功能,和具体的无线接入技术 ...

  5. JavaScript中本地对象、内置对象和宿主对象

    链接:http://www.cnblogs.com/luckyXcc/p/5892896.html(Milk.╮的博客园提供) 其中内置对象只有两种:ECMA-262 只定义了两个内置对象,即 Glo ...

  6. android修改debug keystore文件使之和正式keystore sha1一致

    转自:http://blog.k-res.net/archives/1671.html Android应用开发接入各种SDK时会发现,有很多SDK是需要靠package name和keystore的指 ...

  7. 记账类APP竞品分析-挖财与随手记

    注:本文更新中. 一.概览 1.  产品名称及版本 l  挖财11.2.0.0 免费版(2016/9/6发布) l  随手记10.2.8免费版(2016/8/22发布) 2.  设备信息 设备型号:i ...

  8. setTimeout的应用

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. ORACLE执行详解

    本文源自TTT BLOG,原文地址:http://blog.chinaunix.net/u3/107265/showart_2192657.html 简介:     本文全面详细介绍oracle执行计 ...

  10. 给UIWebView调整UserAgent字段

    +(void)setWebViewUserAgent:(NSString *)suffix { UIWebView *webView = [[UIWebView alloc] initWithFram ...