Необходимо сделать, чтобы при нажатии кнопки Back на телефоне приложение не закрывалось. Нашел код на форуме, вроде бы расставил все куда нужно, но программа также закрывается при нажатии кнопки Back.
package com.example.app1;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import com.onesignal.OneSignal;
import java.util.Objects;
public class MainActivity extends AppCompatActivity {
WebView webView;
@SuppressLint("WrongConstant")
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Objects.requireNonNull(getSupportActionBar()).hide();
// Logging set to help debug issues, remove before releasing your app.
OneSignal.setLogLevel(OneSignal.LOG_LEVEL.VERBOSE, OneSignal.LOG_LEVEL.NONE);
// OneSignal Initialization
OneSignal.startInit(this)
.inFocusDisplaying(OneSignal.OSInFocusDisplayOption.Notification)
.unsubscribeWhenNotificationsAreDisabled(true)
.init();
setContentView(R.layout.activity_main);
WebView webView = findViewById(R.id.webView);
WebSettings settings = webView.getSettings();
webView.loadUrl("https://ru.stackoverflow.com/");
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setSaveFormData(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webView.getSettings().setSupportMultipleWindows(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setCacheMode(2);
webView.getSettings().setLoadWithOverviewMode(true);
webView.setWebContentsDebuggingEnabled(true);
webView.getSettings().setUserAgentString("Mozilla/5.0 (Linux; Android 7.1; Mi A1 Build/N2G47H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36");
this.getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN);
}
@Override
public void onBackPressed(){
if (webView.canGoBack()){
webView.goBack();
Toast.makeText(this,"Go Back",Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(this,"Exit",Toast.LENGTH_SHORT).show();
super.onBackPressed();
}
}
WebViewClient webViewClient = new WebViewClient() {
@SuppressWarnings("deprecation")
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@TargetApi(Build.VERSION_CODES.N)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
view.loadUrl(request.getUrl().toString());
return true;
}
};
webView.setWebViewClient(webViewClient);
}
}
Код для кнопки
}
@Override
public void onBackPressed(){
if (webView.canGoBack()){
webView.goBack();
Toast.makeText(this,"Go Back",Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(this,"Exit",Toast.LENGTH_SHORT).show();
super.onBackPressed();
}
}
Если webView.setWebViewClient(webViewClient); вставить до webView.loadUrl("https://ru.stackoverflow.com/"); , то приложение компилируется,но все равно вылетает при нажатии клавиши back
Думаю вам нужно подтянуть теорию по структуре класса и области видимости переменных.
Не знаю насколько в этом поможет готовый код, но разжёвывать что к чему долго и нудно.
package com.example.app1;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import com.onesignal.OneSignal;
import java.util.Objects;
public class MainActivity extends AppCompatActivity {
WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Objects.requireNonNull(getSupportActionBar()).hide();
// Logging set to help debug issues, remove before releasing your app.
OneSignal.setLogLevel(OneSignal.LOG_LEVEL.VERBOSE, OneSignal.LOG_LEVEL.NONE);
// OneSignal Initialization
OneSignal.startInit(this)
.inFocusDisplaying(OneSignal.OSInFocusDisplayOption.Notification)
.unsubscribeWhenNotificationsAreDisabled(true)
.init();
setContentView(R.layout.activity_main);
webView = findViewById(R.id.webView);
WebSettings settings = webView.getSettings();
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setSaveFormData(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webView.getSettings().setSupportMultipleWindows(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
webView.getSettings().setLoadWithOverviewMode(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
webView.setWebContentsDebuggingEnabled(true);
}
webView.getSettings().setUserAgentString("Mozilla/5.0 (Linux; Android 7.1; Mi A1 Build/N2G47H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36");
this.getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("https://ru.stackoverflow.com/");
}
@Override
public void onBackPressed(){
if (webView.canGoBack()){
webView.goBack();
Toast.makeText(this,"Go Back",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"Exit",Toast.LENGTH_SHORT).show();
super.onBackPressed();
}
}
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей