2015-04-07 82 views
2

我最近才必須在Android佈局文件中設置xmlns屬性。最初,當我添加第三方控件時,控件的XML中的某些屬性沒有用於標識名稱空間的前綴。當我運行我的應用程序時,顯示控件,但那些沒有命名空間前綴的屬性被忽略。只有在將xmlns添加到文件頂部並向屬性添加前綴後,才能在運行時識別這些屬性。以下是更正後的代碼的樣子:瞭解Android佈局中的xmlns屬性

xmlns:fab="http://schemas.android.com/apk/res-auto" 

    <com.getbase.floatingactionbutton.FloatingActionButton 
     android:id="@+id/ivFAB" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     fab:fab_icon="@drawable/ic_fab_star" 
     fab:fab_colorNormal="@color/pink_500" 
     fab:fab_colorPressed="@color/pink_100" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:layout_marginRight="15dp" 
     android:layout_marginBottom="15dp" 
     android:visibility="visible" 
     /> 

她的xmlns前綴是'fab'。我不明白的是,沒有名稱空間和前綴,應用程序編譯沒有任何錯誤。爲什麼Android Studio不會抱怨它找不到fab_icon?爲什麼它只是忽略這些屬性?我已經在不同的主題上看到了很多帖子,其中有人指出不用前綴,然後代碼工作。所以我不知道發生了什麼。在一些問題(像我的)有前綴是必需的,但在其他人不是?這是不同版本的Android Studio或SDK版本的問題嗎?

回答

0

是的。即使您可以定義您自己的自定義佈局屬性。

第1步:創建一個視圖的子類。

class PieChart extends View { 
    public PieChart(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 
} 

步驟2:定義自定義與res/values/attrs.xml<declare-styleable>屬性。

<resources> 
    <declare-styleable name="PieChart"> 
     <attr name="showText" format="boolean" /> 
     <attr name="labelPosition" format="enum"> 
      <enum name="left" value="0"/> 
      <enum name="right" value="1"/> 
     </attr> 
    </declare-styleable> 
</resources> 

第3步:使用您的佈局XML中的屬性。

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:custom="http://schemas.android.com/apk/res/com.example.customviews"> 
<com.example.customviews.charting.PieChart 
    custom:showText="true" 
    custom:labelPosition="left" /> 
</LinearLayout> 

步驟4:應用自定義屬性您的觀點。

public PieChart(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    TypedArray a = context.getTheme().obtainStyledAttributes(
     attrs, 
     R.styleable.PieChart, 
     0, 0); 

    try { 
     mShowText = a.getBoolean(R.styleable.PieChart_showText, false); 
     mTextPos = a.getInteger(R.styleable.PieChart_labelPosition, 0); 
    } finally { 
     a.recycle(); 
    } 
} 

步驟5:添加屬性和事件

屬性是控制行爲和觀點外觀的有力方式,但是當視圖初始化,它們只能被讀取。要提供動態行爲,請爲每個自定義屬性公開屬性getter和setter對。下面的代碼片段展示瞭如何PieChart暴露了一個名爲showText

public boolean isShowText() { 
    return mShowText; 
} 

public void setShowText(boolean showText) { 
    mShowText = showText; 
    invalidate(); 
    requestLayout(); 
} 

欲瞭解更多信息和細節特性,請閱讀本link

+0

我的問題不是關於如何創建自定義屬性。這是關於理解使用xmlns屬性和前綴屬性的需要或缺乏。 – AndroidDev

+1

如果您知道如何創建具有屬性的自定義視圖,那麼很容易理解是否需要這些屬性。現在考慮如果你有一個強制性的自定義屬性,如果你不提供它會發生什麼?你的觀點會被初始化嗎? –