【问题标题】:create and use android drawable reference in your android theme在您的 android 主题中创建和使用 android drawable 引用
【发布时间】:2018-07-13 19:30:26
【问题描述】:

在我的样式中创建可绘制引用时遇到问题 我的 styles.xml 文件看起来像这样

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="myDark" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/lightColorPrimary</item>
    <item name="colorPrimaryDark">@color/lightColorPrimaryDark</item>
    <item name="colorAccent">@color/lightColorAccent</item>
    <item name="android:windowTitleSize">@dimen/titleSize</item>
    <item name="windowNoTitle">true</item>
    <item name="msgreceivedbg">@drawable/mrrd</item>
</style>
<style name="myLight" parent="Theme.AppCompat.DayNight.DarkActionBar">
    <item name="colorPrimary">@color/darkColorPrimary</item>
    <item name="colorPrimaryDark">@color/darkColorPrimaryDark</item>
    <item name="colorAccent">@color/darkColorAccent</item>
    <item name="android:windowTitleSize">@dimen/titleSize</item>
    <item name="windowNoTitle">true</item>
    <item name="msgreceivedbg">@drawable/mrrl</item>
</style>
</resources>

我的 attrs.xml 文件看起来像

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="msgreceivedbg" format="reference" />
</resources>

当我尝试在布局文件中使用此属性时,出现以下错误

--------- beginning of crash
07-13 08:48:08.893 9913-9913/com.messaging.chatify E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.messaging.chatify, PID: 9913
android.view.InflateException: Binary XML file line #10: Binary XML file line #10: Error inflating class <unknown>
Caused by: android.view.InflateException: Binary XML file line #10: Error inflating class <unknown>
Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Constructor.newInstance0(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:430)
    at android.view.LayoutInflater.createView(LayoutInflater.java:645)
    at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58)
    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:717)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:785)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:858)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:518)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
    at com.messaging.chatify.Adapters.MessagesAdapter.onCreateViewHolder(MessagesAdapter.java:125)
    at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6493)
    at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5680)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5563)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5559)
    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2229)
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1556)
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1516)
    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:608)
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3693)
    at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3410)
    at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3962)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.support.constraint.ConstraintLayout.onLayout(ConstraintLayout.java:1855)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at com.android.internal.policy.DecorView.onLayout(DecorView.java:726)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2346)
    07-13 08:48:08.894 9913-9913/com.messaging.chatify E/AndroidRuntime:     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2068)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6337)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
    at android.view.Choreographer.doCallbacks(Choreographer.java:686)
    at android.view.Choreographer.doFrame(Choreographer.java:621)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
 Caused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 13: TypedValue{t=0x2/d=0x7f040112 a=-1}
    at android.content.res.TypedArray.getDrawable(TypedArray.java:925)
    at android.view.View.<init>(View.java:4202)
    at android.widget.TextView.<init>(TextView.java:710)
    at android.widget.TextView.<init>(TextView.java:704)
    at android.widget.TextView.<init>(TextView.java:700)
        ... 66 more

我正在使用一个回收器视图,我将使用带有以下行的 textView 的视图膨胀到其中

android:background="?attr/msgreceivedbg"

可绘制的 mrrd 和 mrrl 只是有色差

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/darkColorPrimary" />
            <corners android:radius="5dp" />
        </shape>
    </item>
</selector>

两个可绘制对象只是在 android:color 属性上有所不同...

我正在android 7.1.1 genymotion 定制手机上测试它

布局文件是这样的

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp">

<TextView
    android:id="@+id/text_message_body6"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dp"
    android:background="?attr/msgreceivedbg"
    android:maxWidth="240dp"
    android:padding="8dp"
    android:text="hello, hello!"
    android:textColor="@android:color/white"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    tools:ignore="HardcodedText" />

<TextView
    android:id="@+id/text_message_time6"
    android:text="11:40"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="10sp"
    android:background="?attr/msgreceivedbg"
    android:textColor="@android:color/white"
    android:layout_marginStart="4dp"
    app:layout_constraintBottom_toBottomOf="@id/text_message_body6"
    app:layout_constraintLeft_toRightOf="@id/text_message_body6"
    tools:ignore="HardcodedText" />

</android.support.constraint.ConstraintLayout>

任何帮助将不胜感激...

【问题讨论】:

  • 你能发布你的布局xml文件吗?
  • 我已经用布局文件更新了帖子
  • 你能解释一下,你想在这里实现什么?您是否尝试在 recyclerview 中为您的 textviews 设置两种不同的背景样式?
  • 是的,你可以这么说,我只是想在主题改变时改变 textView 的背景......
  • 请将您的代码发布到您设置recyclerview适配器的位置

标签: android android-xml xml-drawable


【解决方案1】:

更新:

根据 cmets,这是更新后的答案。

在清单 xml 文件中,您必须使用与回收站视图相同的主题(除非您为回收站视图明确设置主题)

AndroidManifest.xml

 <activity   android:theme="@style/myDark" 
            android:name=".YOUR_ACTIVITY />

YOUR_ACTIVITY 是实现回收站视图的活动。

如果您为活动使用不同的主题,则必须在回收站视图中明确设置主题,如下所示,

<android.support.v7.widget.RecyclerView
        android:theme="@style/myDark"
        android:id="@+id/rv1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layoutManager="android.support.v7.widget.LinearLayoutManager">

    </android.support.v7.widget.RecyclerView>

【讨论】:

  • 我只想使用 xml drawable 来在主题更改时更新背景颜色...您的答案似乎不正确...
  • 您的错误是由于没有正确设置回收站视图,您必须为您的回收站视图设置布局管理器,而且只有当您将活动的主题更改为您的主题之一时才会生效主题
  • 这是我的回收站视图........
  • 我测试了你的文件并创建了我自己的回收站视图,如果你仍然遇到问题,你可以发布你设置 RecyclerView 的布局吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多