gpt4 book ai didi

android - 将 标签与 ?attr/myAttr 一起使用

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:05:08 34 4
gpt4 key购买 nike

我正在尝试根据父 Theme 在我的 View 中包含不同的布局。

按照思路:

attrs.xml

<attr name="themeLayout" format="reference" />

styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="themeLayout">@layout/layout_a</item>
</style>

<style name="AppThemeSecond" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="themeLayout">@layout/layout_b</item>
</style>

activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<include layout="?attr/themeLayout" />

</RelativeLayout>

当我运行上面的代码时,我会得到以下异常:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.package/com.my.package.MainActivity}: android.view.InflateException: You must specifiy a valid layout reference. The layout ID ?attr/themeLayout is not valid.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: android.view.InflateException: You must specifiy a valid layout reference. The layout ID ?attr/themeLayout is not valid.
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:866)

我做错了什么?有可能做到这一点吗?

注意 #1:我将 MainActivityTheme 设置为 android:theme="@style/AppTheme"

注意 #2:在布局编辑器的设计 View 中,一切都按预期进行。如果我切换主题,包含会正确更新。
另请参阅以下屏幕截图:

preview design tab android studio

最佳答案

不幸的是,这是不可能的,但我真的很喜欢这个主意。我跟踪了 LayoutInflater 的流程,它要求 layout 属性为 TypedValue.TYPE_REFERENCE这意味着 ?attr 是不允许的。他们甚至在方法中留下了评论来解释。

public int getAttributeResourceValue(int idx, int defaultValue) {
int t = nativeGetAttributeDataType(mParseState, idx);
// Note: don't attempt to convert any other types, because
// we want to count on aapt doing the conversion for us.
if (t == TypedValue.TYPE_REFERENCE) {
return nativeGetAttributeData(mParseState, idx);
}
return defaultValue;
}

android.content.res.XmlBlock.java:385

基本上您没有做错任何事情——预览版中的通货膨胀工作方式不同,这导致了困惑。

关于android - 将 <include> 标签与 ?attr/myAttr 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30259435/

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