2016-11-29 76 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解析并创建自己的样式更简单。

相关问题