对于这个属性的使用也是在偶然的时候发现的,之前从未使用它,所以有必要阐述一下它的用法,什么场景会要用它这个属性,在我不知道之前这个属性之前,也同样能实现效果,但是当我知道它的存在之后,我肯定在某种场景下就会想到它,下面就来具体阐述它:

先看一下软件截图,代表了很多应用的框架:

而对于上图中圈了红框的,就是我们所要关注的,底部bar,如今很多app都是这种模块切负模式,如下:

而接下来,我们先实现这样的一个效果,实现思路很简单,为了简明阐述,只以两个TAB的切换来实例,工程结构如下:

具体代码:

MainActivity.java:

public class MainActivity extends Activity implements OnClickListener {

    // views
private LinearLayout v_home;
private ImageView img_home;
private TextView tv_home;
private LinearLayout v_rank;
private ImageView img_rank;
private TextView tv_rank; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
initListeners();
} private void initViews() {
v_home = (LinearLayout) findViewById(R.id.homePageview);
img_home = (ImageView) findViewById(R.id.img_home);
tv_home = (TextView) findViewById(R.id.tv_home);
v_rank = (LinearLayout) findViewById(R.id.rankButtonview);
img_rank = (ImageView) findViewById(R.id.img_rank);
tv_rank = (TextView) findViewById(R.id.tv_rank);
} private void initListeners() {
v_home.setOnClickListener(this);
v_rank.setOnClickListener(this);
} @Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.homePageview:// 推荐TAB点击
img_home.setSelected(true);
tv_home.setSelected(true);
img_rank.setSelected(false);
tv_rank.setSelected(false);
break;
case R.id.rankButtonview:// 排行TAB点击
img_home.setSelected(false);
tv_home.setSelected(false);
img_rank.setSelected(true);
tv_rank.setSelected(true);
break;
}
} }

与之对应的资源文件,activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/bottom_menu"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:background="#363636" > <LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="horizontal" > <!-- 推荐TAB --> <LinearLayout
android:id="@+id/homePageview"
style="@style/BottomTabStyle" > <ImageView
android:id="@+id/img_home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/tab_icon_home_bg" /> <TextView
android:id="@+id/tv_home"
style="@style/TabItemTextStyle"
android:text="推荐" />
</LinearLayout>
<!-- 排行TAB --> <LinearLayout
android:id="@+id/rankButtonview"
style="@style/BottomTabStyle" > <ImageView
android:id="@+id/img_rank"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/tab_icon_rank_bg" /> <TextView
android:id="@+id/tv_rank"
style="@style/TabItemTextStyle"
android:text="排行" />
</LinearLayout>
</LinearLayout> </RelativeLayout>

而资源文件中用到的样式文件如下:style.xml:

<resources>

    <style name="TabItemTextStyle">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">@color/main_blue_text_selector</item>
<item name="android:layout_marginTop">2dp</item>
<item name="android:textSize">13sp</item>
</style> <style name="BottomTabStyle">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">fill_parent</item>
<item name="android:layout_weight">1</item>
<item name="android:gravity">center</item>
<item name="android:orientation">vertical</item>
<item name="android:paddingTop">5dp</item>
</style> </resources>

其中每个TAB的图片和文字,都有select,如"推荐"TAB:

icon:

文字:

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:color="#12e9e0"/>
<item android:state_selected="true" android:color="#12e9e0"/>
<item android:color="#ffffffff"/> </selector>

这时看看效果:

对于这样的效果实现,其实还有一种代码更加简便的方式,当然也就是这里要研究的android:duplicateParentState属性,这也是它的使用场景,下面就用该属性来修改代码,代码会更加精简:

activity_main.xml,加入android:duplicateParentState属性:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/bottom_menu"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:background="#363636" > <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="horizontal" > <!-- 推荐TAB --> <LinearLayout
android:id="@+id/homePageview"
style="@style/BottomTabStyle" > <ImageView
android:id="@+id/img_home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/tab_icon_home_bg"
android:duplicateParentState="true"
/> <TextView
android:id="@+id/tv_home"
style="@style/TabItemTextStyle"
android:duplicateParentState="true"

android:text="推荐" />
</LinearLayout>
<!-- 排行TAB --> <LinearLayout
android:id="@+id/rankButtonview"
style="@style/BottomTabStyle" > <ImageView
android:id="@+id/img_rank"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/tab_icon_rank_bg"
android:duplicateParentState="true"
/> <TextView
android:id="@+id/tv_rank"
style="@style/TabItemTextStyle"
android:duplicateParentState="true"

android:text="排行" />
</LinearLayout>
</LinearLayout> </RelativeLayout>

MainActivity.java:

public class MainActivity extends Activity implements OnClickListener {

    // views
private LinearLayout v_home;
private LinearLayout v_rank; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
initListeners();
} private void initViews() {
v_home = (LinearLayout) findViewById(R.id.homePageview);
v_rank = (LinearLayout) findViewById(R.id.rankButtonview);
} private void initListeners() {
v_home.setOnClickListener(this);
v_rank.setOnClickListener(this);
} @Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.homePageview:// 推荐TAB点击
v_home.setSelected(true);//
v_rank.setSelected(false);
break;
case R.id.rankButtonview:// 排行TAB点击
v_home.setSelected(false);
v_rank.setSelected(true);
break;
}
} }
package com.example.layouttest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout; public class MainActivity extends Activity implements OnClickListener { // views
private LinearLayout v_home;
private LinearLayout v_rank; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
initListeners();
} private void initViews() {
v_home = (LinearLayout) findViewById(R.id.homePageview);
v_rank = (LinearLayout) findViewById(R.id.rankButtonview);
} private void initListeners() {
v_home.setOnClickListener(this);
v_rank.setOnClickListener(this);
} @Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.homePageview:// 推荐TAB点击
v_home.setSelected(true);//这里只要对其父进行控制既可,而不用单独再去获得子控件,代码更加精简
v_rank.setSelected(false);
break;
case R.id.rankButtonview:// 排行TAB点击
v_home.setSelected(false);
v_rank.setSelected(true);
break;
}
} }

这时运行的结果跟第一次的一模一样,所以,对于android:duplicateParentState属性的使用,总结如下:

测试源码地址如下: http://files.cnblogs.com/webor2006/LayoutTest.rar

android:duplicateParentState属性使用场景的更多相关文章

  1. android:duplicateParentState属性解释

    android:duplicateParentState指的是当前控件是否跟随父控件的(点击.焦点等)状态 例:假设一Layout有两子View,对Layout进行监听点击事件:子ViewA一个设置d ...

  2. Android 组件属性

    属性名称 描述 android:background 设置背景色/背景图片.可以通过以下两种方法设置背景为透明:”@android:color/transparent”和”@null”.注意TextV ...

  3. view组件的duplicateParentState属性

    今天做页面的时候遇到一个小问题,在点击的时候改变组件的图片来源,这个很简单大家都知道,用selector可以很快实现.但是现状有点特殊,是 LinearLayout 中包裹着一个 ImageView ...

  4. Android layout属性大全

    第一类:属性值 true或者 false  android:layout_centerHrizontal 水平居中      android:layout_centerVertical 垂直居中   ...

  5. android scrollview 属性

     理论部分1.ScrollView和HorizontalScrollView是为控件或者布局添加滚动条2.上述两个控件只能有一个孩子,但是它并不是传统意义上的容器3.上述两个控件可以互相嵌套4.滚动条 ...

  6. Permission Denial: opening provider 隐藏的android:exported属性的含义

    Permission Denial: opening provider 隐藏的android:exported属性的含义 2013-03-07 13:17 227人阅读 评论(0) 收藏 举报 场景: ...

  7. android android:duplicateParentState=&quot;true&quot; &quot;false&quot;

    今天要做一个效果.组件RelativeLayout上有两个TextView.这两个TextView具有不同的颜色值,如今要的效果是,当RelativeLayout被点击时,整个item有高亮背景. 同 ...

  8. android:exported 属性详解

    属性详解 标签: android 2015-06-11 17:47 27940人阅读 评论(7) 收藏 举报 分类: Android(95) 项目点滴(25) 昨天在用360扫描应用漏洞时,扫描结果, ...

  9. Android weight属性详解

    android:layout_weight是一个经常会用到的属性,它只在LinearLayout中生效,下面我们就来看一下: 当我们把组件宽度设置都为”match_parent”时: <Butt ...

随机推荐

  1. Java基础教程:Java内存区域

    Java基础教程:Java内存区域 运行时数据区域 Java虚拟机在执行Java程序的过程种会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟 ...

  2. C# .NET UDP 形式调用 graylog,gelf

    -- 发送: GelfLogModel m = new GelfLogModel(); m.version = "1.1"; m.host = "128.0.14.39& ...

  3. VUE 多页面打包webpack配置

      思路:多配置一个main的文件,用于webpack入口使用, 然后路由的导向也应该默认指向新组件,最后通过webpack构建出一个新的独立的html文件. 缺点:生成多个html会new出多个vu ...

  4. Word中如何加载EndNote

    在百度中搜索了很多解决方案,都不尽相同忙了一上午也没解决,然后搁浅,吃过午饭回来在安装目录下找到如下exe文件三四步点击搞定 所以,有时候问题出现了长时间没解决,可以换下环境出去溜达一圈说不定就茅塞顿 ...

  5. Andrew Ng机器学习课程9-补充

    Andrew Ng机器学习课程9-补充 首先要说的还是这个bias-variance trade off,一个hypothesis的generalization error是指的它在样本上的期望误差, ...

  6. PHP,Excel导出换行

    // 有id,才算真的有发票数据 if ($v['b_invoice_id']) { $v['b_invoice_info'] = json_decode($v['b_invoice_json'],t ...

  7. 03 CSS听课笔记

    CSS:页面美化和布局控制 1. 概念: Cascading Style Sheets 层叠样式表层叠:多个样式可以作用在同一个html的元素上,同时生效 2. 好处:(1)功能强大(2)将内容展示和 ...

  8. ABP中的AutoMapper

    在我们的业务中经常需要使用到类型之间的映射,特别是在和前端页面进行交互的时候,我们需要定义各种类型的Dto,并且需要需要这些Dto和数据库中的实体进行映射,对于有些大对象而言,需要赋值太多的属性,这样 ...

  9. 长乐培训Day2

    T1 足球联赛 题目 [题目描述] 巴蜀中学新一季的足球联赛开幕了.足球联赛有n只球队参赛,每赛季,每只球队要与其他球队各赛两场,主客各一场,赢一场得3分,输一场不得分,平局两只队伍各得一分. 英勇无 ...

  10. littleFS在RT1052移植笔记

    环境:rt1052单片机+16G tf卡 为什么使用littleFS? NXP官方SDK支持! 先进的损耗平衡功能(wear leveling)可提供最长的快闪及内存寿命及最大的使用量.因为FALSH ...