黑暗主题不适用于某些 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);
我有一个包含多个活动和片段的应用程序,其中有回收站视图。在我的一个片段上,回收站视图项目自动更改为深色主题,就像它们应该的那样。但是当在不同的 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);