【问题标题】:Activity does not even call onActivityResultActivity 甚至不调用 onActivityResult
【发布时间】:2023-03-25 15:27:02
【问题描述】:

我知道,我看过重复的。但他们都没有解决我的问题。

我希望我的代码从 EditMessage 活动中获取 newMessage 并将其传递给 SendMessage 活动,并且我知道我可能不需要使用 onActivityResult 很难我仍然想了解这里的问题。

我已经添加了日志消息来检查我的问题出在哪里,但它甚至没有在 onActivityResult 中运行我的日志。

代码如下:

EditMessageActivity:

public static final String MESSAGE = "message";

EditText currentTextEditText;
Button sendButton;
Button saveButton;
Button cancelButton;
Button concatenateButton;

private String message;

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

    message = getIntent().getStringExtra(SendMessageActivity.MESSAGE);

    currentTextEditText = (EditText) findViewById(R.id.currentText_EditText);
    sendButton = (Button) findViewById(R.id.sendButton);
    saveButton = (Button) findViewById(R.id.saveButton);
    cancelButton = (Button) findViewById(R.id.cancelButton);
    concatenateButton = (Button) findViewById(R.id.concatenateButton);

    if (message != null) //Activity may be started via "edit" Button
        currentTextEditText.setText(message);

    currentTextEditText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            message = currentTextEditText.getText().toString();
        }

        @Override
        public void afterTextChanged(Editable s) {
            message = currentTextEditText.getText().toString();
        }
    });

    concatenateButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final String[] messages = getResources().getStringArray(R.array.messages_array);

            AlertDialog.Builder builder = new AlertDialog.Builder(EditMessage.this);
            builder.setTitle("Sonuna Ekle").setItems(messages, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    char lastChar = message.charAt(message.length() - 1);
                    String messageToAdd = messages[which];
                    if (lastChar == '!' || lastChar == '?' || lastChar == '.') {
                        message += " " + messageToAdd;
                    } else {
                        message += " " + messageToAdd.toLowerCase();
                    }
                    currentTextEditText.setText(message);
                    dialog.cancel();
                }
            });
            builder.setCancelable(true);
            AlertDialog alertDialog = builder.create();
            alertDialog.show();
        }
    });

    sendButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(EditMessage.this, NumberSelectActivity.class);
            intent.putExtra(MESSAGE, message);
            startActivity(intent);
            finish();
        }
    });

    saveButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.i("Custom", "Save buttn clicked");
            Intent intent = new Intent(EditMessage.this, SendMessageActivity.class);
            intent.putExtra(MESSAGE, message);
            setResult(RESULT_OK);
            startActivityForResult(intent, SendMessageActivity.REQUEST_NEW_MESSAGE);
            finish();
            Log.i("Custom", "Custom Message created :" + message);
        }
    });

    cancelButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });

}

SendMessageActivity:

public static final String MESSAGE = "message";
public static final int REQUEST_NEW_MESSAGE = 1001;

private static String message;

ListView messageListView;
Button createMessage;

ArrayList<String> messageList = new ArrayList<>();

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

    //Retrive Pre-Defined Messages
    //TODO Add in-app message defining
    String[] dbMessages = getResources().getStringArray(R.array.messages_array);

    for (int i = 0; i < dbMessages.length; i++) {
        messageList.add(dbMessages[i]);
    }

    //Create the array adapter
    //TODO Upgrade this to a custom adapter which will also show an small image related to the message
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, android.R.id.text1, messageList);

    createMessage = (Button) findViewById(R.id.createMessageBtn);
    createMessage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startEditMessage("");
        }
    });

    messageListView = (ListView) findViewById(R.id.messagesListView);
    messageListView.setAdapter(adapter);

    //Make this one clickable
    messageListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            message = messageList.get(position);

            AlertDialog.Builder builder = new AlertDialog.Builder(SendMessageActivity.this);
            builder.setTitle("Send Message");
            builder.setMessage(message);
            builder.setPositiveButton("Gönder", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Intent intent = new Intent(SendMessageActivity.this, NumberSelectActivity.class);
                    intent.putExtra(MESSAGE, message);
                    startActivity(intent);
                }
            });
            builder.setNeutralButton("Düzenle", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //TODO Create new activity to edit message and send it or just cancel it
                    //Todo and return back
                    startEditMessage(message);
                }
            });
            builder.setNegativeButton("İptal", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });

            builder.setCancelable(true);
            AlertDialog alertDialog = builder.create();
            alertDialog.show();
        }
    });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.i("Custom", "Result OK değil :" + message);
    if (resultCode == RESULT_OK) {
        Log.i("Custom","Result OK:" + message);
        if (requestCode == REQUEST_NEW_MESSAGE) {
            Log.i("Custom","request is ok :" + message);
            String newMessage = getIntent().getStringExtra(EditMessage.MESSAGE);
            if (newMessage != null) {
                Log.i("Custom","Message is not null  :" + message);
                messageList.add(newMessage);

                //TODO Create new method to load all messages from database and just call that method
                ArrayAdapter<String> updatedAdapter = new ArrayAdapter<>(this,
                        android.R.layout.simple_list_item_1, android.R.id.text1, messageList);
                messageListView.setAdapter(updatedAdapter);

                Log.i("Custom", "Updated adapter :" + message);
            }

        }
    }
}

public void startEditMessage(String message) {
    Intent intent = new Intent(SendMessageActivity.this, EditMessage.class);
    intent.putExtra(MESSAGE, message);
    startActivity(intent);
}

如有任何帮助,将不胜感激。谢谢。

【问题讨论】:

  • 尝试像EditMessageActivity.this.startActivityForResult()一样使用,我认为它会起作用。
  • 这里你的startingActivity是EditMessageActivity,所以你只会在EditMessageActivity中收到结果回调。
  • 我认为您对 ActivityResult 的理解可能是错误的。如果你从EditMessageActivity 调用startActivityResult(),你会得到EditMessageActivity 而不是SendMessageActivity 的结果
  • @bhaveshkaila 我猜ᖷAЯAƸ 的答案是解决方案。 Febi Mathew,你们俩都是对的,我对这个话题有点迷茫,但现在我明白了。谢谢大家。

标签: java android android-intent onactivityresult


【解决方案1】:

我希望我的代码从 EditMessage 活动中获取 newMessage 并传递它 到 SendMessage 活动。

假设有三个活动A(MainActivity)B(EditMessageActivity)C(SendMessageActivity)

要从 BA 发送消息,您需要来自 AstartActivityForResult()。当 B 中检索到所需值时,您在 BsetResult() 然后调用 finish()

结果将通过覆盖 onActivityResult()A 中接收。然后启动C,并将值放入intent。

例如,将值从EditMessageActivity 报告回MainActivity

saveButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.i("Custom", "Save buttn clicked");
            Intent intent = new Intent();
            intent.putExtra(MESSAGE, message);
            setResult(RESULT_OK, intent);
            finish();
            Log.i("Custom", "Custom Message created :" + message);
        }
    });

如果只有两个活动,则不需要onActivityResult()。您可以使用Intent 直接将消息传递给SendMessageActivity

例如,将值从MainActivity 发送到EditMessageActivity,而不使用onActivityResult()

saveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i("Custom", "Save buttn clicked");
                Intent intent = new Intent(EditMessageActivity.this, SendMessageActivity.class);
                intent.putExtra(MESSAGE, message);
                startActivity(intent);
                Log.i("Custom", "Custom Message created :" + message);
            }
        });

【讨论】:

  • 非常感谢!这解决了我的问题,也帮助我更清楚地了解我在做什么!
【解决方案2】:

使用

int request = 0;// Any number to identify your request

startActivityForResult(intent,request);

代替

startActivity(intent);

不要使用

完成() ;// 调用活动的函数,该函数将从堆栈中删除活动。

【讨论】:

  • 感谢您的建议,我得到了ᖷAЯAƸ的答复。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多