2012-03-15 76 views
1

我的應用程序中有一個嚮導,用戶可以使用「返回」和「下一步」按鈕在活動之間前後移動。這些按鈕對嚮導中的每個活動都是相同的,並且在它們自己的xml佈局中定義,這些佈局將包含在每個活動的佈局中。他們有一個狀態列表作爲他們的背景,通常工作,只有一次,在一段時間出現這種情況:按鈕(有時)不繪製StateList xml背景

預計:

Expected

實際:

Actual

按鈕定義 - add_nav_buttons.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/rlAddNav" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     orientation="horizontal"> 
     <Button 
      android:id="@+id/bAddBack" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:layout_alignParentBottom="true" 
      android:layout_alignParentLeft="true" 
      android:background="@drawable/b_add_nav_button" 
      android:text="@string/bBack"> 
     </Button> 
     <Button 
      android:id="@+id/bAddNext" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:layout_alignParentBottom="true" 
      android:layout_alignParentRight="true" 
      android:background="@drawable/b_add_nav_button" 
      android:text="@string/bNext"> 
     </Button> 
    </LinearLayout> 
</RelativeLayout> 

包括實例 - some_activity_layout.xml

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/rlAddMain" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <!-- OTHER STUFF --> 

    <include 
     android:id="@+id/NavButtons" 
     layout="@layout/add_nav_buttons" 
     android:layout_marginTop="-50dp" 
     android:layout_alignParentBottom="true"> 
    </include> 
</RelativeLayout> 

StateList定義 - b_add_nav_button.xml

<?xml version="1.0" encoding="UTF-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_enabled="false"> 
     <shape> 
      <gradient 
       android:startColor="#C7C7C7" 
       android:endColor="#8B8B8B" 
       android:angle="270"> 
      </gradient> 
      <stroke 
       android:width="1dp" 
       android:color="#8B8B8B"> 
      </stroke> 
      <padding 
       android:left="10dp" 
       android:right="10dp" 
       android:top="10dp" 
       android:bottom="10dp"> 
      </padding> 
     </shape> 
    </item> 
    <item android:state_pressed="true" > 
     <shape> 
      <solid 
       android:color="#FFA319" /> 
      <padding 
       android:left="10dp" 
       android:right="10dp" 
       android:top="10dp" 
       android:bottom="10dp" /> 
     </shape> 
    </item> 
    <item> 
     <shape> 
      <gradient 
       android:startColor="#4F4FB2" 
       android:endColor="#24248F" 
       android:angle="270"> 
      </gradient> 
      <stroke 
       android:width="1dp" 
       android:color="#24248F"> 
      </stroke> 
      <padding 
       android:left="10dp" 
       android:right="10dp" 
       android:top="10dp" 
       android:bottom="10dp"> 
      </padding> 
     </shape> 
    </item> 
</selector> 

我徹底難倒了,任何幫助,將不勝感激。只是重新迭代,大部分時間都是預期的行爲發生,只是在一段時間內背景無法繪製。

我還應該補充說,按鈕仍然功能上像他們應該的工作。

編輯

我加了一些調試語句,並設法再現。顯然Android有時將b_add_bav_button.xml解釋爲ColorDrawable而不是StateListDrawable。我嘗試將狀態列表中的形狀拉入自己的xml文件中,而不是骰子。我仍然同樣困惑。

+0

即將發生失敗之前會發生什麼? – deed02392 2012-03-15 16:20:55

+0

沒什麼,沒有崩潰或任何錯誤消息或任何東西。此外,它不能在仿真器中重現,並且難以在實際的手機上重現(儘管有些手機似乎比其他手機更容易)。我的想法是,這是一些緩存相關的問題。 – ahal 2012-03-15 16:26:31

+0

看到我上面的修改。 – ahal 2012-03-15 17:26:19

回答

2

Android認爲我使用ColorDrawable而不是StateListDrawable導致上述行爲。我仍然不知道爲什麼,但它與屏幕方向有關(可以通過開始活動,彈出活動,旋轉屏幕和再次開始活動來重現)。

我的解決辦法是拉<形狀>的出XML選擇的,而是建立一個 StateListDrawable編程就像這樣:

StateListDrawable d = new StateListDrawable(); 
d.addState(new int[]{ android.R.attr.state_pressed, android.R.attr.state_enabled }, 
      this.getResources().getDrawable(R.drawable.b_add_nav_button_pressed)); 
d.addState(new int[]{ -android.R.attr.state_enabled }, 
      this.getResources().getDrawable(R.drawable.b_add_nav_button_disabled)); 
d.addState(new int[]{ android.R.attr.state_enabled }, 
      this.getResources().getDrawable(R.drawable.b_add_nav_button_normal)); 
bNext.setBackgroundDrawable(d); 

有很多古怪的事情,但我似乎讓它工作。

2

將文件「a_dummy_magic.xml」作爲「最頂層」可繪製資源 - 可以固定位置。只有Android SDK具有這種不合理的行爲。相信我。我體驗了它,並花了整整一週的時間來找到這個竅門。

+0

我不知道爲什麼這個工作,但它做到了。我有一個按鈕(很多)顯示這種行爲。我希望添加一個虛擬文件最好只是將問題移到另一個按鈕。但是,它似乎已經讓問題消失了。我相信我的版本的失敗也只發生在SDK中。 – 2013-03-26 15:37:15