Чем отличается кнопка вверх от кнопки назад? А как заставить кнопку «Вверх» работать как кнопка «Назад»? - PullRequest
0 голосов
/ 09 января 2019

С точки зрения того, как каждая кнопка относится к действиям? В чем различия?

У меня есть 3 вида деятельности (назовем их A, B и C). A является родителем B, а B является родителем C, и одно намерение дополняет следующее действие. Я перехожу с A на B, а затем с B на C. Когда я пытаюсь вернуться с помощью кнопки «Вверх», приложение вылетает, и это потому, что оно пытается получить информацию от дополнительного в намерении.

Но когда я использую кнопку "Назад", она работает (???), и я не знаю почему.

Я попытался заставить кнопку «Вверх» работать как кнопка «Назад», выполнив следующие действия:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case R.id.home:
            onBackPressed();
            break;
    }
    return super.onOptionsItemSelected(item);
}

, а также попытался использовать NavUtils.navigateUpFromSameTask(this), но он тоже не работает. Как я могу решить это?

Редактировать: журнал ошибок

2019-01-09 03:45:43.468 29326-29326/com.jvponte.maosdadasv1 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.jvponte.maosdadasv1, PID: 29326
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jvponte.maosdadasv1/com.jvponte.maosdadasv1.UserActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.jvponte.maosdadasv1.User.getUsername()' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:169)
    at android.app.ActivityThread.main(ActivityThread.java:6568)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.jvponte.maosdadasv1.User.getUsername()' on a null object reference
    at com.jvponte.maosdadasv1.UserActivity.onCreate(UserActivity.java:67)
    at android.app.Activity.performCreate(Activity.java:7016)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
    at android.os.Handler.dispatchMessage(Handler.java:105) 
    at android.os.Looper.loop(Looper.java:169) 
    at android.app.ActivityThread.main(ActivityThread.java:6568) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

Редактировать: еще немного кода У меня это в onCreate() на моей деятельности B (UserActivity). Дополнительное намерение добавляется к заданию A

    Intent intent = getIntent();

    if(intent.hasExtra("clickedUser")){
        mOtherUser = intent.getParcelableExtra("clickedUser");
    }
    if(intent.hasExtra("loggedUser")){
        mLoggedUser = intent.getParcelableExtra("loggedUser");
    }

    /.../

    mUsernameTV.setText(mOtherUser.getUsername());
    mUserInfoTV.setText(mOtherUser.getUserInfo());

Здесь я называю деятельность C (ChatActivity)

Intent intent = new Intent(UserActivity.this, ChatActivity.class);
intent.putExtra("loggedUser", mLoggedUser);
intent.putExtra("clickedUser", mOtherUser);
startActivityForResult(intent, RC_CHAT);

В ChatActivity onCreate() У меня есть

    Intent intent = getIntent();
    if (intent.hasExtra("clickedUser")){
        otherUser = intent.getParcelableExtra("clickedUser");
        otherUserId = otherUser.getUid();
        otherUserName = otherUser.getUsername();
    }
    if (intent.hasExtra("loggedUser")){
        loggedUser = intent.getParcelableExtra("loggedUser");
        loggedUserId = loggedUser.getUid();
    }

Ошибка, вероятно, заключается в том, что данный loggedUser и другие дополнительные пользователи неправильно управляются. Самое странное, что использование кнопки «Назад» РАБОТАЕТ, а настройка кнопки «Работа» для кнопки «Назад» не работает

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Основная разница между вверх и назад не видна при регулярном использовании приложения.

Но, например, если вы открываете подробное действие по ссылке, приложение открывается только с подробным действием. Теперь, если вы нажмете кнопку «Назад» на панели инструментов, может произойти следующее:

  • Наверх Навигация означает, что вы идете вверх по иерархии, то есть к родительскому элементу подробного действия, например домашнего действия.
  • Назад Навигация означает, что вы вернетесь туда, где вы были раньше, так что это будет означать возврат к последнему использованному приложению, такому как браузер, с которого вы открыли ссылку.

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

, а также попытался использовать NavUtils.navigateUpFromSameTask (это), но это тоже не работает. Как я могу решить это?

Вероятно, это связано с тем, что вы не определили родительскую активность для текущей деятельности.

Взгляните на учебник (особенно на раздел Specify Parent), где все подробно описано о навигации вверх.


Редактировать после того, как вы указали трассировку стека:

Итак, навигация up работает для вас, только та активность, на которую вы переходите, ожидает какого-то пользователя в его методе onCreate(...). Вы должны убедиться, что вы предоставили все данные родительской деятельности.

Если вы предоставляете данные через намерения, вы можете использовать следующий код для открытия родительского элемента:

Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
    TaskStackBuilder.create(this)
        .addNextIntentWithParentStack(upIntent)
        .startActivities();
} else {
    NavUtils.navigateUpTo(this, upIntent);
}
0 голосов
/ 10 января 2019

Я только что удалил родительское отношение между B и C и использовал код onOptionSelected(), который я разместил, и это сработало. Даже при использовании этого родительский B B приводил к краху.

Я до сих пор не знаю, почему работает кнопка «Назад», а кнопка «Вверх» - нет, но это решило проблему. Спасибо всем, кто пытался помочь

0 голосов
/ 09 января 2019

Попробуйте изменить свой код следующим образом, чтобы смоделировать поведение кнопки "Назад":

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:
            onBackPressed();
            return true;
    }
    return super.onOptionsItemSelected(item);
}
...