Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:总是在intent中传递的额外对象中接收null对象_Java_Android_Android Intent_Android Activity_Android Recyclerview - Fatal编程技术网

Java Android:总是在intent中传递的额外对象中接收null对象

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

我正在我的应用程序中创建一个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语句的输出如下:

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传递额外信息。您可以选择任何一种方式。