Кнопка back не работает WebView

226
28 мая 2022, 00:10

Необходимо сделать, чтобы при нажатии кнопки 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

Answer 1

Думаю вам нужно подтянуть теорию по структуре класса и области видимости переменных.
Не знаю насколько в этом поможет готовый код, но разжёвывать что к чему долго и нудно.

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();
        }
    }
}
READ ALSO
Отсутствует доступ к сервлету

Отсутствует доступ к сервлету

Изучаю тему сервлетовСтолкнулся с такой проблемой, что html и jsp работают, однако когда я пытаюсь зайти на страницу сервлета (адрес http://localhost:8080/SE/hello),...

129
QuerySyntaxException: User is not mapped

QuerySyntaxException: User is not mapped

Подскажите, пожалуйста, в чем может быть проблемаПосле запуска spring-boot приложения и попытки аутентификации, появляется exception:

356
Fatal Exception: java.lang.NoSuchMethodError

Fatal Exception: java.lang.NoSuchMethodError

Всем добрый вечер, в процессе проекта у меня возникла потребность работать с архивами через ZipFile Вообщем, суть проблемы заключается в том,что...

161
Чисты код и архитектура

Чисты код и архитектура

задумался сделать большой проект для резюмеСам проект это приложение для контроля рабочих:

126