1. 程式人生 > >Android自定義xml屬性,自定義(組合)控制元件

Android自定義xml屬性,自定義(組合)控制元件

原文連結

 本文是在“劍蕭舞蝶”的“Android中View自定義組合控制元件的基本編寫方法”的基礎上進行修正而來的。按照原作者的說發和程式碼來寫自定義控制元件,結果使用的時候出了不少問題。我之前對於這塊完全沒有去接觸,又看到有人說網上的例子都是大同小異,很多細節也沒有說清楚,所以在此記一下。

此處的所謂“自定義”組合控制元件的意思是,一個整體的控制元件裡面包含了若干個控制元件,比如本文示例的是一個linearlayout包含了兩個textview一個CheckBox,使用的時候,是把它們當做一個控制元件來使用的,並沒有什麼高深的意思(小小吐槽一下,鄙人很討厭別人把簡單的一件事情說的複雜化)。

來說一下這個“組合控制元件”的用處。在需要使用若干個相同的佈局的時候,最簡單也是最不經濟的做法就是複製貼上,需要使用多少次就貼上多少次,既增添了程式碼量也不利於管理。如果這個時候有一個現成的封裝好的控制元件能夠使用,並且子控制元件的屬性和功能也是封裝好的,能節省很多程式碼量,方便管理,用起來也很爽。這就是組合控制元件啦,貌似也有人叫它組合View吧。

組合控制元件的實現是不難的。自定義一個佈局類繼承自RelativeLayout或者LinearLayout或者FrameLayout........,如果你是採用渲染的方式來完成這個組合控制元件的,繼承自哪個layout都無所謂,如果你是採用addView方式的話,就得考慮用哪個layout比較合適。到此,如果不使用自定義xml屬性的話,那麼渲染好佈局或者新增好控制元件之後,再根據需求做事件或者邏輯處理,再在需要用的layout裡面用上就可以了。像這樣:

<com.example.administrator.mmpapplication.CombinationView
            android:id="@+id/view1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
          >
</com.example.administrator.mmpapplication.CombinationView>



想看自定義xml屬性或者渲染方式的寶寶請往下,繼續閱讀。

那麼,我們先來自定義xml屬性。首先,在/res/values目錄下新建一個attrs.xml檔案,內容如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--此處的name必須和自定義View的類名一致-->
    <declare-styleable name="CombinationView">
        <attr name="desc_off" format="string"></attr>
        <attr name="title" format="string"></attr>
        <attr name="desc_on" format="string"></attr>
    </declare-styleable>

</resources>


三個attribute代表有三個屬性,屬性名字分別desc_off,desc_on,title,三個屬性的內容格式都是string型別。ormat有好幾種不同的值:string , integer , dimension , reference , color , enum。當format是enum列舉型別的時候,attr裡面這樣寫:

<attr name="tEnum"> 
    <enum name="hello" value="-1"/> 
    <enum name="kitty" value="-2"/> 
</attr>


接下來,使用自定義屬性,先拿到。
 TypedArray attrArray = context.obtainStyledAttributes(attrs, R.styleable.CombinationView);
        String title = attrArray.getString(R.styleable.CombinationView_title);
        String desc_on = attrArray.getString(R.styleable.CombinationView_desc_on);
        String desc_off = attrArray.getString(R.styleable.CombinationView_desc_off);
title,desc_on,desc_off就是我們拿到的屬性的值,這時候可以使用它們了。
tv_title.setText(title);

 完整的自定義類程式碼:

public class CombinationView extends RelativeLayout { private String TAG = "CombinationView"; private TextView tv_title, tv_desc; private CheckBox cb_status; private String title, desc_on, desc_off; public CombinationView(Context context, AttributeSet attrs) { super(context, attrs);//使用渲染的方式載入佈局 View view = View.inflate(context, R.layout.layout_combinationview, this); tv_title = (TextView) view.findViewById(R.id.tv_title); tv_desc = (TextView) view.findViewById(R.id.tv_desc); cb_status = (CheckBox) view.findViewById(R.id.cb_status); TypedArray attrArray = context.obtainStyledAttributes(attrs, R.styleable.CombinationView); title = attrArray.getString(R.styleable.CombinationView_title); desc_on = attrArray.getString(R.styleable.CombinationView_desc_on); desc_off = attrArray.getString(R.styleable.CombinationView_desc_off); Log.e(TAG, "----->title:" + title + " desc_on:" + desc_on + " desc_off:" + desc_off); if (null != title) { tv_title.setText(title); } if (null != desc_off) { tv_desc.setText(desc_off); } } public boolean isCehcked() { return cb_status.isChecked(); } public void setChecked(boolean isChecked) { cb_status.setChecked(isChecked); if (isChecked) { tv_desc.setText(desc_on); } else { tv_desc.setText(desc_off); } }}
完整的attrs.xml程式碼:

<?xml version="1.0" encoding="utf-8"?><resources> <!--此處的name必須和自定義View的類名一致--> <declare-styleable name="CombinationView"> <attr name="desc_off" format="string"></attr> <attr name="title" format="string"></attr> <attr name="desc_on" format="string"></attr> </declare-styleable></resources>在Activity的佈局裡邊使用自定義控制元件:<com.example.administrator.mmpapplication.CombinationView android:id="@+id/view1" android:layout_width="match_parent" android:layout_height="wrap_content" example:title="title 1" example:desc_off="unselect 1" example:desc_on="select 1" ></com.example.administrator.mmpapplication.CombinationView>

在Activity裡邊處理事件:
public class SelfDenideViewActivity extends AppCompatActivity implements View.OnClickListener {
    private CombinationView combinationView1, combinationView2, combinationView3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_self_denide_view);
        combinationView1 = (CombinationView) findViewById(R.id.view1);
        combinationView2 = (CombinationView) findViewById(R.id.view2);
        combinationView3 = (CombinationView) findViewById(R.id.view3);

        combinationView1.setOnClickListener(this);
        combinationView2.setOnClickListener(this);
        combinationView3.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.view1:
                if (combinationView1.isCehcked()) {
                    combinationView1.setChecked(false);
                } else {
                    combinationView1.setChecked(true);
                }
                break;
            case R.id.view2:
                if (combinationView2.isCehcked()) {
                    combinationView2.setChecked(false);
                } else {
                    combinationView2.setChecked(true);
                }
                break;
            case R.id.view3:
                if (combinationView3.isCehcked()) {
                    combinationView3.setChecked(false);
                } else {
                    combinationView3.setChecked(true);
                }
                break;
        }
    }
}
到這裡,例子就完了。
有幾個需要注意的地方,一個是在attrs.xml檔案 中,declare_styleable的name的名稱必須和自定義的View的類名稱一致,如果是Android studio,輸入之後會有提示出來。
一個是 attr屬性,除了指定name之外,format也必須指定。
最後的也是最重點的就是名稱空間的問題,我就說說我在Android studio使用的情況,剛開始我使用的是應用的包名,就是在AndroidMenifest裡邊的包名(補充一個,
有人說此自定義的類必須要在應用包名下,不能在子包名下,本人沒去試,有興趣的寶寶可以試一下),結果Android studio直接報紅線,然後根據提示,換成了這樣子:
xmlns:example="http://schemas.android.com/apk/res-auto"
就好了。


相關推薦

Android定義xml屬性定義組合控制元件

原文連結  本文是在“劍蕭舞蝶”的“Android中View自定義組合控制元件的基本編寫方法”的基礎上進行修正而來的。按照原作者的說發和程式碼來寫自定義控制元件,結果使用的時候出了不少問題。我之前對於這塊完全沒有去接觸,又看到有人說網上的例子都是大同小異,很多細節也沒有說清

WPF定義控制元件控制元件分類

原文: WPF自定義控制元件(一)の控制元件分類 一、什麼是控制元件(Controls)         控制元件是指對資料和方法的封裝。控制元件可以有自己的屬性和方法,其中屬性是控制元件資料的簡單訪問者,方法則是控制元件的一些簡單而可見的功能、控制元件建

winformDataGridView繫結資料後更改列屬性、動態建立用一個控制元件顯示多表適用

DataGridView 特效 = new DataGridView(); string[] 列名 = { "直線", "炸彈", "骷髏", "禮盒" },

Android中View定義XML屬性詳解以及R.attr與R.styleable的區別

為View新增自定義XML屬性 Android中的各種Widget都提供了很多XML屬性,我們可以利用這些XML屬性在layout檔案中為Widget的屬性賦值。 如下所示: <TextView android:layout_wi

Android定義View 定義xml屬性設定

Android自定義View實現很簡單 繼承View,重寫建構函式、onDraw,(onMeasure)等函式。 如果自定義的View需要有自定義的屬性,需要在values下建立attrs.xml。在其中定義你的屬性。 在使用到自定義View的xml佈局檔案中需要加

Android 支付密碼輸入框定義EditText實現密碼輸入框功能;

剛擼出來的密碼輸入框,註釋和邏輯看著挺清晰的,一些屬性還沒有新增,下個部落格把屬性新增上去; 看一下圖: 直接看程式碼吧! import android.content.Context; import android.graphics.Canvas; import android.

android studio引入一個定義的佈局定義控制元件避免每一個活動中都編寫一樣佈局程式碼的問題

本次演示的是標題欄上建立按鈕,即 引入自定義佈局和自定義控制元件的應用十分的廣泛,它的形成的效果很多的應用程式都有,我們可以自定義標題欄,因為普通的標題欄就是一行文字,但是,我們可以發現,很多手機軟體的標題欄上都有返回,或者 進入的按鈕,尤其是全面屏的手機。而且它還能解

定義元素屬性以及用jquery 去獲取當前點選的元素的這個定義屬性

部分html: <button dataid="1" class="btn btn-primary btn-xs hanblog_edit">修改</button>juqery

C# 定義控制元件定義屬性定義事件

using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Li

android DialogFragment底部彈出定義大小

public class Dlg extends DialogFragment {     private View rootView;     private int height;     @Override     public View onCreateView(L

(六)、SpringBoot 定義配置屬性可以在application.properties中修改

可以前往第一篇部落格檢視目錄結構 --> 這裡一、自定義配置 (一些動態的資料:登入頁面地址 、接收資料格式等等)二、在core模組下建立properties目錄 : com.zeke.core.properties 。在properties目錄下建立SecurityP

Android圓形圖片不求人定義View實現BitmapShader使用

在很多APP當中,圓形的圖片是必不可少的元素,美觀大方。本文將帶領讀者去實現一個圓形圖片自定View,力求只用一個Java類來完成這件事情。 一、先上效果圖 二、實現思路 在定義View 的onMeasure()方法裡設定View的寬高相等,應該取寬高中的最小值。

微信小程式定義屬性設定和獲取data-

自定義屬性語法以data-開頭: <block wx:for='{{post_key}}' wx:key="key" wx:for-item='item'> <view catchtap='onPostTap' data-postid="{{item.postId}}

javaEE JSP定義標籤庫定義分頁條標籤

WEB-INF/tld/commons.tld(自定義標籤庫的描述): <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, In

iOS中設定百度地圖定義標註圖片定義泡泡

#pragma mark - BMKMapViewDelegate // 根據anntation生成對應的View - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id &l

Python Flask定義響應資訊定義狀態碼、響應頭

  demo.py(自定義響應資訊): # coding:utf-8 from flask import Flask, make_response app = Flask(__name__) @app.route("/index") def index(): #

第5天:定義建構函式建立物件簡單工廠模式

面向物件 封裝、繼承、多型(抽象性) js是一門基於物件的語言 萬物皆物件 物件:有屬性和方法,具體特指的某個事物 物件:有特徵和行為,具體特指的某一事物 javaScript 中的所有事物都是物件:字串、數值、陣列、函式... 此外,Ja

gin框架定義日誌輸出定義gin中介軟體擴充套件Logger

gin框架是款高效能的GoWeb框架,可以快速開發部署api服務。在使用過程中我們需要記錄各種各樣的日誌,下面介紹下我們怎麼自定義日誌記錄格式或擴充套件日誌。 gin簡單剖析 api服務建立 package main import "gith

Android 定義View練習:雷達圖比重繪製

code: package com.louisgeek.louiscustomviewstudy; import android.content.Context; import android.content.res.Resources; import

Android進階——定義View之組合系統控制元件實現水珠形狀的ItemView

引言 相信大家在專案開發的過程中一定會有不少需要在上方顯示一張圖片,而在其下方顯示提示標題的效果,作為一個介面的功能按鈕或者單純作為一個列表的item項,尤其是當這個item還需要顯示一些動畫效果時候,此時更應該當成一個整體,否則動畫效果就會需要額外的調整,否