Настроить в webview Android правильную работу кнопки назад

1,00
р.
Здравствуйте!
Сразу скажу - я не программист, я заказчик, поэтому есть что не так скажу - камнями не кидайтесь, пожалуйста.
Я заказал клиент к сайту - webview с выходом только на один сайт, в общем мне его сделали, но возникла одна проблема - по умолчанию в webview системная кнопка назад закрывает приложение, а ссылка на сайте в виде a href="javascript:history.go(-1) уходит в цикл, то есть - со страницы 1 пользователь переходит на 2, а потом на 3, а потом нажимает кнопку назад и со страницы 3 возвращается на 2, при нажатии на кнопку назад ещё раз пользователь снова попадает на страницу 3, а не на страницу 1, а потом с 3 опять на 2, с 2 опять на 3 и так вечно. При этом, если написать ссылку вида a href="javascript:history.go(-10) - система сделает 10 шагов назад, а потом один вперед и снова цикл.
Решение было найдено примерно такое:
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack() return true } return super.onKeyDown(keyCode, event) }
Я, честно говоря, не знаю, что это и куда вставляется, так как я уже говорил, что я не программист, но думаю Вам будет понятно.
В таком случае системная кнопка назад работает как надо - делает один шаг назад, ссылка вида a href="javascript:history.go(-X)" перестает уходить в цикл, но появляется новая проблема, ссылка вида a href="javascript:history.go(-X)" делает не X шагов назад, как раньше, а только 1, независимо от значения X. В других webview я наблюдал что можно заставить работать и системную кнопку нормально, и на сайте правильно, но программист, которому я заказал - не знает как это сделать.
Я поискал и нашел возможное решение - вместо goBack использовать goBackOrForward(), но программист, которому я заказал приложение, понятия не имеет, как это можно использовать, а я и подавно.
В общем, задача в решении которой я прошу помощи - реализовать работу кнопки "назад", как системной так и с помощью скрипта на сайте вида a href="javascript:history.go(-x)" в webview на Андроид. Нужно, что бы кнопка назад вида history.go(-x) делала X шагов назад, системная при этом может или делать несколько шагов назад, или по одному шагу назад, или вообще выходить из приложения - не важно. Главное, что бы кнопка history.go(-x) работала и не зацикливалась.
Помогите пожалуйста, знающие люди! Простите, если что коряво объяснил, если что - задавайте вопросы, я постараюсь ответить! Спасибо!
update 25.05.2014
Вот, раскопал код активити:
package mobi.infa.smolik
import android.app.Activity import android.content.Context import android.content.Intent import android.net.ConnectivityManager import android.net.NetworkInfo import android.net.Uri import android.os.Bundle import android.view.KeyEvent import android.view.Menu import android.view.MenuItem import android.webkit.GeolocationPermissions.Callback import android.webkit.WebChromeClient import android.webkit.WebSettings import android.webkit.WebView import android.webkit.WebViewClient import android.widget.ProgressBar import android.widget.Toast
public class MainActivity extends Activity { ProgressBar loadingProgressBar ProgressBar loadingTitle WebView mWebView
public static boolean checkInternetConnection(Context paramContext) { ConnectivityManager localConnectivityManager = (ConnectivityManager)paramContext.getSystemService("connectivity") return (localConnectivityManager.getActiveNetworkInfo() != null) && (localConnectivityManager.getActiveNetworkInfo().isAvailable()) && (localConnectivityManager.getActiveNetworkInfo().isConnected()) }
protected void onCreate(Bundle paramBundle) { super.onCreate(paramBundle) requestWindowFeature(1) setContentView(2130903040) final Context localContext = getApplicationContext() this.loadingProgressBar = ((ProgressBar)findViewById(2131165185)) this.mWebView = ((WebView)findViewById(2131165186)) this.mWebView.getSettings().setJavaScriptEnabled(true) this.mWebView.getSettings().setUserAgentString("infa_android_v0_1") this.mWebView.loadUrl("http://www.site.ru") this.mWebView.setWebChromeClient(new WebChromeClient() { public void onGeolocationPermissionsShowPrompt(String paramAnonymousString, GeolocationPermissions.Callback paramAnonymousCallback) { paramAnonymousCallback.invoke(paramAnonymousString, true, false) }
public void onProgressChanged(WebView paramAnonymousWebView, int paramAnonymousInt) { super.onProgressChanged(paramAnonymousWebView, paramAnonymousInt) MainActivity.this.loadingProgressBar.setProgress(paramAnonymousInt) if (paramAnonymousInt == 100) { MainActivity.this.loadingProgressBar.setVisibility(4) return } MainActivity.this.loadingProgressBar.setVisibility(0) } }) WebViewClient local2 = new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView paramAnonymousWebView, String paramAnonymousString) { if (paramAnonymousString.contains("infa.mobi")) { if (paramAnonymousString.equalsIgnoreCase(MainActivity.this.mWebView.getUrl())) { MainActivity.this.mWebView.goBack() return true } if (MainActivity.checkInternetConnection(localContext)) { MainActivity.this.mWebView.loadUrl(paramAnonymousString) return true } Toast localToast = Toast.makeText(localContext, "Отсутствует интернет соединение!", 1) localToast.setGravity(17, 0, 0) localToast.show() return true } Intent localIntent = new Intent("android.intent.action.VIEW") localIntent.setData(Uri.parse(paramAnonymousString)) MainActivity.this.startActivity(localIntent) return true } } this.mWebView.setWebViewClient(local2) }
public boolean onCreateOptionsMenu(Menu paramMenu) { paramMenu.add("На главную") paramMenu.add("Поделиться") paramMenu.add("О программе") paramMenu.add("Выход") return super.onCreateOptionsMenu(paramMenu) }
public boolean onBackPressed(int paramInt, KeyEvent paramKeyEvent) { if (paramKeyEvent.getAction() == 0) {} switch (paramInt) { default: return super.onBackPressed(paramInt, paramKeyEvent) } if (this.mWebView.canGoBack()) { this.mWebView.goBack() } for ( ) { return true finish() } }
public boolean onOptionsItemSelected(MenuItem paramMenuItem) { if (paramMenuItem.getTitle().toString().contains("главную")) { this.mWebView.loadUrl("http://www.site.ru/") } if (paramMenuItem.getTitle().toString().contains("делиться")) { Intent localIntent = new Intent("android.intent.action.SEND") localIntent.setType("text/plain") localIntent.putExtra("android.intent.extra.TEXT", "http://www.site.ru") localIntent.putExtra("android.intent.extra.SUBJECT", "Классный сайт!") startActivity(Intent.createChooser(localIntent, "Поделиться")) } if (paramMenuItem.getTitle().toString().contains("ыход")) { finish() } return super.onOptionsItemSelected(paramMenuItem) } }


Ответ
Прошу прощения, может не до конца понял вопрос.
public class MainActivity extends AppCompatActivity {
private WebView view @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) this.view = (WebView) findViewById(R.id.webview) view.loadUrl("http://www.plus2net.com/javascript_tutorial/history-object.php") view.getSettings().setJavaScriptEnabled(true) }
@Override public void onBackPressed() { if (view.canGoBack()) { view.goBack() } else { super.onBackPressed() } } }
Отлично выполняет ваши требования. По нажатию на назад идет до упора по хистори вебвью и затем закрывает активити. Если вы в загруженной странице кликните на demo of the history object, то перейдете на страницу где используется history.go(-1). По клику на go -1 вернетесь обратно.