Android 主题样式中的自定义属性值的获取方式

获取自定义属性通常是在自定义View内部获取,但在某种方式下,无论自定义View的属性还是主题中样式的属性,均可在外部style中获取。

由于非自定义View的外部获取方式比较复杂,这里暂时略过,后续补充。

自定义attr

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <attr name="theme_name" format="string|reference"/>
</resources>

设置attr

<resources>
    <!-- Activity themes -->
    <style name="Theme.Base" parent="android:Theme.Holo.Light" >
    <item name="theme_name" >@string/theme_name_1</item>    
    </style>

</resources>

获取

TypedValue outValue = new TypedValue();
getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground,outValue, true);
textView.setBackgroundResource(outValue.resourceId);

注意,如果我直接设置数据,则resourceId为0

<resources>
    <!-- Activity themes -->
    <style name="Theme.Base" parent="android:Theme.Holo.Light" >
    <item name="theme_name" >我的主题</item>    
    </style>

</resources>

这时候我们的数据可以使用TypeValue.string读取

TypedValue outValue = new TypedValue();
getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground,outValue, true);
if(outValue.data==TypeValue.TYPE_STRING)
{
textView.setBackgroundResource(outValue.string);
}

当然,有时候我们的属性可能是个集合,这时候不能用TypedValue获取,TypeValued只能判断类型,因此我们选择如下方式

public int getTabContainerHeight()
    {
        TypedArray a = mContext.obtainStyledAttributes(null, android.support.v7.appcompat.R.styleable.ActionBar, android.support.v7.appcompat.R.attr.actionBarStyle, 0);
        int height = a.getLayoutDimension(android.support.v7.appcompat.R.styleable.ActionBar_height, 0);
        Resources r = mContext.getResources();
        if(!hasEmbeddedTabs())
            height = Math.min(height, r.getDimensionPixelSize(android.support.v7.appcompat.R.dimen.abc_action_bar_stacked_max_height));
        a.recycle();
        return height;
    }

对于View内部获取方式如下

  private static Context themifyContext(Context context, AttributeSet attrs, int defStyleAttr)
    {
        TypedArray a = context.obtainStyledAttributes(attrs, android.support.v7.appcompat.R.styleable.Toolbar, android.support.v7.appcompat.R.attr.ActionBarStyle, 0);
        int themeId = a.getResourceId(android.support.v7.appcompat.R.styleable.Toolbar_theme, 0);
        if(themeId != 0)
            context = new ContextThemeWrapper(context, themeId);
        a.recycle();
        return context;
    }
时间: 2024-11-02 00:22:03

Android 主题样式中的自定义属性值的获取方式的相关文章

如何在android style文件中使用自定义属性

前几天我在项目中遇到了这样一个问题:我为项目编写了一个自定义控件,这个控件会被大量复用,所以我准备在style.xml文件中定义一个style来减少重复xml布局内容的编写,但是里面有一个自定义的控件属性,问题出现在这里,虽然自定义属性在layout布局xml中可以使用正常,但是却无法在style中定义,本来这个控件是大量服用的,style也是为了复用减少xml内容写的,我可以把自定义属性内容直接写死在自定义控件中,但是考虑到项目未来可能出现的变数,我还是准备将这个自定义属性写到style中,这

js中元素属性值的获取

一.样式表的三种方式 1.内嵌样式(inline style):是写在tag标签当中的,用style=“”来表示,只对当前标签生效: 2.内部样式(inner style sheet):是写在HTML中的,一般写在head标签中,对所在的网页有效 3.外部样式表(Extend style sheet):写在单独文件,需要用link标签单独引入,可对多个网页生效 二.获取style样式属性 1.在js中,通过document.getElementById("id").style.xxx就

python 数组中如何根据值,获取索引,如何根据索引删除值 , 以及如何根据值删除值

假设有一数组 s = [1,2,3,4,5,6,7,8,9] (1)如何根据值获取索引 ,如果值为5 , 那对应的索引为? (2)如何根据索引删除值 , 删除数组中索引5对应的值: (3)根据数组中的值来删除,那就更简单了 game over! 原文地址:https://www.cnblogs.com/rrttp/p/8491039.html

MFC中Edit Control值的获取与赋值

void CEditControlDlg::OnClickedButton() { // TODO: Add your control notification handler code here //获得EDIT CEdit* pBoxOne; pBoxOne = (CEdit*) GetDlgItem(IDC_EDIT); //赋值 //pBoxOne-> SetWindowText( _T("FOO ") ); //取值 CString str; pBoxOne->

如何在类中根据枚举值,获取枚举的message的工具类

枚举类为: public enum OrderStatusEnum implements CondeEnum{ NEW(0, "新订单"), FINISHED(1, "完结"), CANCLE(2, "取消"); private Integer code; private String msg; OrderStatusEnum(Integer code, String msg) { this.code = code; this.msg = msg

jq更改input框中value的值的正确方式

一直以为,更改input框value值的方式是: $('input').val('xxxx') 这样,页面的html显示的value还是原来的!!! 正确的方法,应该使用下面这种: $('input').attr('value','xxx') 只有这样,页面上input的value才会显示新的值!! 原文地址:https://www.cnblogs.com/luguankun/p/12446050.html

Android主题切换(Theme)实现日夜间功能

前言 随着一款APP应用功能的不断完善,用户群体的不断增多,APP的更新也就不仅仅局限于功能需求,如何做好良好的用户体验,让用户传播良好的体验口碑,显得尤为重要,而用户体验一块日夜间模式俨然成为了标配.其实,日夜间功能就是换肤的一种,关于换肤功能的实现,也是众说纷纭,总的来讲分为两类:主题换肤(Theme)和插件换肤(APK换肤). 插件换肤 插件换肤的实现原理就是主APK根据当前环境需求,解析指定目录下对应的插件APK,获得其中同名的资源文件并动态替换到主APK的应用程序中.插件APK并不需要

Android入门——样式主题和自定义属性资源

引言 样式和主题(Styles and Themes)都是用于对Android app 界面进行美化的,与Web开发中的CSS的作用大同小异,只有充分利用样式和主题才能开发出各种风格优秀的app . 一.样式和主题概述 样式(style)是用来Activity元素级别的,改变指定控件或者Layout的外观和格式的一组属性集合.样式可以用来指定高度.填充.自字体大小.背景颜色等等.样式在xml资源文件(res/values/styles.xml)中定义,和指定布局的xml文件是分开的,以达到设计与

Android 标签的主题样式

Android平台定义的主题样式: android:theme="@android:style/Theme.Dialog"   将一个Activity显示为对话框模式 •android:theme="@android:style/Theme.NoTitleBar"  不显示应用程序标题栏•android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  不显示应用程序标题栏,并全屏 •andr