gpt4 book ai didi

android - 与 ApplicationContext 一起使用充气机时,不应用主题/样式

转载 作者:IT王子 更新时间:2023-10-28 23:54:27 25 4
gpt4 key购买 nike

我的主题将 TextView 的 textColor 指定为红色。

我正在使用 LayoutInflater 来实例化 TextView。问题是当使用 ApplicationContext 创建充气器时,样式不会应用于 TextView - 颜色不是红色。使用 Activity 创建 LayoutInflater 时一切正常。

为什么会发生这种情况,如何解决?

/res/values/styles.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyTheme">
<item name="android:textViewStyle">@style/MyTextView</item>
</style>

<style name="MyTextView" parent="@android:style/Widget.TextView">
<item name="android:textColor">#f00</item>
</style>
</resources>

AndroidManifest.xml:

<application 
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/MyTheme"
>

代码:

public class A extends Activity {

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

final LayoutInflater goodInflater = getInflater((Activity)this);
final LayoutInflater badInflater = getInflater(getApplicationContext());
final LinearLayout container = (LinearLayout)findViewById(R.id.container);

findViewById(R.id.add_with_appContext).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
add(container, badInflater); // Creates gray TextView
}
});

findViewById(R.id.add_with_activity).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
add(container, goodInflater); // Creates red TextView
}
});
}

private LayoutInflater getInflater(Context context) {
return (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

private void add(LinearLayout container, LayoutInflater inflater) {
inflater.inflate(R.layout.my_template, container, true);
}
}

/res/layout/test_a.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<Button
android:text="Add with AppContext"
android:id="@+id/add_with_appContext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

<Button
android:text="Add with Activity"
android:id="@+id/add_with_activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

<LinearLayout
android:id="@+id/container"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
/>

</LinearLayout>

/res/layout/my_template.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>

<TextView
android:id="@+id/text"
android:text="Some text..."
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>

</LinearLayout>

最佳答案

解决方案 #1

inflate 方法接受可选的“ViewGroup root”参数:

public View inflate (int resource, ViewGroup root, boolean attachToRoot)

如果我们有值作为“根”参数传递,那么我们可以使用它来获取“Activity 上下文”,从中我们可以获得正确的 LayoutInflater:

ViewGroup root > activity context > LayoutInflater

所以我的代码可能是:

private void add(LinearLayout container) {
LayoutInflater inflater = getInflater(container.getContext());
inflater.inflate(R.layout.my_template, container, true);
}

解决方案 #2

刚刚尝试以编程方式设置应用程序上下文主题,它有效:

getApplicationContext().setTheme(R.style.MyTheme);

我认为期待这个标记是合乎逻辑的:

<application 
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/MyTheme"
>

自动设置,但不会。

关于android - 与 ApplicationContext 一起使用充气机时,不应用主题/样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2118251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com