以编程方式更改自定义样式的一个属性

时间:2015-12-14 20:31:06

标签: android

我正在创建几个全部使用相同样式的文本视图。我试图使用SeekBar更新Style中的文本大小,因此它适用于所有文本视图,只需少量代码。我知道我可以使用SeekBar单独设置textviews的文本大小,但这似乎很多工作。问题在于我看到的所有地方都是你无法改变的风格。除了执行如下代码之外还有其他工作吗?

定义我的文字视图

TextView tv1 = (TextView)findViewById(R.id.tv1);
TextView tv2 = (TextView)findViewById(R.id.tv2);
TextView tv3 = (TextView)findViewById(R.id.tv3);

在我的SeekBar里面

progress = seekBarProgress;
if(progress == 0)
{
    tv1.setTextSize(12);
    tv2.setTextSize(12);
    tv3.setTextSize(12);
}
if(progress == 1)
{
    tv1.setTextSize(14);
    tv2.setTextSize(14);
    tv3.setTextSize(14);
}

等等..

我希望能够更改自定义样式的一个属性。我无法将它们全部更改为不同的自定义样式,因为我将为文本大小,文本颜色,背景颜色等进行SeekBars。如果我为每个样式执行自定义样式,则会有TONS。

因为我会有很多文本视图,所以这种方法似乎不合逻辑。有没有更好的办法?感谢。

得到答案!

不是改变风格,而是抚养孩子,然后抚养孩子的孩子,并在下面进行相应的改变。

LinearLayout masterLayout = (LinearLayout)findViewById(R.id.masterLayout);

    int childCount = masterLayout.getChildCount();
    for(int i = 0; i < childCount; i++)
    {
        LinearLayout innerChild = ((LinearLayout)masterLayout.getChildAt(i));
        int childOfChildCount = innerChild.getChildCount();
        for(int x = 0; x < childOfChildCount; x++)
        {
            ((TextView)innerChild.getChildAt(x)).setTextSize(30);
        }
    }

2 个答案:

答案 0 :(得分:2)

如果只在一个布局中将这些TextView组合在一起呢?然后以编程方式更改它。 在我的例子中,我只在一个LinearLayout中对所有TextView进行分组。

LinearLayout ll = (LinearLayout) findViewById(R.id.layout);
int childCount = ll.getChildCount();
for (int i=0; i<childCount; i++){
    ((TextView)ll.getChildAt(i)).setTextSize(20);
}

确保您的布局中只有TextView。

答案 1 :(得分:0)

我知道你已经实现并接受了一个解决方案,但是,我一直在为自己考虑这个问题,并提出了一个可能有用的替代,更通用的解决方案。这涉及四个要素

  1. 为样式更改事件创建界面
  2. 为样式更改事件创建处理程序
  3. 将TextView扩展为具有一个或多个样式更改事件
  4. 触发样式更改事件
  5. 虽然这是更多代码,但它具有独立于布局和视图类的优点(即,如果您还想更改Buttons,EditTexts等的字体大小,则可以将相同的处理程序用于不同的View类)

    下面的示例仅实现了文本大小更改,但可以使用相同的技术来实现任何其他样式更改。

    界面

    public interface StyleChange {
      void onTextSizeChanged(float size);
    }
    

    处理程序

    public class TextStyleHandler {
      private static TextStyleHandler instance;
      private LinkedList<StyleChange> listeners = new LinkedList<>();
    
      public static TextStyleHandler getInstance() {
        if (instance == null) instance = new TextStyleHandler();
        return instance;
      }
    
      public void register(StyleChange item) {
        listeners.add(item);
      }
    
      public void unregister(StyleChange item) {
        listeners.remove(item);
      }
    
      public void setTextSize(float f) {
        for (StyleChange listener:listeners)
          listener.onTextSizeChanged(f);
      }
    }
    

    扩展文本视图

    public class StyledTextView extends TextView implements StyleChange {
      public StyledTextView(Context cx) {
        super(cx);
        init();
      }
    
      public StyledTextView(Context cx, AttributeSet attrs) {
        super(cx, attrs);
        init()
      }
    
      public StyledTextView(Context cx, AttributeSet attrs, int defStyle) {
        super(cx, attrs, defStyle);
        init();
      }
    
      private void init() {
        // Any other setup here (eg setting the default size
        // or getting current value from shared preferences)
        TextStyleHandler.getInstance().register(this);
      }
    
      public void onTextSizeChanged(float size) {
        setTextSize(size);
      }
    
      @Override
      protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        TextStyleHandler.getInstance().unregister(this);
      }
    }
    

    触发样式更改事件

    这可以从您的活动中完成,并将更改所有已注册视图的样式

    TextStyleHandler.getInstance().setTextSize(size);