Android无法使用attrs值对布局文件进行充气

Shantanu Shady:

我正在开发一个可以在夜间模式和白天模式之间切换的应用程序,我使用这些值制作了一个attrs文件

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="ds" >

        <attr name="backgroundcolor" format="color"/>
        <attr name="cardbackground" format="color"/>
        <attr name="textcolor" format="color"/>
        <attr name="tintcolor" format="color"/>
        <attr name="buttoncolor" format="color"/>

    </declare-styleable>

</resources>

和我分别做了对应的两种样式,分别是白天模式和夜间模式

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- Base application theme. -->
    <!-- Light Mode -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">#2196F3</item>
        <item name="colorPrimaryDark">#1976D2</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="backgroundcolor">#fcfcfc</item>
        <item name="cardbackground">#ffffff</item>
        <item name="textcolor">#808080</item>
        <item name="tintcolor">#000000</item>
        <item name="buttoncolor">#2196F3</item>
    </style>

    <!-- Dark Mode -->
    <style name="darktheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">#212121</item>
        <item name="colorPrimaryDark">#000000</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="backgroundcolor">#303030</item>
        <item name="cardbackground">#424242</item>
        <item name="textcolor">#FFFFFF</item>
        <item name="tintcolor">#FFFFFF</item>
        <item name="buttoncolor">#2196F3</item>
    </style>

</resources>

我将attrs添加到布局中以代替backgroundtextColor属性,因此我可以在它们之间进行切换

这是布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:minHeight="500dp"
    android:layout_margin="5dp"
    android:layout_height="match_parent"
    android:background="?attr/backgroundcolor">

    <android.support.v7.widget.CardView
        android:id="@+id/card_view"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="5dp"
        card_view:cardCornerRadius="7dp"
        card_view:contentPadding="10dp"
        android:background="?attr/cardbackground">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:background="?attr/backgroundcolor">
            <ImageView
                android:id="@+id/imageView"
                android:layout_width="match_parent"
                android:layout_height="200dp"
                android:src="@drawable/images"
                android:scaleType="centerCrop"/>

            <TextView
                android:id="@+id/header"
                android:layout_width="wrap_content"
                android:padding="2dp"
                android:text="Hello"
                android:textColor="?attr/textcolor"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:textSize="18sp"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/mNews"
                android:layout_width="wrap_content"
                android:padding="2dp"
                android:layout_height="wrap_content"
                android:text="Asam"
                android:layout_marginTop="10dp"
                android:textSize="16sp"
                android:textStyle="italic"
                android:textColor="?attr/textcolor"/>
        </LinearLayout>
    </android.support.v7.widget.CardView>
</LinearLayout>

我正在实现一个ViewPager,我在其中放大该布局文件,以前没有实现attrs,它工作正常,但是当我现在在布局xml文件中使用attrs值时,它使应用程序崩溃

这是Viewpager Adapter,我在其中放大布局文件

    public class HorizontalPagerAdapter extends PagerAdapter {
    String mResources[] = {"spider man description", "Iron man description", "batman description", "superman description"};
    String mHeader[] = {"Spider-Man", "Iron Man", "BatMan", "Super Man"};
    int mImages[] = {R.drawable.images, R.drawable.ironman, R.drawable.batman, R.drawable.super_man};

    Context mContext;
    LayoutInflater mLayoutInflater;

    public HorizontalPagerAdapter(Context context) {
        mContext = context;
        mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return mResources.length;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == ((LinearLayout) object);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        View itemView = mLayoutInflater.inflate(R.layout.content_main, container, false);

        TextView newsHeader = (TextView) itemView.findViewById(R.id.header);
        TextView newsContent = (TextView) itemView.findViewById(R.id.mNews) ;
        ImageView imageView = (ImageView) itemView.findViewById(R.id.imageView);

        newsHeader.setText(mHeader[position]);
        newsContent.setText(mResources[position]);
        imageView.setImageResource(mImages[position]);

        container.addView(itemView);

        return itemView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((LinearLayout) object);
    }
}

因此,当运行该应用程序时,它给了我这个错误

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.slimshady.newsreaderfinal, PID: 5440
    android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class <unknown>
    Caused by: android.view.InflateException: Binary XML file line #2: 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:334)
        at android.view.LayoutInflater.createView(LayoutInflater.java:647)
        at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58)
        at android.view.LayoutInflater.onCreateView(LayoutInflater.java:720)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:788)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at com.example.slimshady.newsreaderfinal.HorizontalPagerAdapter.instantiateItem(HorizontalPagerAdapter.java:40)
        at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:1010)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:1158)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:1092)
        at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1622)
        at android.view.View.measure(View.java:22071)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
        at android.view.View.measure(View.java:22071)
        at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1119)
        at android.view.View.measure(View.java:22071)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
        at android.view.View.measure(View.java:22071)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
        at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:401)
        at android.view.View.measure(View.java:22071)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.view.View.measure(View.java:22071)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
        at android.view.View.measure(View.java:22071)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at com.android.internal.policy.DecorView.onMeasure(DecorView.java:724)
        at android.view.View.measure(View.java:22071)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2422)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1504)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1761)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1392)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6752)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
        at android.view.Choreographer.doCallbacks(Choreographer.java:723)
        at android.view.Choreographer.doFrame(Choreographer.java:658)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 13: TypedValue{t=0x2/d=0x7f030036 a=-1}
        at android.content.res.TypedArray.getDrawableForDensity(TypedArray.java:944)
        at android.content.res.TypedArray.getDrawable(TypedArray.java:928)
        at android.view.View.<init>(View.java:4768)
        at android.view.ViewGroup.<init>(ViewGroup.java:597)
        at android.widget.LinearLayout.<init>(LinearLayout.java:234)
        at android.widget.LinearLayout.<init>(LinearLayout.java:230)
        at android.widget.LinearLayout.<init>(LinearLayout.java:226)
            ... 55 more
Application terminated.

我在这里做错了什么?无法在线找到合适的解决方案,所以我正在创建此线程。

迈克·M:

当充气Views时,相关的属性和值从被拉ThemeContext使用的LayoutInflater在这种情况下,很明显,Context传递给的消息上HorizontalPagerAdapter没有正确ThemeFailed to resolve attribute消息,如消息所示。

当应用程序Context用于创建UI组件时,通常会发生这种情况默认情况下,即使清单中的元素指定为,该应用程序Context实际上也未Theme附加任何附件这只是用来设置默认值android:theme<application>ThemeActivity

通常,您只想将电流Activity用作与之相关Context的任何东西View,实际上,这就是这里的解决方案。Activity都会有相应的Theme连接,然后你的自定义属性会膨胀在这些网页时,正确解决Adapter

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用固定的宽高比视图对展开的视图进行充气

使用充气城堡在Java中加密xml文件的示例

在RecyclerView VS中使用“物品装饰”来编辑单个充气布局有什么意义?

Android Studio无法将xml文件标识为布局文件

Android DataBinding和MVVM-对不同布局文件夹中的布局文件使用相同的名称

使用充气城堡解析ASN文件

我无法使用颜色值设置布局的背景

无法在Unity中使用本机android模块(AAR文件)进行广播

如何在android片段中保存多个充气布局视图状态?

无法使布局充气机工作

使用布局充气器实现一系列复选框

Android:如何使用不同的字符串值文件填充布局?

Android在ListView行中充气新布局

Android无法获取布局

Android简单充气修正

以编程方式为Android布局充气

在片段中使用cardView时,布局充气机会发生错误吗?

在布局文件中对MapView进行充气时出错

使用布局充气机创建自定义菜单,如何引用每个组件?

使用“ include”标签,为父级布局引用的布局进行充气

无法使用Android版式充气机?

无法在Android中为CollapsingToolbarLayout充气

Android布局无法居中

无法为xml充气android.content.res.Resources $ NotFoundException

android:在java文件中使用权重到textviews进行线性布局

无法给菜单充气

无法理解布局充气机?它有什么作用?为什么我们使用它?

无法以编程方式更改 android 布局文件元素的值

无法使用空值进行查询