【问题标题】:App crash when open a new recycler view with color from attr使用 attr 中的颜色打开新的回收站视图时应用程序崩溃
【发布时间】:2021-01-31 04:08:36
【问题描述】:

我有 2 个活动 MainActivity 显示一些书籍,ViewMoreActivity 显示更多书籍,MainActivity 完美打开,而 ViewMoreActivity 在打开时崩溃但是当我将 textColor 更改为 textView 表单 @ 987654327@ 到android:textColor="#000" ViewMoreActivity 完美运行,那么我该如何解决使用attr 的错误。

我遇到了错误

android.view.InflateException: Binary XML file line #27: Binary XML file line #27: Error inflating class android.widget.TextView
    Caused by: android.view.InflateException: Binary XML file line #27: Error inflating class android.widget.TextView
    Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
        at android.view.LayoutInflater.createView(LayoutInflater.java:658)
        at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:64)
        at com.android.internal.policy.HwPhoneLayoutInflater.onCreateView(HwPhoneLayoutInflater.java:105)
        at android.view.LayoutInflater.onCreateView(LayoutInflater.java:731)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:799)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:874)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:835)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
        at com.example.bookstore.BookAdapter.onCreateViewHolder(BookAdapter.java:34)
        at com.example.bookstore.BookAdapter.onCreateViewHolder(BookAdapter.java:19)
        at androidx.recyclerview.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:7078)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6235)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
        at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
        at androidx.recyclerview.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:561)
        at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
        at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
        at androidx.recyclerview.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:170)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
        at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3540)
        at android.view.View.measure(View.java:23454)
        at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:792)
        at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measure(BasicMeasure.java:480)
        at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measureChildren(BasicMeasure.java:134)
        at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.solverMeasure(BasicMeasure.java:277)
        at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:119)
        at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1578)
        at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1690)
        at android.view.View.measure(View.java:23454)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:146)
        at android.view.View.measure(View.java:23454)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1565)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:726)
        at android.view.View.measure(View.java:23454)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834)
2021-01-31 05:35:37.746 3442-3442/com.example.bookstore E/AndroidRuntime:     at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.view.View.measure(View.java:23454)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1565)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:726)
        at android.view.View.measure(View.java:23454)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at com.android.internal.policy.DecorView.onMeasure(DecorView.java:847)
        at android.view.View.measure(View.java:23454)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2954)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1753)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2041)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1636)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7946)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1092)
        at android.view.Choreographer.doCallbacks(Choreographer.java:893)
        at android.view.Choreographer.doFrame(Choreographer.java:812)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1078)
        at android.os.Handler.handleCallback(Handler.java:907)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:216)
        at android.app.ActivityThread.main(ActivityThread.java:7625)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
     Caused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 5: TypedValue{t=0x2/d=0x7f03031d a=-1}
        at android.content.res.TypedArray.getColorStateList(TypedArray.java:580)
        at android.widget.TextView.readTextAppearance(TextView.java:3747)
        at android.widget.TextView.<init>(TextView.java:1122)
        at android.widget.TextView.<init>(TextView.java:940)
        at android.widget.TextView.<init>(TextView.java:936)

textView在设计中recyclerView

<TextView
    android:id="@+id/TvBookName"
    android:layout_width="123dp"
    android:layout_height="wrap_content"
    android:text="@string/book_name"
    android:maxLines="2"
    android:textColor="#000"
    android:textSize="18sp"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@id/cardView" />

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    android:paddingTop="45dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:showIn="@layout/app_bar_main"
        android:orientation="vertical"
        android:background="?attr/background_lite2">

        <TextView
            android:id="@+id/TvTitle1"
            style="@style/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="@string/time"
            app:layout_constraintBottom_toTopOf="@id/recyclerView"
            app:layout_constraintHorizontal_bias="0.077"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="10" />

        <Button
            android:id="@+id/btn1"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:text="@string/more2"
            style="@style/viewMore"
            app:layout_constraintBottom_toTopOf="@id/recyclerView"
            app:layout_constraintHorizontal_bias="0.99"
            app:layout_constraintLeft_toRightOf="@id/TvTitle1"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.7" />

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/background_lite2"
            android:layout_marginTop="10dp"
            android:scrollbars="horizontal"
            android:scrollbarSize="0dp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/TvTitle1" />

        </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.core.widget.NestedScrollView>

MainActivity.java

package com.example.bookstore;

import android.content.Intent;
import android.os.Bundle;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;

import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.core.view.GravityCompat;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;

import com.google.android.material.navigation.NavigationView;

import androidx.drawerlayout.widget.DrawerLayout;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.view.Menu;
import android.widget.Button;
import android.widget.LinearLayout;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    private AppBarConfiguration mAppBarConfiguration;
    SharedPref sharedPref;
    RecyclerView recyclerView, recyclerView2, recyclerView3, recyclerView4;
    BookAdapter adapter, adapter2, adapter3, adapter4;
    Button arrow, arrow2, arrow3, arrow4;
    List<Book> bookList = new ArrayList<>();
    private BookAdapter.RecyclerViewClickListener listener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        sharedPref = new SharedPref(this);
        if(sharedPref.NightMode()) {
            setTheme(R.style.DarkTheme);
        }
        else  setTheme(R.style.AppTheme);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        toggle.syncState();

        NavigationView navigationView = findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        arrow = findViewById(R.id.btn1);
        arrow2 = findViewById(R.id.btn2);
        arrow3 = findViewById(R.id.btn3);
        arrow4 = findViewById(R.id.btn4);
        recyclerView = findViewById(R.id.recyclerView);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,false);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setHasFixedSize(true);
        adapter = new BookAdapter(bookList, MainActivity.this,listener);
        recyclerView.setAdapter(adapter);

        recyclerView2 = findViewById(R.id.recyclerView2);
        recyclerView3 = findViewById(R.id.recyclerView3);
        recyclerView4 = findViewById(R.id.recyclerView4);

        recyclerView2.setHasFixedSize(true);
        recyclerView3.setHasFixedSize(true);
        recyclerView4.setHasFixedSize(true);

        LinearLayoutManager linearLayoutManager2 = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,false);
        LinearLayoutManager linearLayoutManager3 = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,false);
        LinearLayoutManager linearLayoutManager4 = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,false);

        recyclerView2.setLayoutManager(linearLayoutManager2);
        recyclerView3.setLayoutManager(linearLayoutManager3);
        recyclerView4.setLayoutManager(linearLayoutManager4);
        setOnClicklistener();
        bookList.add(new Book("Java for Beginner2","To learn java language and programming essentials","120 LE",R.drawable.poster2));
        bookList.add(new Book("Java for Beginner","To learn java language and programming essentials","120 LE",R.drawable.poster2));
        bookList.add(new Book("Java for Beginner","To learn java language and programming essentials","120 LE",R.drawable.poster2));
        bookList.add(new Book("Java for Beginner","To learn java language and programming essentials","120 LE",R.drawable.poster2));
        bookList.add(new Book("Java for Beginner","To learn java language and programming essentials","120 LE",R.drawable.poster2));
        bookList.add(new Book("Java for Beginner","To learn java language and programming essentials","120 LE",R.drawable.poster2));

        arrow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(),ViewMoreActivity.class);
                startActivity(intent);
            }
        });
    }

    private void setOnClicklistener() {
        listener = new BookAdapter.RecyclerViewClickListener() {
            @Override
            public void onClick(View v, int position) {
                Intent intent = new Intent(getApplicationContext(), BookActivity.class);
                intent.putExtra("1",bookList.get(position).getName());
                startActivity(intent);
            }
        };
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        return true;
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
        int id = menuItem.getItemId();
        if (id ==R.id.nav_day){
            sharedPref.setNightModeState(false);
            restartApp();
        }
        else if (id ==R.id.nav_night){
            sharedPref.setNightModeState(true);
            restartApp();
        }

        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    public void restartApp() {
        Intent intent = getIntent();
        finish();
        startActivity(intent);
    }
}

view_more_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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="match_parent"
    tools:context=".ViewMoreActivity"
    android:background="?attr/background_lite2">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        android:theme="@style/AppTheme.AppBarOverlay"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/toolbar2"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

ViewMoreActivity.java

package com.example.bookstore;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.GridLayout;

import java.util.ArrayList;
import java.util.List;

public class ViewMoreActivity extends AppCompatActivity {

    RecyclerView recyclerView, recyclerView2, recyclerView3, recyclerView4;
    BookAdapter adapter, adapter2, adapter3, adapter4;
    List<Book> bookList2 = new ArrayList<>();
    private BookAdapter.RecyclerViewClickListener listener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        SharedPref sharedPref = new SharedPref(this);
        if(sharedPref.NightMode()) {
            setTheme(R.style.DarkTheme);
        }
        else  setTheme(R.style.AppTheme);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_more);

        Toolbar toolbar=findViewById(R.id.toolbar2);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);

        recyclerView = findViewById(R.id.recyclerView5);
        GridLayoutManager gridLayoutManager= new GridLayoutManager(this, 2);
        recyclerView.setLayoutManager(gridLayoutManager);
        recyclerView.setHasFixedSize(true);
        adapter = new BookAdapter(bookList2, getApplicationContext(),listener);
        recyclerView.setAdapter(adapter);
        setOnClicklistener();

        bookList2.add(new Book("Java for Beginner2","To learn java language and programming essentials","120 LE",R.drawable.poster2));
        bookList2.add(new Book("Java for Beginner","To learn java language and programming essentials","120 LE",R.drawable.poster2));
        bookList2.add(new Book("Java for Beginner","To learn java language and programming essentials","120 LE",R.drawable.poster2));
        bookList2.add(new Book("Java for Beginner","To learn java language and programming essentials","120 LE",R.drawable.poster2));
        bookList2.add(new Book("Java for Beginner","To learn java language and programming essentials","120 LE",R.drawable.poster2));
        bookList2.add(new Book("Java for Beginner","To learn java language and programming essentials","120 LE",R.drawable.poster2));
        bookList2.add(new Book("Java for Beginner","To learn java language and programming essentials","120 LE",R.drawable.poster2));


    }

   private void setOnClicklistener() {
        listener = new BookAdapter.RecyclerViewClickListener() {
            @Override
            public void onClick(View v, int position) {
                Intent intent = new Intent(getApplicationContext(), BookActivity.class);
                intent.putExtra("1",bookList2.get(position).getName());
                startActivity(intent);
            }
        };
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
    }

    @Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        return true;
    }
}

BookAdaper.java

package com.example.bookstore;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class BookAdapter extends RecyclerView.Adapter<BookAdapter.Holderview> {

    private List<Book> BookHolderList;
    private Context context;
    private RecyclerViewClickListener listener;

    public BookAdapter(List<Book> bookList, Context context, RecyclerViewClickListener listener) {
        this.BookHolderList = bookList;
        this.context = context;
        this.listener = listener;
    }

    @Override
    public Holderview onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.design_book, null);
        return new Holderview(view);
    }

    @Override
    public void onBindViewHolder(Holderview holder, final int position) {
        holder.txtName.setText(BookHolderList.get(position).getName());
        holder.txtPrice.setText(BookHolderList.get(position).getPrice());
        holder.imageView.setBackgroundResource(BookHolderList.get(position).getImage());


        //Animation code
        //holder.constraintLayout.setAnimation(AnimationUtils.loadAnimation(context,R.anim.fade_scale_animation));
    }

    @Override
    public int getItemCount() {
        return BookHolderList.size();
    }

    public interface RecyclerViewClickListener{
        void onClick(View v, int position);
    }
    public class Holderview extends RecyclerView.ViewHolder implements View.OnClickListener{

        TextView txtName, txtPrice;
        ImageView imageView;

        public Holderview(View itemView) {
            super(itemView);

            imageView = itemView.findViewById(R.id.imageView);
            txtName = itemView.findViewById(R.id.TvBookName);
            txtPrice = itemView.findViewById(R.id.TvBookPrice);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            listener.onClick(v, getAdapterPosition());
        }
    }
}

【问题讨论】:

  • 如果您在colors.xml 中定义了@color/text_color,您应该使用它

标签: android android-studio textview textcolor


【解决方案1】:

如果text_color 是您的colors.xml 的一部分,请尝试使用android:textColor = "@color/text_color" 而不是android:textColor="?attr/text_color

【讨论】:

  • 我知道,但我需要使用 attr.xml,因为我在应用程序中实现了明暗主题,所以我需要通过 attr.xml 更改颜色
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2021-11-27
相关资源
最近更新 更多