Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.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
Android 为什么';我的用户标识是否从适配器传输到消息传递活动?_Android - Fatal编程技术网

Android 为什么';我的用户标识是否从适配器传输到消息传递活动?

Android 为什么';我的用户标识是否从适配器传输到消息传递活动?,android,Android,我正在使用firebase在android studio中构建的应用程序中加入聊天功能。我一直在遵循一个指南,但是,我不断得到NullPointerException错误。这是因为我从我的用户适配器传递的意图没有传递额外的内容,甚至没有传递意图本身,你知道为什么会这样吗 我的代码没有为我的用户对象分配id。测试应用程序时,我单击一个用户,应用程序崩溃,因为没有分配他们的id 我对AS的了解还不足以确切地解释为什么会发生这种情况。它似乎发生在我的用户适配器和消息传递活动中 我根据用户列表中的位置分

我正在使用firebase在android studio中构建的应用程序中加入聊天功能。我一直在遵循一个指南,但是,我不断得到NullPointerException错误。这是因为我从我的用户适配器传递的意图没有传递额外的内容,甚至没有传递意图本身,你知道为什么会这样吗

我的代码没有为我的用户对象分配id。测试应用程序时,我单击一个用户,应用程序崩溃,因为没有分配他们的id

我对AS的了解还不足以确切地解释为什么会发生这种情况。它似乎发生在我的用户适配器和消息传递活动中

我根据用户列表中的位置分配了用户

final User user = mUsers.get(position);
然后将其设置为发送到我的消息传递活动

holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(mContext, ActualMessaging.class);
            intent.putExtra("userid,", user.getId());
            mContext.startActivity(intent);
        }
    });
一旦它出现,我想这是在引用我的useradapter活动中的代码

final String userid = intent.getStringExtra("userid");
然后我尝试获取特定的用户id,但是“userid”返回null

reference = FirebaseDatabase.getInstance().getReference("Users").child(userid);
如果有人能让我知道我做错了什么,那就太好了,我会把(我非常确定的是正确的代码位)放在下面

用户片段:

package com.example.testandroidapplication.Fragments;

import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.example.testandroidapplication.Adapter.UserAdapter;
import com.example.testandroidapplication.Model.User;
import com.example.testandroidapplication.R;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

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


public class UsersFragment extends Fragment {

    private RecyclerView recyclerView;

    private UserAdapter userAdapter;
    private List<User> mUsers;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_users, container, false);

        recyclerView = view.findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

        mUsers = new ArrayList<>();


        readUsers();

        return view;
    }

    private void readUsers() {
        final FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                mUsers.clear();
                for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                    User user = snapshot.getValue(User.class);

                    assert user != null;
                    assert firebaseUser != null;
                    if(!user.getId().equals(firebaseUser.getUid())){
                        mUsers.add(user);
                    }
                }

                userAdapter = new UserAdapter(getContext(), mUsers);
                recyclerView.setAdapter(userAdapter);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

}
实际消息:

package com.example.testandroidapplication;

import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.example.testandroidapplication.Adapter.MessageAdapter;
import com.example.testandroidapplication.Model.Chat;
import com.example.testandroidapplication.Model.User;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

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

import de.hdodenhof.circleimageview.CircleImageView;

import static com.google.android.gms.common.internal.safeparcel.SafeParcelable.NULL;

public class ActualMessaging extends AppCompatActivity {

    CircleImageView profile_image;
    TextView username;

    FirebaseUser fuser;
    DatabaseReference reference;

    ImageButton btn_send;
    EditText text_send;

    MessageAdapter messageAdapter;
    List<Chat> mchat;

    RecyclerView recyclerView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_actual_messaging);

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle("");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });

        recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());
        linearLayoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(linearLayoutManager);

        profile_image = findViewById(R.id.profile_image);
        username = findViewById(R.id.username);
        btn_send = findViewById(R.id.btn_send);
        text_send = findViewById(R.id.text_send);

        Intent intent = getIntent();

        final String userid = intent.getStringExtra("userid");

        fuser = FirebaseAuth.getInstance().getCurrentUser();

        btn_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String msg = text_send.getText().toString();
                if(!msg.equals("")){
                    sendMessage(fuser.getUid(), userid, msg);
                } else {
                    Toast.makeText(ActualMessaging.this, "You can't send empty message", Toast.LENGTH_SHORT).show();
                }
                text_send.setText("");
            }
        });

        fuser = FirebaseAuth.getInstance().getCurrentUser();
        reference = FirebaseDatabase.getInstance().getReference("Users").child(userid);

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                final User user = dataSnapshot.getValue(User.class);

                try {

                    username.setText(user.getUsername());

                    if (user.getImageURL().equals("default")) {
                        profile_image.setImageResource(R.mipmap.ic_launcher);
                    } else {
                        Glide.with(ActualMessaging.this).load(user.getImageURL()).into(profile_image);
                    }

                    readMessages(fuser.getUid(), userid, user.getImageURL());

                } catch (NullPointerException npe){
                    Toast.makeText(ActualMessaging.this, ("userid: " + userid + "username: " + username.toString()), Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

    private void sendMessage(String sender, String receiver, String message) {

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference();

        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("sender", sender);
        hashMap.put("receiver", receiver);
        hashMap.put("message", message);

        reference.child("Chats").push().setValue(hashMap);

    }
private void readMessages(final String myid, final String userid, final String imageurl){
    mchat = new ArrayList<>();

    reference = FirebaseDatabase.getInstance().getReference("Chats");
    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            mchat.clear();
            for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                Chat chat = snapshot.getValue(Chat.class);
                if(chat.getReceiver().equals(myid) && chat.getSender().equals(userid) ||
                        chat.getReceiver().equals(userid) && chat.getSender().equals(myid)) {
                    mchat.add(chat);
                }

                messageAdapter = new MessageAdapter(ActualMessaging.this, mchat, imageurl);
                recyclerView.setAdapter(messageAdapter);

            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

谢谢你的建议。

问题:这一行会使你的应用程序无法按预期工作

intent.putExtra("userid,", user.getId());
如您所见,您必须使用userid而不是userid,结尾加逗号

解决方案:将代码更改为

intent.putExtra("userid", user.getId());

问题:这一行使您的应用程序无法按预期工作

intent.putExtra("userid,", user.getId());
如您所见,您必须使用userid而不是userid,结尾加逗号

解决方案:将代码更改为

intent.putExtra("userid", user.getId());

我认为您可以首先检查userid是否为null,然后才应该传入child() 在您的情况下,问题是您传递的密钥不同,获取的密钥也不同,因此需要获取正确的密钥。 如果您正在传递密钥

intent.putExtra("userid,", user.getId());
取数键

String userid = intent.getStringExtra("userid,");
String userid = intent.getStringExtra(USERID);
或 也可以将键创建为常量

public static final USERID="userid"

intent.putExtra(USERID, user.getId());
取数键

String userid = intent.getStringExtra("userid,");
String userid = intent.getStringExtra(USERID);

这不会造成打字错误

我认为您可以先检查userid是否为null,然后才应该传入child() 在您的情况下,问题是您传递的密钥不同,获取的密钥也不同,因此需要获取正确的密钥。 如果您正在传递密钥

intent.putExtra("userid,", user.getId());
取数键

String userid = intent.getStringExtra("userid,");
String userid = intent.getStringExtra(USERID);
或 也可以将键创建为常量

public static final USERID="userid"

intent.putExtra(USERID, user.getId());
取数键

String userid = intent.getStringExtra("userid,");
String userid = intent.getStringExtra(USERID);

这不会造成打字错误

在我看来,“child()中的参数'pathString'不能传递null”的可能重复是非常清楚的。是的,这是显而易见的。我问的是为什么它不能获取用户id,而不是为什么我的代码不能工作。在我看来,“child()中的参数'pathString'不能传递null”的可能重复是非常清楚的。是的,这是显而易见的。我在问为什么它没有得到用户id,而不是为什么我的代码不起作用。谢谢,谢谢。真不敢相信事情竟那么简单。谢谢你抽出时间帮我检查。非常感谢。@C.Mac听到这个消息很高兴。快乐编码:)谢谢,谢谢,谢谢。真不敢相信事情竟那么简单。谢谢你抽出时间帮我检查。非常感谢。@C.Mac听到这个消息很高兴。Happy Codeing:)刚刚要实现它,以避免将来出现类似的错误。非常感谢您的光临!为了避免将来出现类似这样的错误,我们现在将实现它。非常感谢您的光临!