【问题标题】:ContextThemeWrapper to change styles in androidContextThemeWrapper 更改 android 中的样式
【发布时间】:2020-03-13 23:04:25
【问题描述】:

我已经看到了几个与类似问题相关的主题,但我无法成功地将其应用到我的案例中。实际上,当用户使用 ContextThemeWrapper 单击按钮时,我正在尝试更改按钮的样式。因此,最初按钮设置为我在 XML 文档中链接的某种样式,并且我包含此代码以尝试通过使用 ContextThemeWrapper 并根据下面第一个链接中的建议使其外观发生变化。问题(我认为)是我不知道如何将新创建的按钮链接到我在屏幕上看到的物理对象。欢迎任何建议!谢谢!

    public class MainActivity extends AppCompatActivity {

    private Button TestButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TestButton = findViewById(R.id.button);

        TestButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ContextThemeWrapper newContext = new ContextThemeWrapper(getApplicationContext(), R.style.custom);

                 TestButton = new TextView(newContext);

            }
        });
    }
}

以下是我要引用的链接: ContexThemeWrapper to change style General question about different contexts

【问题讨论】:

  • 如果您更清楚确切的问题是什么,并且如果您链接到您提到的其他主题,这个问题会吸引更好的答案。

标签: java android


【解决方案1】:

您有几个选项可以动态更改按钮的样式。

  1. 手动更改每个属性:

    TestButton.setTextColor(Color.RED);
    TestButton.setTextSize(24);
    // etc.
    
  2. 创建一个新按钮并替换布局中的旧按钮:

    ContextThemeWrapper newContext = new ContextThemeWrapper(MainActivity.this, R.style.custom);
    NewTestButton = new NewTestButton(newContext);
    Container.removeView(TestButton)
    Container.addView(NewTestButton)
    

【讨论】:

  • 您好 Bracadabra,感谢您抽出宝贵时间!实际上现在它做了一些事情,(小胜利)虽然远非预期的结果。我试图链接样式资源中定义 de 按钮的所有内容(包括布局限制),但它们不起作用。结果,当我将新按钮带入场景时,它的位置离它应该在的位置很远,而且似乎唯一遵循的属性是 textColor 这似乎很奇怪......
  • 你好,没有代码很难说问题出在哪里。
【解决方案2】:

同意,没有代码很难...附上我到目前为止所做的事情:

public class MainActivity extends AppCompatActivity {
    private Button TestButton;
    private Button NewTestButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TestButton = (Button) findViewById(R.id.button);

    }

    public void doSomething(View view) {
        ViewGroup parent = (ViewGroup) view.getParent();

        parent.removeView(view);
        ContextThemeWrapper newContext = new ContextThemeWrapper(MainActivity.this, R.style.custom);
        NewTestButton = new Button(newContext);
        parent.removeView(view);
        parent.addView(NewTestButton);

    }
}

这是关于 main_activity 的 XML

<Button
        android:id="@+id/button"
        style="@style/original"
        android:onClick="doSomething"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

And both styles applied before and after the click...

<style name="custom">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_marginTop">200dp</item>
        <item name="android:background">@android:color/black</item>
        <item name="android:text">Custom Button</item>
        <item name="android:textColor">@android:color/white</item>

    </style>
    <style name="original">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_marginTop">200dp</item>
        <item name="android:background">@android:color/white</item>
        <item name="android:text">Original Button</item>
        <item name="android:textColor">@android:color/black</item>

    </style>

问题是在样式中我不能包含有关约束的数据,所以一旦我删除视图并创建一个新视图,这个视图就没有正确定位。此外,没有实现背景/文本颜色的效果......我只能通过 LayoutInflater 获得成功的结果......虽然我很想掌握这种方法......谢谢你的帮助!

【讨论】:

    猜你喜欢
    • 2019-03-25
    • 1970-01-01
    • 2023-01-23
    • 2016-07-05
    • 2015-12-22
    • 1970-01-01
    • 2021-03-31
    • 2015-07-26
    • 2013-08-22
    相关资源
    最近更新 更多