從XML

2013-12-11 27 views
0

我試圖做這樣的底級菜單充氣繪製從XML

<LinearLayout 
    android:id="@+id/bottomBar" 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent" 
    android:layout_marginTop="4dp" 
    android:orientation="horizontal" 
    android:layout_alignParentBottom="true" > 

    <HorizontalScrollView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:fillViewport="true" 
    android:scrollbars="none"> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

     <!-- First item of the menu --> 
     <ImageButton 
     android:id="@+id/BConex1" 
     android:contentDescription="@string/desc_gen_image" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="0.2" 
     android:layout_gravity="left" 
     android:background="@drawable/menu_bottom" 
     android:layout_marginLeft="4dp" /> 

     <!-- Second item of the menu --> 
     <ImageButton 
     android:id="@+id/BConex2" 
     android:contentDescription="@string/desc_gen_image" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="0.2" 
     android:layout_gravity="left" 
     android:background="@drawable/menu_bottom" 
     android:layout_marginLeft="4dp" /> 

     <!-- ... Some additional items in the menu --> 
    </LinearLayout> 
    </HorizontalScrollView> 
</LinearLayout> 

的@繪製/ menu_bottom是這樣定義的一個圖層列表:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 

<item>  
    <shape 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <stroke 
     android:width="1px" 
     android:color="#55ffffff" /> 

    <padding 
     android:left="16px" 
     android:top="6px" 
     android:right="16px" 
     android:bottom="6px" /> 

    <solid 
     android:color="#cc000000" /> 

    <gradient 
     android:startColor="#222222" 
     android:centerColor="#111111" 
     android:endColor="#000000" 
     android:angle="-90" /> 

    <corners 
     android:bottomRightRadius="10dp" 
     android:bottomLeftRadius="10dp" 
     android:topLeftRadius="10dp" 
     android:topRightRadius="10dp" /> 
    </shape> 
</item> 

<item> 
    <bitmap 
    android:src="@+drawable/bitmap_to_change" 
    android:tileMode="disabled" 
    android:width="30dp" 
    android:height="15dp" 
    android:gravity="center" />  
</item> 
</layer-list> 

現在的事情是:我想用exac tly與菜單中每個按鈕的背景相同,但位圖的src字段除外。我試着使用LayoutInflater按鈕中的一個,並試圖以編程方式改變它,就像這樣:

View first = LayoutInflater.from(this).inflate(R.drawable.menu_bottom, null); 
first.findViewById(R.drawable.bitmap_to_change).setBackground(this.getResources().getDrawable(R.drawable.another_resource)); 

但這返回一個例外:

11月12日至11日:35:53.556: E/AndroidRuntime(897):了java.lang.RuntimeException: 無法啓動活動ComponentInfo {XXX.MainActivity}: android.view.InflateException:二進制XML文件行#2:錯誤 充氣類層列表

所以我認爲這不是正確的方法。有沒有辦法做到這一點,而不是爲每個菜單項定義一個XML文件?

謝謝!

----------- -----------編輯

我找到了一個「髒」的解決方法來實現我的目標:讓背景其中一個按鈕作爲LayerDrawable,並用正確的Bitmap替換。這不是我想要做的方式(因爲我完全以編程方式需要它),也不是原來的問題,所以我不打算回答自己讓問題打開,希望有人能夠幫助,但這是我的現在做:

我分配一個ID,XML文件中的相應的 「項目」:

<item android:id="@+id:bitmap_layer"> 

而且編程:

ImageButton firstButton = (ImageButton) findViewById(R.id.BConex1); 
LayerDrawable bg = (LayerDrawable) firstButton.getBackground(); 
bg.setDrawableByLayerId(R.id.bitmap_layer, getResources().getDrawable(R.drawable.the_new_drawable)); 

回答

3

你鴕鳥政策需要使用iflater,獲得可繪製resurse足夠:

android.graphics.drawable.Drawable shape = getResources().getDrawable(R.drawable.item_panel_borde); 

與workaroud如果你在其他視圖使用此繪製資源,你可以得到麻煩,可以使用android.graphics.drawable.LayerDrawable(Drawable [])構造函數以編程方式創建LayerList。