黑暗主题不适用于某些 recyclerview 项目

Dark Theme not applying in some recyclerview items

我有一个包含多个活动和片段的应用程序,其中有回收站视图。在我的一个片段上,回收站视图项目自动更改为深色主题,就像它们应该的那样。但是当在不同的 activity 上使用完全相同的适配器 class 和完全相同的项目布局时,它不再应用深色主题。

项目布局:

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

        <androidx.cardview.widget.CardView
            android:id="@+id/crv_anime"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:clickable="true"
            android:foreground="?android:attr/selectableItemBackground"
            android:clipToPadding="false"
            android:layout_marginBottom="14dp"
            app:cardCornerRadius="10dp"
            android:layout_marginTop="28dp"
            app:cardElevation="10dp"
            android:layout_centerHorizontal="true">

            <RelativeLayout
                android:layout_width="550px"
                android:layout_height="wrap_content">

                <ImageView
                    android:id="@+id/img_anime_cover"
                    android:layout_width="550px"
                    android:layout_height="777px"
                    android:layout_centerHorizontal="true"/>

                <TextView
                    android:id="@+id/lbl_anime_title"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/img_anime_cover"
                    android:layout_marginBottom="10dp"
                    android:layout_marginTop="10dp"
                    android:textAlignment="center"
                    android:fontFamily="@font/segoeb"
                    android:paddingLeft="5dp"
                    android:paddingRight="5dp"
                    android:textSize="16sp"/>

            </RelativeLayout>
        </androidx.cardview.widget.CardView>
</RelativeLayout>

适配器Class:

package com.animewatcher.animewatcher;

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;

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

public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.ViewHolder> {

    List<anime_class> mAnime;
    Context mContext;
    LayoutInflater inflater;

    public RecycleAdapter(Context context, List<anime_class> anime){
        this.mAnime = anime;
        this.inflater = LayoutInflater.from(context);
        this.mContext = context;
    }

    @NonNull
    @Override
    public RecycleAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.grid_layout, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RecycleAdapter.ViewHolder holder, int position) {
            holder.title.setText(capitalizeLetters(mAnime.get(position).getmNameEN()));
            Glide.with(mContext).load(mAnime.get(position).getmThumbnail()).into(holder.thumbnail);

            holder.crv_.setOnClickListener(
                    new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Intent i = new Intent(mContext, anime_page.class);
                            i.putExtra("mNameEN", mAnime.get(position).getmNameEN());
                            i.putExtra("mThumbnail", mAnime.get(position).getmThumbnail());
                            mContext.startActivity(i);
                        }
                    }
            );
    }

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

    public static class ViewHolder extends RecyclerView.ViewHolder{
        TextView title;
        ImageView thumbnail;
        CardView crv_;

        public ViewHolder(@NonNull View itemView){
            super(itemView);
            title = itemView.findViewById(R.id.lbl_anime_title);
            thumbnail = itemView.findViewById(R.id.img_anime_cover);
            crv_ = itemView.findViewById(R.id.crv_anime);
        }
    }

    private String capitalizeLetters(String str)
    {
        String[] strArray = str.split(" ");
        StringBuilder builder = new StringBuilder();
        for (String s : strArray) {
            String cap = s.substring(0, 1).toUpperCase() + s.substring(1);
            builder.append(cap + " ");
        }

        return builder.toString();
    }
}

片段代码(暗色主题起作用的地方):

if (getActivity()!=null) {
                        if(getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
                            adapter = new RecycleAdapter(getActivity(), animes);
                            GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 3, GridLayoutManager.VERTICAL, false);
                            animeList.setLayoutManager(gridLayoutManager);
                            animeList.setAdapter(adapter);
                        }
                        else
                        {
                            adapter = new RecycleAdapter(getActivity(), animes);
                            GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 2, GridLayoutManager.VERTICAL, false);
                            animeList.setLayoutManager(gridLayoutManager);
                            animeList.setAdapter(adapter);
                        }
                    }

Activity 代码(深色主题不起作用):

if (getApplication()!=null) {
                            if(getApplicationContext().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
                                adapter = new RecycleAdapter(getApplicationContext(), animes);
                                GridLayoutManager gridLayoutManager = new GridLayoutManager(getApplicationContext(), 3, GridLayoutManager.VERTICAL, false);
                                animeList.setLayoutManager(gridLayoutManager);
                                animeList.setAdapter(adapter);
                            }
                            else
                            {
                                adapter = new RecycleAdapter(getApplicationContext(), animes);
                                GridLayoutManager gridLayoutManager = new GridLayoutManager(getApplicationContext(), 2, GridLayoutManager.VERTICAL, false);
                                animeList.setLayoutManager(gridLayoutManager);
                                animeList.setAdapter(adapter);
                            }
                        }

Image of the dark theme correctly applied Image of the item not applying dark theme

可能的解决方案:

1- 检查应用到 activity 的主题,该主题未在深色模式下显示项目。 2- 检查您是否在 activity 主布局或 recyclerview 中将背景颜色设置为白色。

您的代码似乎没问题。

我想我遇到了你的问题。在提供的第二个代码中(未应用深色主题),您使用的 getApplicationContext() 不是 Activity 上下文感知的,因此主题未正确应用。像第一个代码一样使用 Activity 上下文(getActivity() 如果在片段内部,或者 Activity.this 如果在 Activity 内部)。

adapter = new RecycleAdapter(getActivity(), animes);
GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 3, GridLayoutManager.VERTICAL, false);