活动之间失去意图

oknwwptz  于 2021-07-08  发布在  Java
关注(0)|答案(3)|浏览(242)

我有一个问题,我失去了额外的活动之间。
我正在将一个chatobject从mainactivity回收视图发送到一个chatactivity,它工作正常。
然后,我将同一个chatobject从chatactivity发送到groupsettingsactivity,它也可以正常工作。
我的问题是,当我试图从groupsettingsactivity返回到topappbar home按钮的chatactivity时,我在试图从chatobject获取chatId时遇到了nullpointerexception。

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.shotgunnot/com.example.shotgunnot.ChatActivity}: 
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.shotgunnot.Chat.ChatObject.getChatId()' on a null object reference

我试过使用onresume和navutils,但我总是会遇到同样的错误,我想这是我生命周期中没有遇到的问题。机器人内置的后导航按钮工作正常。
这是我的主要活动recyclerview适配器

@Override
    public void onBindViewHolder(@NonNull final ChatListViewHolder holder, final int position) {
        ChatObject data = chatList.get(position);

        holder.mTitle.setText(data.getChatId());
        holder.mGroup.setText(data.getGroupId());

        System.out.println("GroupPic" + data.getGroupPic());
        Glide.with(context)
                .load(data.getGroupPic())
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .placeholder(R.drawable.ic_group_24dp)
                .apply(RequestOptions.circleCropTransform().circleCrop())
                .into(holder.mGroupPic);

        holder.mLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(v.getContext(), ChatActivity.class);
                intent.putExtra("chatObject", chatList.get(holder.getBindingAdapterPosition()));
                v.getContext().startActivity(intent);
            }
        });
    }

这是聊天活动

public class ChatActivity extends AppCompatActivity  {

    ChatObject mChatObject;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);

        Intent intent = getIntent(); >> 
        mChatObject = (ChatObject) intent.getSerializableExtra("chatObject");

        BottomAppBar bottomAppBar = findViewById(R.id.bottomAppBar);
        bottomAppBar.replaceMenu(R.menu.group_menu);
        bottomAppBar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.settings:
                        Intent intent = new Intent(ChatActivity.this, GroupSettingsActivity.class);
                        intent.putExtra("chatObject", mChatObject);
                        startActivity(intent);
                        return true;
                    case android.R.id.home:
                        Intent home = new Intent(getApplicationContext(), MainPageActivity.class);
                        startActivity(home);
                }
                return false;
            }
        });

    }

    @Override
    protected void onResume() {
        super.onResume();

        Intent intent = getIntent();
        mChatObject = (ChatObject) intent.getSerializableExtra("chatObject");

    }

}

最后是分组活动

public class GroupSettingsActivity extends AppCompatActivity {
    ChatObject mChatObject;

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

        Intent intent = getIntent(); 

        mChatObject = (ChatObject) intent.getSerializableExtra("chatObject");
        chatId = mChatObject.getChatId();

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            case android.R.id.home:
                Intent intent = new Intent(this, ChatActivity.class);
                intent.putExtra("chatObject", mChatObject);
                startActivity(intent);
                //NavUtils.navigateUpFromSameTask(this);
                finish();
            default:
                return super.onOptionsItemSelected(item);
        }
    }

任何帮助都将不胜感激。

ezykj2lf

ezykj2lf1#

基于这个答案,我找到了一个使用sharedprefers的解决方法:如何在android上保存/存储sharedpreferences中的对象?
保存首选项

@Override
    protected void onPause() {
        super.onPause();
        SharedPreferences.Editor prefsEditor = mPrefs.edit();
        Gson gson = new Gson();
        String json = gson.toJson(mChatObject);
        prefsEditor.putString("mChatObject", json);
        prefsEditor.commit();
    }

并在oncreate中检索它们

mChatObject = (ChatObject) intent.getSerializableExtra("chatObject");
        if(mChatObject != null){
            chatId = mChatObject.getChatId();
            groupId = mChatObject.getGroupId();
            groupPic = mChatObject.getGroupPic();
        }else{
            Gson gson = new Gson();
            String json = mPrefs.getString("mChatObject", "");
            mChatObject = (ChatObject) gson.fromJson(json, ChatObject.class);
            chatId = mChatObject.getChatId();
            groupId = mChatObject.getGroupId();
            groupPic = mChatObject.getGroupPic();
        }

不过,这感觉有点像黑客,所以如果有人有更好的解决方案那就太好了。
谢谢

pxyaymoc

pxyaymoc2#

在使用第二个活动之前,应该检查到达该活动的值是否与null不同。尝试执行以下操作并设置断点以调试第二个活动中出现的内容:
第一项活动:

Intent i = new Intent(getApplicationContext(), NewActivity.class);
i.putExtra("user_id", "1234");
i.putExtra("user_name", "John Doe");

startActivity(i);

第二项活动:

Bundle extras = getIntent().getExtras();

if (extras != null) {
    Integer id= extras.getInt("user_id");
    String username= extras.getString("user_name");
}
dced5bon

dced5bon3#

在开始之前尝试添加这些标志 ChatActivity ,以清除堆栈并确保正在创建新的 ChatActivity 而不是重建一个旧的: intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

相关问题