Android自定义属性为应用程序设置全局背景

关于自定义属性,我们用的比较多的时候就是在自定义view的时候了,其实自定义属性还有一些其余的妙用。

这里讲解一个利用自定义的属性为应用程序全局的替换背景的例子。

1.Android里面使用自定义属性的实例

可能我们在使用ToolBar的时候见过很多次的这种使用方式了。

<android.support.v7.widget.Toolbar
    style="@style/ToolBarStyle"
xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary" />

在确定ToolBar的宽度和背景色的时候,并没有在xml文件里面去写死,而是读取的Google自定义的属性值。

我们会好奇,这样怎么就能获取到值呢,这个属性是在哪里有定义的呢,关于怎么拿到值是另外一个问题了,现在来说一下这个值是在哪里定义的,并且在哪里赋的初始值的。

首先找到我们当前项目的Theme,我的当前的项目的Theme的parent是Theme.AppCompat.Light.DarkActionBar,找到它的parent,点进去,这里面就是Android内部的res\values里面的一些主题,属性等等。

在里面搜索actionBarSize和colorPrimary这个属性。

然后再看这个属性的declare-styleable的名字

好吧,其实不需要知道declare-styleable的名字,跟这个没什么关系。

这里我们知道Android的values里面确实有这些属性的定义,并不是凭空想象出来的,然后有了定义我们使用之前肯定要对这些属性赋值啊,指望开发者对其赋值有可能开发者并不知道这个东西的呢,所以呢,values里面肯定有赋值的操作,我们继续找。

从哪找起呢,当然是从我们的Theme的parent找起了,前面说了当前的程序的主题是继承Theme.AppCompat.Light.DarkActionBar的。

我们就去找到对应的赋值操作。最终发现主题是继承Theme.Light,当然中间还继承了很多层,可以自行查看。

可以看到这里面是对colorPrimary进行了赋值操作的。

actionBarSize的赋值在Base.V7.Theme.AppCompat.Light里面。

所以综上所述的一些知识我们知道,如果我们想在xm里面像android:background=”?attr/colorPrimary”这样的使用自定义的一些属性做一些操作的话也非常简单,只需要三步就可以了。

步骤:

第一步,定义属性

第二步,给自定义的属性赋值

第三步,使用自定义的属性值

2.实例讲解一个关于自定义属性的妙用

现在有一个需求是这样的,当前的程序为了风格统一,所有的界面需要一个统一的背景图或者背景色,并且这个背景图或者背景色是可以自由定制的,就是说可以在style文件里面自由配置。那这个时候自定义属性就非常方便的可以完成这个效果了。

三个步骤:

2.1.定义自定义的属性

在values里面新建attrs.xml文件,里面定义自定义属性。

代码也贴这里:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="App_Attrs">
        <!-- 默认背景图 -->
        <attr name="baseBackground" format="color|reference"/>
    </declare-styleable>
</resources>

2.2.给自定义的属性赋值

需要我们在当前程序的Theme里面对这个属性赋值。

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="baseBackground">@android:color/holo_green_light</item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>

赋值也完成了。

2.3.使用自定义的属性值

由于我们当前的程序的所有的界面都需要使用这样的背景色,那么我们可以定义一个自己的baseActivity,里面对setContentView作一个简单的处理。

2.3.1.创建base_layout的xml布局

base_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    android:id="@+id/base_layout_container"
xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?attr/baseBackground">
</FrameLayout>

里面引用了自定义的属性值。

2.3.2.baseActivity的代码:

public class BaseActivity extends AppCompatActivity {
    FrameLayout mBaseContainerView;
    @Override
    public void setContentView(@LayoutRes int layoutResID) {
setContentView(getLayoutInflater().inflate(layoutResID, null));
    }

    @Override
    public void setContentView(View view) {
        setContentView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT));
    }

    @Override
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        mBaseContainerView = (FrameLayout) getLayoutInflater().inflate(R.layout.base_layout, null);
        Drawable bg = view.getBackground();
        if (bg != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                findViewById(R.id.base_layout_container).setBackground(bg);
                view.setBackground(null);
            } else {
                findViewById(R.id.base_layout_container).setBackgroundDrawable(bg);
                view.setBackgroundDrawable(null);
            }
        }
        FrameLayout.LayoutParams p = new FrameLayout.LayoutParams(
                FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
        mBaseContainerView.addView(view, p);
        super.setContentView(mBaseContainerView, params);
    }
}

代码里面对setContentView方法作了简单的处理。

2.3.3.MainActivity里面直接使用就可以看到背景色已经发生改变


public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

有图有真相:

Demo地址:http://download.csdn.net/detail/qy274770068/9499356

时间: 2024-10-12 19:25:54

Android自定义属性为应用程序设置全局背景的相关文章

微信小程序设置全局请求URL 封装wx.request请求

app.js: App({ //设置全局请求URL globalData:{ URL: 'https://www.oyhdo.com', }, /** * 封装wx.request请求 * method: 请求方式 * url: 请求地址 * data: 要传递的参数 * callback: 请求成功回调函数 * errFun: 请求失败回调函数 **/ wxRequest(method, url, data, callback, errFun) { wx.request({ url: url,

Android L下用XXRadius设置圆角背景图片不能显示

设置控件的background的例子: <Button android:id="@+id/btn1" android:layout_width="100dp" android:layout_height="50dp" android:text="btn1" android:background="@drawable/btn1"/> <?xml version="1.0"

微信小程序 设置全局数据

在app.js写 //app.js App({ globalData:{ userInfo:null, } }) 设置数据 app.globalData.userInfo=result; 获取数据 this.setData({ userInfo:getApp().globalData.userInfo }); 原文地址:https://www.cnblogs.com/yuyisoft/p/8387224.html

Java设置全局热键——第三方包jintellitype实现

Java原生API并不支持为应用程序设置全局热键.要实现全局热键,需要用JNI方式实现,这就涉及到编写C/C++代码,这对于大多数不熟悉C/C++的javaer来说,有点困难.不过幸好,国外有人已经实现了,发布成第三方java包,借此,我们可以很方便的设置全局热键而不用编写任何C/C++代码. jintellitype官网貌似目前访问不到,这里提供下载:http://pan.baidu.com/s/1kTIDxgN. 我实现的演示Demo源码下载:http://pan.baidu.com/s/1

Android给TextView和EditText等控件设置透明背景、圆角边框

第一种方法:在drawable文件夹下新建一个文件设置背景样式 代码: 在drawable文件夹下面新建textviewborder.xml <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#80858

如何编写程序设置Android来电铃声

我们在拿到新手机后通常会为其设置来年铃声,那么怎样通过代码来设置Android来电铃声,本文就为大家实例讲解下. 1.如果读到的是音频文件路径,需要先将音乐文件插入到多媒体库. Java代码 //设置--铃声的具体方法 public void setMyRingtone(String path) { File sdfile = new File(path); ContentValues values = new ContentValues(); values.put(MediaStore.Med

Android程序设置软件图标

默认新建的工程里会设置一个系统默认图标 如果没有,就在工程的AndroidManifest.xml文件中添加下面的语句即可. 这里需要预先在/res/drawable/目录下放一个叫icon.png的图标图片(48×48),并且在/res/values/strings.xml中定义app_name这个字符串(就是程序名) <application android:icon="@drawable/icon" android:label="@string/app_name&

Android给TextView设置透明背景、圆角边框

第一种方法:在drawable文件夹下新建一个文件设置背景样式 代码: 在drawable文件夹下面新建text_view_border.xml [java] view plaincopy <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid an

C#程序中设置全局代理(Global Proxy)

1. HttpWebRequest类的Proxy属性,只要设置了该属性就能够使用代理了,如下: 1 //设置代理 2 WebProxy WP = new WebProxy("41.76.44.76", 3128); 3 ICredentials jxCredt = new NetworkCredential("proxy_username", "proxy_password"); 4 WP.Credentials = jxCredt; 5 6 H