InAppBrowserでページをナビゲートしているときに、Android戻るボタンを無効にするかオーバーライドしたいのですが、それを処理できるイベントリスナーを追加できますか?
EDIT:以下の@T_Dによる回答を見ると、提供されている解決策が最も近いものです。このプラグインのページをナビゲートしている間、すべてのPhoneGapの調整が機能しなくなるため、InAppBrowserのボタンをオーバーライドすることはできないようです。 APIライブラリを変更する以外に、他の解決策を見つけることができませんでした。ここにPhoneGapの人がいて、もっと何か知っているなら、コメントをいただければ幸いです。ありがとう。
私が得た最も近いもの:
var ref = window.open('http://Apache.org', '_blank', 'location=yes');
ref.addEventListener("backbutton", function () { })
documentation によると、ハードウェアの戻るボタンの動作をInAppBrowser用に構成できるようになりました。
ハードウェアバック:yesに設定すると、ハードウェア戻るボタンを使用してInAppBrowserの履歴を逆方向にナビゲートします。前のページがない場合、InAppBrowserは閉じます。デフォルト値はyesであるため、戻るボタンでInAppBrowserを閉じるだけの場合は、noに設定する必要があります。
おかげで クリスエリクソン 。
したがって、後方ナビゲーションが望ましい動作である場合は、InAppBrowserプラグインを更新するだけです。
詳細については、以下を参照してください: https://github.com/Apache/cordova-plugin-inappbrowser/pull/86
これは非常に簡単に実行できます(InAppBrowserバージョン0.3.3以降)が、Javaファイルを編集する必要があります。src/ com/org/Apache/corodova/inappbrowserディレクトリに移動しますInAppBrowserDialog.Javaを編集します。
変化する
public void onBackPressed () {
if (this.inAppBrowser == null) {
this.dismiss();
} else {
// better to go through the in inAppBrowser
// because it does a clean up
this.inAppBrowser.closeDialog();
}
}
に
public void onBackPressed () {
if (this.inAppBrowser == null) {
this.dismiss();
} else {
if (this.inAppBrowser.canGoBack()) {
this.inAppBrowser.goBack();
} else {
this.inAppBrowser.closeDialog();
}
}
}
次に、InAppBrowserに移動し、goBack関数を見つけて、次のように変更します。
/**
* Checks to see if it is possible to go back one page in history, then does so.
*/
private void goBack() {
if (this.inAppWebView.canGoBack()) {
this.inAppWebView.goBack();
}
}
に
/**
* Checks to see if it is possible to go back one page in history, then does so.
*/
public void goBack() {
if (this.inAppWebView.canGoBack()) {
this.inAppWebView.goBack();
}
}
public boolean canGoBack() {
return this.inAppWebView.canGoBack();
}
そして今、ハードウェアの戻るボタンは、やるべき戻ることがなくなるまで戻ります。 [完了]ボタンはすでにInAppBrowserウィンドウを閉じているので、これがAndroidのデフォルトの動作であるはずです。
私はこれと同じ問題を抱えていて、ついにそれを機能させることができました。誰かに役立つ場合に備えて、ここに回答を投稿します。
これは私が使用するコードです:
window.new_window = window.open(url, '_blank', 'location=no');
window.new_window.addEventListener("exit", function () {
window.new_window.close();
});
したがって、重要なのは基本的にexitイベントをアタッチすることです。このイベントは、デバイスの戻るボタンがタップされたときに呼び出されます。
ところで、私はcordova.js
を使用し、Cordova CLIを使用してローカルでアプリをビルドしました。それが違いを生むかどうかはわかりませんが、念のために言及します。
編集メモ:私の知る限り、PhoneGapのInAppBrowserの戻るボタンをオーバーライドすることはできません。しかし、私は可能な解決策を探すために最善を尽くしました...
PhoneGapの戻るボタンをオーバーライドするeventListenerがあります-InAppBrowserでは機能しません-
function onDeviceReady(){
document.addEventListener("backbutton", onBackKeyDown, false);
}
戻るボタンをオーバーライドするための代替eventListener -OPはこれも機能しないと言った-
var ref = window.open('http://www.stackoverflow.com', '_blank', 'location=yes');
ref.addEventListener("backbutton", function () {
//logic here
})
アクティビティの戻るボタンのオーバーライド-これはプレーンJavaであり、明らかにPhoneGapでは機能しませんでした-
@Override
public void onBackPressed()
{
//logic here
}
結論:
上記の解決策は機能せず、リンク( この回答 、 これ および 番目の回答 )をたどっても役に立ちませんでした。そのため、PhoneGapでInAppBrowserの戻るボタンをオーバーライドできない可能性が高くなります。誰かが解決策を思いついた場合、または新しいPhoneGapバージョンに変更があった場合は、遠慮なくお知らせください...
編集:
このプラグインをインストールすると、最も近い解決策にたどり着く可能性があります。
cordova plugin add org.Apache.cordova.inappbrowse
このプラグインが行うことWP8では、開くたびにInAppBrowserに戻る/進む/閉じるボタンがオーバーレイされますその中のリンク/ページ。
この画像を参照してください:
これはPhoneGap2.7で機能し、ヘルプはここから来ました 1つのページでAndroid戻るボタンを無効にし、他のすべてのページで終了ボタンに変更する
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
document.addEventListener("backbutton", function (e) {
e.preventDefault();
}, false );
}
JQuerymobileを使用する:
$(document).on('backbutton',
function(e){
e.preventDefault();
// YOUR CODE GOES HERE
});
Cordova 5.1.1を実行し、inappbroswerにページをロードするとき、inappbrowserが空白でそこにあるだけなのでindex.htmlページに戻るまで戻るボタンを機能させるのが好きです。だから私はこれを修正するために次のコードを使用しました。 inappbrowserを終了すると、アプリを終了します。
window.open = cordova.InAppBrowser.open;
var ref = window.open(url, '_blank', 'location=no');
ref.addEventListener('exit', function () {
navigator.app.exitApp();
});
私の知る限り、inAppBrowserから戻るボタンをオーバーライドまたは検出することはできません。戻るボタンを押すと、inAppBrowserは非表示になり、コントロールをPhonegapページに戻します。これは、ウィンドウのfocus
イベントで(jQueryを使用して)次のようにキャッチできます。
_var browser = window.open('http://example.com', '_blank', 'location=no');
$(window).on('focus', function() {
browser.show();
});
_
ブラウザを再度開きます。次に、必要に応じて、browser.executeScript()
を使用してブラウザにロードされたWebアプリに信号を送ることができます。
このフォーラム投稿 に触発されました。
私はこの質問にすでに答えがあることを知っていますが、これらの答えのいずれかがうまくいかなかった人(私など)のために私の答えを投稿します:
だから私はAndroidとIOSのマルチページアプリを持っていて、cordova 5.xを使用していて、ページIを除くすべてのページに以下のコードを追加しました必要なInAppBrowser:
delete window.open;
そして、私が使用した残りのページについて:
document.addEventListener("backbutton", onBackKeyDown, false);
function onBackKeyDown(event) {
// your code for handling back button comes here
}
戻るボタンを処理するため
ご了承ください: delete window.open;
ベース ドキュメント
'window.open'のデフォルトの動作を手動で復元します
その後、InAppBrowserプラグインはうまく機能し、すべてのページの戻るボタンを正しく処理しました。
最後にもう1つ追加することを忘れないでください:<script type="text/javascript" charset="utf-8" src="cordova.js"></script>
ページでは、InAppBrowserが必要です。
この助けを願っています。