Как я могу заставить кордону InAppBrowser предоставить пользователю возможность закрыть браузер при использовании Android-устройства? - программирование
Подтвердить что ты не робот

Как я могу заставить кордону InAppBrowser предоставить пользователю возможность закрыть браузер при использовании Android-устройства?

Я использую кордову InAppBrowser для отображения содержимого с внешнего сайта в моем приложении. Когда я открываю браузер на iPhone, в нижней части InAppBrowser есть несколько кнопок для его закрытия или навигации взад и вперед. InAppBrowser на устройстве Android не имеет таких кнопок и не имеет очевидного способа закрыть браузер.

Я знаю, как программно закрыть InAppBrowser, но как пользователь может закрыть его при использовании Android-устройства?

Я знаю, что пользователь может нажать кнопку "Назад", чтобы закрыть браузер, но (1), что не интуитивно понятен - кнопка "назад" обычно означает "вернуться назад", и (2) я в конечном итоге хотел бы изменить поведение кнопки "Назад", чтобы вернуться к странице внутри сайта, которая отображается внутри InAppBrowser, а не закрыть браузер.

4b9b3361

Ответ 1

Добавление "location=yes" в конец вашего вызова поместит адресную строку и кнопку DONE в верхней части окна на Android. (Он отображается в нижней части окна в iOS). Щелчок "Готово" закрывает окно.

var ref = window.open('http://apache.org', '_blank', 'location=yes');

Ответ 2

Для тех из нас, кто использует Ionic (ionicframework.com) и/или ngcordova (ngcordova.com). Следующий код запустит inappbrowser, а затем закроет диалог по ссылке <a href="/mobile/close">close</a>.

  $cordovaInAppBrowser.open('http://localhost:3000/#/mypath/', '_blank', options).then((event) ->
    # success
    return
    ).catch (event) ->
      # error
      return

  $rootScope.$on '$cordovaInAppBrowser:loadstart', (e, event) ->
    $log.log 'loadstart', e, event
    if event.url.match('mobile/close')
      $cordovaInAppBrowser.close()

Ответ 3

Чтобы параметр "location = yes" отображался на Android и iOS, я предлагаю изменить исправление Troy со следующим изменением, которое перемещает оператор if для управления "toolbar.addView(edittext)"; а не всей панели инструментов.

// Add the views to our toolbar
toolbar.addView(actionButtonContainer);
if (getShowLocationBar()) {
    toolbar.addView(edittext);
}
toolbar.addView(close);

// Add our toolbar to our main view/layout
main.addView(toolbar);

По сравнению с исходным кодом:

// Add the views to our toolbar
toolbar.addView(actionButtonContainer);
toolbar.addView(edittext);
toolbar.addView(close);

// Don't add the toolbar if its been disabled
if (getShowLocationBar()) {
    // Add our toolbar to our main view/layout
    main.addView(toolbar);
}

Ответ 4

Как указано elMarquis, вам нужно добавить "location = yes", чтобы получить кнопку "Готово" на устройстве Android. Однако, если вы хотите получить кнопку "Готово" самостоятельно, без адресной строки, это довольно легко сделать, сделав одно изменение исходным кодом кордовы.

Я получил информацию из этой группы google: https://groups.google.com/forum/?fromgroups=#!topic/phonegap/mUcBcjPISgg

Вот несколько пошаговых инструкций:

  • Загрузите исходный код кордовы:

    git clone https://github.com/apache/cordova-plugin-inappbrowser

  • Загрузите код кодекса lib из здесь

  • Откройте Android Developer Tools
  • Импортируйте проект cordova в рабочее пространство

    File > Import... > Existing Projects into Workspace

  • Создайте каталог libs и скопируйте загруженный файл commons-codec-1.7.jar в него.

  • Добавьте в проект папку gen (требуемую файлом .classpath, но не включенную в загрузку git, так как git не разрешает пустые папки)
  • Перейдите в Project > Build All. Проект должен строиться без ошибок.
  • Откройте InAppBrowser.java и найдите "toolbar.addView(edittext)"; (строка 468 в версии кордовы, которую я загрузил).
  • Прокомментируйте эту строку.
  • Снова создайте проект.
  • Скопируйте файл bin/cordova.jar в любой проект, в котором вы используете кордову.

Надеюсь, это поможет кому-то другому.

Ответ 5

По состоянию на 2016 год эти ответы довольно устарели. Я должен был сделать это сейчас, так что вот мой опыт.

Во-первых, проект Cordova/Ionic был разрезан в плагины. Нам понадобится cordova-plugin-inAppBrowser repo.

ШАГ 1

Сначала мы должны клонировать его где-то локально или вилка на github/bitbucket. (Нам понадобится наше клонированное репо для каждой новой настройки проекта.) Мы можем легко клонировать репо с помощью этой команды:

git clone [email protected]:apache/cordova-plugin-inappbrowser.git

ШАГ 2

Затем мы должны внести запрошенные изменения в проект. Чтобы поведение url bar на Android было таким же, как в iOS, мы должны всегда отображать меню и показывать панель url только в том случае, если пользователь запрашивает меню. Код, который управляет этим, находится в файле /src/android/InAppBrowser.java.

Мы должны изменить строки между 707-716. (Примечание: эти номера строк могут изменяться, если они изменяют файл.)

Мы должны изменить код из этого

// Add the views to our toolbar
toolbar.addView(actionButtonContainer);
toolbar.addView(edittext);
toolbar.addView(close);

// Don't add the toolbar if its been disabled
if (getShowLocationBar()) {
    // Add our toolbar to our main view/layout
    main.addView(toolbar);
}

:

// Add the views to our toolbar
toolbar.addView(actionButtonContainer);
if (getShowLocationBar()) {
    toolbar.addView(edittext);
}
toolbar.addView(close);

main.addView(toolbar);

Итак, что мы здесь сделали, так это то, что мы добавляем панели инструментов всегда с кнопками exit/forward/back и добавляем строку url только в том случае, если пользователю нужен полный бар. Это поведение версии iOS.

Кроме того, если мы хотим удалить кнопки "вперед/назад", потому что у Android есть встроенная кнопка "назад", мы должны прокомментировать их и добавить их только в том случае, если для использования требуется полная панель меню. Поэтому наш код должен выглядеть так:

// actionButtonContainer.addView(back);
// actionButtonContainer.addView(forward);

// Add the views to our toolbar
toolbar.addView(actionButtonContainer);
if (getShowLocationBar()) {
    toolbar.addView(edittext);
    // We add this here if the user want the full bar, then we need this buttons.
    actionButtonContainer.addView(back);
    actionButtonContainer.addView(forward);
}
toolbar.addView(close);

ШАГ 3

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

cordova plugin add https://github.com/username/cordova-plugin-inappbrowser.git
// or
cordova plugin add https://[email protected]/UserName/cordova-plugin-inappbrowser.git

вместо

cordova plugin add cordova-plugin-inappbrowser 

Примечание. Вы должны сохранить измененное репо, потому что команда cordova plugin add извлекает данные из вашего репозитория каждый раз, когда вы настраиваете свой проект.

Ответ 6

Для тех, кто ищет встроенную кнопку "Готово" в нижнем колонтитуле для Android (аналогично iOS), я реализовал такую ​​функцию на эту вилку cordova-plugin-inappbrowser.

Обновление: январь 2018

Мой запрос на перенос был объединен в официальный плагин репо, поэтому вы можете дождаться следующей версии (которая будет >= 2.0.2) или установить прямо из Github, например:

cordova plugin add https://github.com/apache/cordova-plugin-inappbrowser

Оригинальный ответ

Реализация - это расширение PR # 246, которое в настоящее время (4 декабря 2017 года) ожидает одобрения для слияния. Как только это будет сделано, я открою отдельный выпуск и PR, чтобы объединить его обратно в мастер cordova-plugin-inappbrowser.

Вот несколько скриншотов с соответствующими параметрами:

место = да, сноска = да

33147006-2a602f88-cfbe-11e7-9580-438b07236400.png

расположение = нет, сноска = да

33147147-a60efaba-cfbe-11e7-8132-120179e8b43e.png

место = да, сноска = да, closebuttoncaption = Готово

33147185-ca8d1e6c-cfbe-11e7-9646-0e1cea52abce.png

расположение = нет, сноска = да, closebuttoncaption = Готово, closebuttoncolor = # 0000FF

33147285-1aa7bc54-cfbf-11e7-9b9b-576f0d87ed9a.png

расположение = нет, сноска = да, footercolor = # 0000FF, closebuttoncaption = Готово

33147316-3ab511fe-cfbf-11e7-8b19-d1de80ad289e.png

расположение = нет, сноска = да, footercolor = # 00ff00, closebuttoncaption = Готово, closebuttoncolor = # 0000FF

33147348-581b55c8-cfbf-11e7-9490-c61d83957079.png

расположение = нет, сноска = да, footercolor = # CC000000, closebuttoncaption = Готово, closebuttoncolor = # 00FFFF

33147377-6ec46c6a-cfbf-11e7-969e-a075142133c4.png

Ответ 7

Просто наткнулся на решение, которое может помочь вам в достижении ваших потребностей лучше и/или помочь другим людям.

В заключение вы можете создать HTML-страницу 'dummy', добавить JavaScript в свое приложение, чтобы обнаружить, когда эта страница загружена, и когда она загружена, закройте InAppBrowser.

Смотрите здесь: Phonegap build - Откройте внешнюю страницу в InAppBrowser или childbrowser без панели инструментов и закройте ее

Ответ 8

Это возможно путем настройки "InAppBrowser.java". Я знаю, что это немного странно, но это единственный выбор, который у меня был. Но те маленькие хитрости, которые я сделал для java файла, теперь позволяют мне перемещаться по страницам в моем приложении.

Вот изменение, которое должно быть сделано в InAppBrowser.java, В методе "run" в методе showWebPage будет код слушателя примерно так:

dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
                    public void onDismiss(DialogInterface dialog) {     
                        closeDialog();
                    }
});

Ниже этой строки добавьте код ниже,

dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {                   
@Override
     public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
         if (event.getAction()!=KeyEvent.ACTION_DOWN)
             return true;               
         if(keyCode==KeyEvent.KEYCODE_BACK){
             goBack();
             return true;
         }else {
             return false;
          }
      }
});