2016-11-29 99 views
0

我創建一個自定義TextSwitcher如下如何從自定義視圖中傳遞樣式屬性?

public class CustomTextSwitcher extends TextSwitcher { 
    private static final long SHOW_TEXT_ANIMATION_TIME = 100; 

    public CustomTextSwitcher(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    private void init() { 
     Animation in = AnimationUtils.loadAnimation(context, android.R.anim.fade_in); 
     Animation out = AnimationUtils.loadAnimation(context, android.R.anim.fade_out); 

     in.setDuration(SHOW_TEXT_ANIMATION_TIME); 
     out.setDuration(SHOW_TEXT_ANIMATION_TIME); 

     this.setInAnimation(in); 
     this.setOutAnimation(out); 
    } 

    public void setStyle(final int style) { 
     this.setFactory(new ViewSwitcher.ViewFactory() { 
      @Override 
      public View makeView() { 
       return new TextView(new ContextThemeWrapper(context, style), 
         null, 0); 
      } 
     }); 

    } 
} 

這是一件好事,但我需要明確設置使用setStyle功能如上聲明,初始化後的風格。

我希望我不需要調用setStyle只是申報我的風格在XML(如下代碼所示),並獲得int值通過構造attr價值了,並沿該ViewFacory發送,全部在init()函數中完成。

<my.example.CustomTextSwitcher 
    android:id="@+id/search_list_title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    style="@style/recentSearchHeaderText" /> 

我怎麼能做到這一點?

回答

0

我找到了這樣做的方法。這與attrs.getStyleAttribute()一樣簡單。顯示以下代碼

public class CustomTextSwitcher extends TextSwitcher { 
    private static final long SHOW_TEXT_ANIMATION_TIME = 100; 

    public CustomTextSwitcher(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(attrs); 
    } 

    private void init(AttributeSet attrs) { 

     this.setFactory(new ViewFactory() { 
      @Override 
      public View makeView() { 
       return new TextView(new ContextThemeWrapper(context, 
         attrs.getStyleAttribute()), null, 0); 
      } 
     }); 
     Animation in = AnimationUtils.loadAnimation(context, android.R.anim.fade_in); 
     Animation out = AnimationUtils.loadAnimation(context, android.R.anim.fade_out); 

     in.setDuration(SHOW_TEXT_ANIMATION_TIME); 
     out.setDuration(SHOW_TEXT_ANIMATION_TIME); 

     this.setInAnimation(in); 
     this.setOutAnimation(out); 
    } 
} 
0

您從構造函數獲得的AttributeSet是從XML中的style屬性以及提供的其他屬性生成的。所以你只需保存它,然後在constructor to your TextView.中傳遞它。 setStyle方法實際上可以與接受樣式ID的TextView#setTextAppearance方法一起使用。它只會查看與TextView相關聯的樣式屬性。我會說這比通過AttributeSet解析並創建自己的樣式更簡單。

相關問題