来自 RecyclerView ViewHolder 的新 Activity 卡在黑屏上
New Activity from RecyclerView ViewHolder stuck on blackscreen
我正在尝试制作一个简单的应用程序,其中您在 RecyclerView 中有一个元素列表,如果您单击任何元素,您可以看到更多详细信息。我一直在研究如何从 RecyclerView 内部启动新的 activity。我已经尝试了很多在这里找到的解决方案,但没有一个有效。
我的新 Activity 永远不会启动(我从未在 GroupActivity 上看到 Toast 消息)并且应用程序卡在黑屏上,但侦听器正在被触发,因为我看到消息在 onClick 函数中。
我已经检查了我的新 activity 在 AndroidManifest.xml 中并且我在新 activity
上有 setContentView
我的新 Activity, GroupActivity.java:
public class GroupActivity extends AppCompatActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
setContentView(R.layout.activity_group);
Toast.makeText(this, "Started new activity", Toast.LENGTH_SHORT).show();
}
}
我的activity_group.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_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
android:background="@color/white">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello!"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
我的 RecyclerView 适配器,RecyclerAdapter.java:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private String data[];
private Context context;
public RecyclerAdapter(Context context, String[] data) {
this.data = data;
this.context = context;
}
@NonNull
@Override
public RecyclerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View view = layoutInflater.inflate(R.layout.custom_item, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerAdapter.ViewHolder holder, int position) {
holder.textView.setText(data[position]);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(this.context,"The Item Clicked is: " + getPosition(), Toast.LENGTH_SHORT).show();
Intent intent = new Intent(context, GroupActivity.class);
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return data.length;
}
public class ViewHolder extends RecyclerView.ViewHolder /*implements View.OnClickListener*/ {
// private final Context context;
TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textName);
context = itemView.getContext();
// itemView.setClickable(true);
// itemView.setOnClickListener(this);
}
/* @Override
public void onClick(View v) {
Toast.makeText(context,"The Item Clicked is: " + getPosition(),Toast.LENGTH_SHORT).show();
Intent intent = new Intent(context, GroupActivity.class);
context.startActivity(intent);
} */
}
}
正如您从注释行中看到的那样,我都尝试在 ViewHolder 和 onBindViewHolder 中添加一个 OnClickListener。有什么想法吗?
删除此行
context = itemView.getContext();
在 ViewHolder 中。因为当您需要意图时,您需要 activity 的上下文,而不是 itemView。
您似乎更改了主题。转到res-> values-> themes-> themes.xml
变化:
<style name="Theme.Practica1" parent="Theme.AppCompat.NoActionBar">
到
<style name="Theme.Practica1" parent="Theme.AppCompat.Light.NoActionBar">
那么你的群组Activity就会是白色的。
由于工具栏的原因,您需要将原色更改为另一种颜色,并且仅使用 1 个参数重写 onCreate 方法 (Bundle)
我正在尝试制作一个简单的应用程序,其中您在 RecyclerView 中有一个元素列表,如果您单击任何元素,您可以看到更多详细信息。我一直在研究如何从 RecyclerView 内部启动新的 activity。我已经尝试了很多在这里找到的解决方案,但没有一个有效。
我的新 Activity 永远不会启动(我从未在 GroupActivity 上看到 Toast 消息)并且应用程序卡在黑屏上,但侦听器正在被触发,因为我看到消息在 onClick 函数中。
我已经检查了我的新 activity 在 AndroidManifest.xml 中并且我在新 activity
上有 setContentView我的新 Activity, GroupActivity.java:
public class GroupActivity extends AppCompatActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
setContentView(R.layout.activity_group);
Toast.makeText(this, "Started new activity", Toast.LENGTH_SHORT).show();
}
}
我的activity_group.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_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
android:background="@color/white">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello!"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
我的 RecyclerView 适配器,RecyclerAdapter.java:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private String data[];
private Context context;
public RecyclerAdapter(Context context, String[] data) {
this.data = data;
this.context = context;
}
@NonNull
@Override
public RecyclerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View view = layoutInflater.inflate(R.layout.custom_item, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerAdapter.ViewHolder holder, int position) {
holder.textView.setText(data[position]);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(this.context,"The Item Clicked is: " + getPosition(), Toast.LENGTH_SHORT).show();
Intent intent = new Intent(context, GroupActivity.class);
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return data.length;
}
public class ViewHolder extends RecyclerView.ViewHolder /*implements View.OnClickListener*/ {
// private final Context context;
TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textName);
context = itemView.getContext();
// itemView.setClickable(true);
// itemView.setOnClickListener(this);
}
/* @Override
public void onClick(View v) {
Toast.makeText(context,"The Item Clicked is: " + getPosition(),Toast.LENGTH_SHORT).show();
Intent intent = new Intent(context, GroupActivity.class);
context.startActivity(intent);
} */
}
}
正如您从注释行中看到的那样,我都尝试在 ViewHolder 和 onBindViewHolder 中添加一个 OnClickListener。有什么想法吗?
删除此行
context = itemView.getContext();
在 ViewHolder 中。因为当您需要意图时,您需要 activity 的上下文,而不是 itemView。
您似乎更改了主题。转到res-> values-> themes-> themes.xml
变化:
<style name="Theme.Practica1" parent="Theme.AppCompat.NoActionBar">
到
<style name="Theme.Practica1" parent="Theme.AppCompat.Light.NoActionBar">
那么你的群组Activity就会是白色的。 由于工具栏的原因,您需要将原色更改为另一种颜色,并且仅使用 1 个参数重写 onCreate 方法 (Bundle)