android在代码中设置样式

Ben*_*Ben 243 android coding-style textview

我正在尝试使用像这样的样式的TextView构造函数:

TextView myText = new TextView(MyActivity.this, null, R.style.my_style );

但是,当我这样做时,文本视图似乎不采用样式(我通过在静态对象上设置它来验证样式).

我也尝试过使用myText.setTextAppearance(MyActivity.this, R.style.my_style)但它也不起作用

Dan*_*ick 310

我不相信你可以以编程方式设置样式.要解决此问题,您可以创建一个模板布局xml文件,并指定样式,例如在res/layout create tvtemplate.xml中,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="This is a template"
        style="@style/my_style" />
Run Code Online (Sandbox Code Playgroud)

然后膨胀这个实例化你的新TextView:

TextView myText = (TextView)getLayoutInflater().inflate(R.layout.tvtemplate, null);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 它可能有用,但这没有意义.怎么可能用xml文件设置?如果不是**编程**.有理由不使用xml文件,其中一个是我习惯编写代码来构建UI所以我不想学习一种新方法,因为我的记忆有限,我想保留一些空间其他事情. (2认同)

小智 117

您可以创建一个通用样式,并在多个文本视图上重复使用它,如下所示:

textView.setTextAppearance(this, R.style.MyTextStyle);
Run Code Online (Sandbox Code Playgroud)

编辑:是指Context

  • 只要您所做的一切都是用文本的"风格"来表达,那么您的答案就会奏效.如果您尝试对TextView执行其他操作(如添加填充或边距),则无效.所以,我不是说你错了,但你的回答是有限的.在运行时膨胀视图是应用综合样式的唯一方法. (49认同)
  • 注意:这=上下文 (4认同)
  • 使用支持库中的方法`TextViewCompat.setTextAppearance` (3认同)

max*_*nna 94

您可以将ContextThemeWrapper传递给构造函数,如下所示:

TextView myText = new TextView(new ContextThemeWrapper(MyActivity.this, R.style.my_style));
Run Code Online (Sandbox Code Playgroud)

  • @AliakseiN.你需要使用3-arg构造函数,例如`new Button(new ContextThemeWrapper(context,R.style.TabButton),null,0)`.否则,将应用默认按钮样式,此样式将覆盖您通过ContextThemeWrapper合并到主题中的按钮样式. (11认同)

Dan*_*son 16

您可以在构造函数中设置样式(但不能动态更改/设置样式).

View(Context, AttributeSet, int)(这int是一种风格资源)

来自Romain Guy的回答

参考

  • 最后一个int是*not*一个样式资源.它是"当前主题中的一个属性,包含对为视图提供默认值的样式资源的引用." (4认同)
  • 它是如何误导的?接受的答案是误导性的,因为Romain Guy明确表示你可以通过编程方式"设置"一种风格.没有动态改变它的设施.这个线程似乎并不认为是这种情况. (3认同)

Dmi*_*Arc 8

参数int defStyleAttr不指定样式.从Android文档:

defStyleAttr - 当前主题中的一个属性,包含对为视图提供默认值的样式资源的引用.可以为0以查找默认值.

要在View构造函数中设置样式,我们有两种可能的解决方案:

  1. 使用ContextThemeWrapper:

    ContextThemeWrapper wrappedContext = new ContextThemeWrapper(yourContext, R.style.your_style);
    TextView textView = new TextView(wrappedContext, null, 0);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用四参数构造函数(从LOLLIPOP开始可用):

    TextView textView = new TextView(yourContext, null, 0, R.style.your_style);
    
    Run Code Online (Sandbox Code Playgroud)

两个解决方案的关键 - defStyleAttr参数应为0以将我们的样式应用于视图.


Chr*_*ell 5

(尚未)支持动态更改样式.您必须在创建视图之前通过XML 设置样式.

  • 实际上,这恰好是同一件事 (20认同)