我正在创建几个全部使用相同样式的文本视图。我试图使用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);
}
}
答案 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)
我知道你已经实现并接受了一个解决方案,但是,我一直在为自己考虑这个问题,并提出了一个可能有用的替代,更通用的解决方案。这涉及四个要素
虽然这是更多代码,但它具有独立于布局和视图类的优点(即,如果您还想更改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);