Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android自定義屬性為應用程序設置全局背景

Android自定義屬性為應用程序設置全局背景

編輯:關於Android編程

關於自定義屬性,我們用的比較多的時候就是在自定義view的時候了,其實自定義屬性還有一些其余的妙用。

這裡講解一個利用自定義的屬性為應用程序全局的替換背景的例子。

1.Android裡面使用自定義屬性的實例

可能我們在使用ToolBar的時候見過很多次的這種使用方式了。

在確定ToolBar的寬度和背景色的時候,並沒有在xml文件裡面去寫死,而是讀取的Google自定義的屬性值。
我們會好奇,這樣怎麼就能獲取到值呢,這個屬性是在哪裡有定義的呢,關於怎麼拿到值是另外一個問題了,現在來說一下這個值是在哪裡定義的,並且在哪裡賦的初始值的。
首先找到我們當前項目的Theme,我的當前的項目的Theme的parent是Theme.AppCompat.Light.DarkActionBar,找到它的parent,點進去,這裡面就是Android內部的res\values裡面的一些主題,屬性等等。
在裡面搜索actionBarSize和colorPrimary這個屬性。
actionBarSize

colorPrimary

然後再看這個屬性的declare-styleable的名字
declare-styleable

好吧,其實不需要知道declare-styleable的名字,跟這個沒什麼關系。

這裡我們知道Android的values裡面確實有這些屬性的定義,並不是憑空想象出來的,然後有了定義我們使用之前肯定要對這些屬性賦值啊,指望開發者對其賦值有可能開發者並不知道這個東西的呢,所以呢,values裡面肯定有賦值的操作,我們繼續找。

從哪找起呢,當然是從我們的Theme的parent找起了,前面說了當前的程序的主題是繼承Theme.AppCompat.Light.DarkActionBar的。
我們就去找到對應的賦值操作。最終發現主題是繼承Theme.Light,當然中間還繼承了很多層,可以自行查看。
colorPrimary
可以看到這裡面是對colorPrimary進行了賦值操作的。
actionBarSize的賦值在Base.V7.Theme.AppCompat.Light裡面。
actionBarSize

所以綜上所述的一些知識我們知道,如果我們想在xm裡面像android:background=”?attr/colZ喎?/kf/ware/vc/" target="_blank" class="keylink">vclByaW1hcnkmcmRxdW871eLR+bXEyrnTw9fUtqjS5bXE0rvQqcr00NTX9tK70Kmy2df3tcS7sNKyt8ezo7zytaWjrNa70OjSqsj9sr2+zb/J0tTBy6GjPC9wPg0KPHA+sr3W6Do8L3A+DQo8aDMgaWQ9"第一步定義屬性">第一步,定義屬性

第二步,給自定義的屬性賦值

第三步,使用自定義的屬性值

2.實例講解一個關於自定義屬性的妙用

現在有一個需求是這樣的,當前的程序為了風格統一,所有的界面需要一個統一的背景圖或者背景色,並且這個背景圖或者背景色是可以自由定制的,就是說可以在style文件裡面自由配置。那這個時候自定義屬性就非常方便的可以完成這個效果了。
三個步驟:

2.1.定義自定義的屬性

在values裡面新建attrs.xml文件,裡面定義自定義屬性。
定義自定義的屬性
代碼也貼這裡:



    
        
        
    

2.2.給自定義的屬性賦值

需要我們在當前程序的Theme裡面對這個屬性賦值。



賦值也完成了。

2.3.使用自定義的屬性值

由於我們當前的程序的所有的界面都需要使用這樣的背景色,那麼我們可以定義一個自己的baseActivity,裡面對setContentView作一個簡單的處理。

2.3.1.創建base_layout的xml布局

base_layout.xml


<framelayout android:background="?attr/baseBackground" android:id="@+id/base_layout_container" android:layout_height="match_parent" android:layout_width="match_parent" xmlns:android="http://schemas.android.com/apk/res/android">
</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);
    }
}

有圖有真相:
效果

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved