Ксамарин.Формы: Переопределение кнопки «Назад» и выбор параметров Onoptionsitem

#c# #android #.net #xamarin #xamarin.forms

Вопрос:

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

Похоже, мне понадобится метод onOptionsItemSelected, но по какой-то причине он не вызывается.

Это мое переопределение onOptionsItemSelected, игнорируйте содержимое в нем..

 public override bool OnOptionsItemSelected(IMenuItem item) {
        // check if the current item id is equals to the back button id
        if (item.ItemId == 16908332)
        {
            // retrieve the current xamarin forms page instance
            var selected = item;
            // Some random stuff will come here.
            return base.OnOptionsItemSelected(item);
        }
        else
        {
            // since its not the back button click, pass the event to the base
            return base.OnOptionsItemSelected(item);
        }
 

Я видел, что вам нужно выполнить некоторую «инициализацию» в методе onCreate в MainActivity, чтобы он запустился:

 if (FindViewById(Resource.Id.toolbar) is AndroidX.AppCompat.Widget.Toolbar toolbar)
        {
            SetSupportActionBar(toolbar);
        }
 

Но по какой-то причине я не могу «найти» этот AndroidX.AppCompat.Виджет.Панель инструментов. По какой-то причине AppCompat не существует. Я попытался установить Xamarin.AndroidX.AppCompat, но он все еще не найден. Есть идеи?

Комментарии:

1. Верхняя кнопка «Назад» должна иметь другое поведение, чем собственная кнопка «Назад» Android?

2. Я хотел бы реализовать фразу «Изменения не сохранены, вы уверены, что хотите вернуться?», да

3. Да, но, если пользователь нажмет на заднюю кнопку Android, родную (ту, что ниже), он сделает то же самое или вы хотите, чтобы один сделал что-то, а другой сделал что-то другое?

4. О, вы имеете в виду «аппаратную» кнопку устройства? Я справляюсь с этим с помощью переопределения метода OnBackButtonPressed (). (Они должны делать то же самое, да)

5. переопределение OnBackButtonPressed() в классе или onBackPressed() в mainActicity работает только для аппаратной кнопки (кнопка Android внизу), но ничего не работает для кнопки «программное обеспечение» на панели инструментов… Знаете ли вы, как «вызвать» onOptionsItemSelected() в mainActicity?

Ответ №1:

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

Я хотел бы реализовать фразу «Изменения не сохранены, вы уверены, что хотите вернуться?», да

У меня была та же проблема, и я также пришел к выводу, что невозможно предотвратить закрытие страницы при нажатии кнопки «Назад» на панели инструментов страницы навигации.

Теперь это было в 2019 году, не уверен, что есть другой способ, о котором я не знаю.

Один из способов справиться с этим-задать пользователю вопрос «да/нет», например: «Вы хотите сохранить изменения?» ПОСЛЕ того, как страница была закрыта. Таким образом, у пользователя все еще есть выбор сохранить или отменить изменения, но «отменить» обратную навигацию будет невозможно.

Если вам нужен полный контроль над тем, когда страница может быть закрыта, рассмотрите возможность перехода на страницу модально, т. е. используйте

 Application.NavigationProxy.PushModalAsync(new NavigationPage(page));
 

вместо

 NavigationPage.PushAsync(page);
 

На панели инструментов модальной страницы не будет автоматически добавленной кнопки «Назад». Он может быть закрыт явно только одним из определенных вами действий.

Если вы используете модальную навигацию, имейте в виду, что аппаратная кнопка «Назад» Android все еще может закрыть страницу, поэтому OnBackButtonPressed() ее все еще необходимо обработать.