OnBackPress ведет себя по-разному в Android - PullRequest
0 голосов
/ 05 июля 2018

У меня есть 3 вида деятельности: A , B , C . Когда я нажимаю на элемент в RecyclerView в действии A действие B будет открыто. Есть несколько String значений, которые я передал от A до B .
В действии B , когда я нажимаю на кнопку, я перехожу к заданию C . В C , когда я нажимаю кнопку возврата на моем телефоне (кнопка возврата по умолчанию для Android), он обычно возвращается к активности B . Но я также вставил кнопку возврата в ToolBar, используя родительскую активность. Когда я нажимаю эту кнопку, появляется сообщение об ошибке, что значение String, которое пытается получить в действии B, равно нулю. Я понимаю, почему ошибка показывает. Это очевидно, потому что нет строки, переданной из C в B для извлечения.
Но почему я не получаю эту ошибку, когда я нажимаю кнопку с телефона по умолчанию? Как я могу решить это?

Задание A

Intent intent = new Intent(getActivity(), Chat.class);
intent.putExtra("Recievers_Id", userId);
intent.putExtra("Recievers_Name", userName);
startActivity(intent);

Деятельность B

MessageSenderId = mAuth.getCurrentUser().getUid();
MessageRecieverId = getIntent().getStringExtra("Recievers_Id");
MessageRecieverName = getIntent().getStringExtra("Recievers_Name");

Деятельность C

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Получение ошибки на

MessageRecieverId = getIntent().getStringExtra("Recievers_Id"); 
MessageRecieverName = getIntent().getStringExtra("Recievers_Name"); 

потому что, очевидно, нечего извлекать ... как мне решить эту проблему

Ответы [ 4 ]

0 голосов
/ 05 июля 2018

На занятии B вы должны проверить, Intent получил Extra.

Intent i = getIntent();
if (i.hasExtra("Recievers_Id")) {
    messageRecieverId = i.getStringExtra("Recievers_Id");
} 
if (i.hasExtra("Recievers_Name")) {
    messageRecieverName= i.getStringExtra("Recievers_Name");
}   
0 голосов
/ 05 июля 2018

Вы можете настроить работу кнопки «Назад» на панели инструментов как:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        // Respond to the action bar's Up/Home button
        case android.R.id.home:
            //NavUtils.navigateUpFromSameTask(this);
            onBackPressed();
            return true;
    }
    return super.onOptionsItemSelected(item);
}
0 голосов
/ 05 июля 2018

Прежде всего, вам необходимо понять, что происходит, когда пользователь нажимает кнопку навигации вверх, и что происходит, когда onBackPressed.

На основании документации :

  • Если родительское действие имеет режим запуска <singleTop>, или в верхнем намерении содержится FLAG_ACTIVITY_CLEAR_TOP, родительское действие перенесено на вершину стека, и получает намерение через его Метод onNewIntent ().
  • Если родительское действие имеет режим запуска, а восходящее намерение не содержит FLAG_ACTIVITY_CLEAR_TOP, родительское действие выталкивается из стека, , и новый экземпляр этого действия создан на вершине стека, чтобы получить намерение .

Где, когда нажата кнопка «Назад», она перемещается в обратном хронологическом порядке по истории экранов. В этом случае действие не будет воссоздано.

Подводя итог, можно отметить, что режим запуска вашего ActivityB в AndroidManifest.xml должен быть standard. В этом случае действие будет воссоздано при нажатии кнопки навигации вверх. Но когда нажата кнопка «назад», ActivityB просто выводится на передний план, отсюда и разница в поведении.

Решение:

Подход 1: обрабатывать кнопку Up самостоятельно

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    if(item.getItemId()== android.R.id.home {
        onBackPressed();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

Подход 2:

Установите режим запуска Деятельности B на singleTop в AndroidManifest.xml. Не забудьте проверить значение изменения режима запуска .

Режимы "стандартный" и "одиночный" отличаются друг от друга только одно уважение: каждый раз, когда есть новое намерение для «стандарта» активность, новый экземпляр класса создается в ответ на это намерение. Каждый экземпляр обрабатывает одно намерение. Точно так же, новый экземпляр действия "singleTop" также может быть создан для обработки нового намерение. Однако, если у целевой задачи уже есть существующий экземпляр активности в верхней части своего стека, этот экземпляр получит новое намерение (в вызове onNewIntent ()); новый экземпляр не создано.

0 голосов
/ 05 июля 2018

Добавьте onClickListener к кнопке «Назад» на панели инструментов:

toolbar.setNavigationOnCLickListener(new View.OnClickListener){
    @Override
    public void onClick(View view) {
        finish();
    }
});

Если вы получаете ошибку для нуля, попробуйте это:

if(getIntent().getStringExtra("Recievers_Id") != null){
    MessageRecieverId = getIntent().getStringExtra("Recievers_Id"); 
}
if(getIntent().getStringExtra("Recievers_Name") != null){
    MessageRecieverName = getIntent().getStringExtra("Recievers_Name"); 
}
...