Разрешение во время выполнения Android вызывает тот же фрагмент после принятия или отклонения разрешения - PullRequest
0 голосов
/ 26 марта 2019

Привет, ребята,

У меня есть активность с компонентом "BottomNavigationView", и в этом компоненте у меня есть четыре фрагмента. Например, когда я щелкаю второй фрагмент и нажимаю кнопку «Предоставить разрешение», появляется всплывающее окно для разрешения времени выполнения для записи и чтения во внешнее хранилище.

Когда я принимаю или отклоняю разрешение во время выполнения, приложение автоматически выполняет обратный вызов MainActivity и показывает первый фрагмент по умолчанию (поскольку первый фрагмент является фрагментом по умолчанию в Main Activitiy).

Возможно ли после принятия или отклонения остаться на втором фрагменте? Или мне нужно, например, сохранить в позиции общего предпочтения мой фрагмент и пригласить фрагмент на эту позицию.

Я пытался с lib https://github.com/googlesamples/easypermissions. После неудачного попытки я пытался с пользовательской реализацией для разрешения.

Вот мой код.

private static final int REQUEST_CODE = 121;
private void requiredUserPermissionForDownloadPDF(){
    if(!permissionAlreadyGranted()){
        requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
    }
}


private boolean permissionAlreadyGranted() {
    String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
    for (String permission : perms) {
        if (ContextCompat.checkSelfPermission(getContext(), permission) != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
    }
    return true;
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == REQUEST_CODE
            && grantResults[0] == PackageManager.PERMISSION_GRANTED
            && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
        System.out.println("Granted");
    }
}

Возможно ли после принятия или отклонения остаться на втором фрагменте? Или мне нужно, например, сохранить в позиции общего предпочтения мой фрагмент и пригласить фрагмент на эту позицию.

Ответы [ 2 ]

1 голос
/ 26 марта 2019

У меня была такая же проблема, это происходит потому, что активность воссоздает. Вы должны сохранить идентификатор выбранного элемента из BottomNavigationView в методе onSaveInstanceState, например:

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putInt(KEY_BOT_NAV_VIEW_SELECTED_ITEM_ID, mBottomNavigationView.getSelectedItemId());
    super.onSaveInstanceState(outState);
}

Где KEY_BOT_NAV_VIEW_SELECTED_ITEM_ID - строковый ключ для сохранения и получения идентификатора. Затем, после этого, когда ваша деятельность создается снова и вызывается protected void onCreate(Bundle savedInstanceState), аргумент пакета не равен нулю, и вы можете получить сохраненный идентификатор:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mBottomNavigationView.setOnNavigationItemSelectedListener(this);
    if (savedInstanceState != null) {
        restoreInstanceState(savedInstanceState);
    } else {
        //show first fragment fragment 
    }
}

Подробнее о сохранении и восстановлении состояния можно узнать из здесь

0 голосов
/ 27 марта 2019

Вы запрашиваете разрешение у второго фрагмента или из действия?При запросе от фрагмента он остается внутри фрагмента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...