Java Android:总是在intent中传递的额外对象中接收null对象
我正在我的应用程序中创建一个recycler视图,并从firestore获取相同的数据。在此过程中,我将向intent传递一些参数,单击recycler视图中的项目时将调用intent RecyclerView RecyclerView=findViewByIdR.id.my\u recycler\u视图; recyclerView.setHasFixedSizetrue; recyclerView.SetLayoutManagerNewLinearLayoutManagerThis; recyclerView.setAdapteradapter; adapter.SetOnItemClickListener新建学习模块adapter.OnItemClickListener{ @凌驾 public void/mclickDocumentSnapshot文档快照,int位置{ LearningModule LearningModule=documentSnapshot.toObjectLearningModule.class; 字符串id=documentSnapshot.getId; 字符串路径=documentSnapshot.getReference.getPath; String title=String documentSnapshot.gettitle; System.out.println我从文档快照中得到了什么?id:+id+path:+path+title:+title; 意向意向=新意向学习。此,学习\u content.class; 意图.头衔,头衔; 星状体; } }; 上述代码中的print语句的输出如下:Java Android:总是在intent中传递的额外对象中接收null对象,java,android,android-intent,android-activity,android-recyclerview,Java,Android,Android Intent,Android Activity,Android Recyclerview,我正在我的应用程序中创建一个recycler视图,并从firestore获取相同的数据。在此过程中,我将向intent传递一些参数,单击recycler视图中的项目时将调用intent RecyclerView RecyclerView=findViewByIdR.id.my\u recycler\u视图; recyclerView.setHasFixedSizetrue; recyclerView.SetLayoutManagerNewLinearLayoutManagerThis; recy
what did i get from document snapshot? id: EsHW9FGjVe8A3pG4 path:LearningModules/EsHW9FGjVe8A3pG4 title:Front Load vs Top Load
被调用活动的onClick方法如下所示:
@凌驾
受保护的void onCreateBundle savedInstanceState{
super.onCreatesavedInstanceState;
setContentViewR.layout.content\u learn\u view\u pager;
viewPager=findviewbydr.id.pager;
progressBar=findViewByIdR.id.progressBarViewPager;
捆绑附加;
extras=getIntent.getExtras;
System.out.PRINTLN从第一个+extras.getStringtitle中捕获;
但是,这段代码会为print语句抛出一个错误NullPointerException
我哪里做错了
附加代码:
适配器
试试这个:
Intent i = getIntent()
if (i == null)
Log.d("***DEBUG****", "Intent was null");
else
Log.d("**** DEBUG ***", "Intent OK");
String title= i.getStringExtra("title"); //Exception points to this line
Log.d("*** DEBUG", rec + " " + title);
另外,在itemview中单击“您未传递标题”,请参见下文
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("The click was captured");
int position = getAdapterPosition();
if(position!=RecyclerView.NO_POSITION && null!=listener){
listener.onItemClick(getSnapshots().getSnapshot(position),position);
}
Intent intent = new Intent(view.getContext(),
learn_content.class);
intent.putExtra("title",title); //This one
view.getContext().startActivity(intent);
}
});
您两次调用startActivity导致问题
选项-1:尝试删除内部itemView.setOnClickListener,如下所示:
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("The click was captured");
int position = getAdapterPosition();
if(position!=RecyclerView.NO_POSITION && null!=listener){
listener.onItemClick(getSnapshots().getSnapshot(position),position);
}
//Intent intent = new Intent(view.getContext(), learn_content.class);
//view.getContext().startActivity(intent);
}
});
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("The click was captured");
int position = getAdapterPosition();
/*if(position!=RecyclerView.NO_POSITION && null!=listener){
listener.onItemClick(getSnapshots().getSnapshot(position),position);
}*/
Intent intent = new Intent(view.getContext(), learn_content.class);
DocumentSnapshot documentSnapshot = getSnapshots().getSnapshot(position);
String title = (String) documentSnapshot.get("title");
intent.putExtra("title",title);
view.getContext().startActivity(intent);
}
});
选项-2:尝试在itemView.setOnClickListener内启动活动,并删除与OnItemClickListener相关的代码,如下所示:
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("The click was captured");
int position = getAdapterPosition();
if(position!=RecyclerView.NO_POSITION && null!=listener){
listener.onItemClick(getSnapshots().getSnapshot(position),position);
}
//Intent intent = new Intent(view.getContext(), learn_content.class);
//view.getContext().startActivity(intent);
}
});
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("The click was captured");
int position = getAdapterPosition();
/*if(position!=RecyclerView.NO_POSITION && null!=listener){
listener.onItemClick(getSnapshots().getSnapshot(position),position);
}*/
Intent intent = new Intent(view.getContext(), learn_content.class);
DocumentSnapshot documentSnapshot = getSnapshots().getSnapshot(position);
String title = (String) documentSnapshot.get("title");
intent.putExtra("title",title);
view.getContext().startActivity(intent);
}
});
我的另一种解决方案是:不要将click listener放在LearningModuleViewHolder类的onCreateViewHolder中,因此现在视图将不会为null。我将尝试在此处添加代码:
@NonNull
@Override
public LearningModuleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false);
LearningModuleViewHolder holder = new LearningModuleViewHolder(v);
v.setOnClickListener(v -> {
System.out.println("The click was captured");
Intent intent = new Intent(parent.getContext(), learn_content.class);
parent.getContext().startActivity(intent);
});
return holder;
}
您是否也可以发布适配器和活动代码stacktrace@haresh添加了适配器和堆栈跟踪。我不太明白您希望在“活动”中看到更多内容。@fireball.1在String title=String documentSnapshot.gettitle处放置一个log语句;他使用Bundle而不是意图获取Stringextras,但没有getStringExtra方法@fireball.1为什么在活动中使用两次单击侦听器一次在适配器内部,一次在活动中?在适配器内部,您应该在itemview click中设置侦听器listener@fireball.1,检查solution@Asaduzzaman我在这里使用了2个onClickListeners。我应该删除一个吗?如果我删除了主要活动中的一个,我如何从数据中获取标题然后将其传递给新的intent?或者我应该删除其中一个startActivity调用并让两个单击侦听器都使用吗?您必须同时使用两个ClickListener。您只需要从适配器中删除startActivity,因为您已经在活动中处理了它。或者,如果您想在适配器中处理它,则无需使用OnItemClickListener和您必须从适配器向intent传递额外信息。您可以选择任何一种方式。