Android приложение останавливается после действия pull-to-refre sh - PullRequest
0 голосов
/ 21 февраля 2020

У меня возникла следующая проблема : я создаю android приложение для веб-просмотра с использованием фрагментов и хочу реализовать действие SwipeToRefre sh.

Я пытался выполнить это, но приложение останавливается сразу же после действия пользователя «1020 *». Вот разные коды:

frag_home. xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_red_light">

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    android:id="@+id/sr"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <WebView
        android:id="@+id/webviewhome"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></WebView>

</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

</RelativeLayout>    

HomeFragment. java publi c Класс HomeFragment extends Фрагмент {

public HomeFragment(){
    // Required
}

private SwipeRefreshLayout mRefreshLayout;
private WebView mWebView;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.fragment_home, container, false);
    mRefreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.sr);
    mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            mWebView.reload();
            mRefreshLayout.setRefreshing(false);
        }
    });
    final WebView webView = (WebView) v.findViewById(R.id.webviewhome);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setAppCacheEnabled(true);
    webView.loadUrl("MYURL");
    webView.setWebViewClient(new WebViewClient());
    webView.canGoBack();

    webView.setOnKeyListener(new View.OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK
                    && event.getAction() == MotionEvent.ACTION_UP
                    && webView.canGoBack()) {
                webView.goBack();
                return true;
            }
            return false;
        }
    });

    webView.setWebViewClient(new WebViewClient() {
        public void onReceivedError(WebView webView, int errorCode, String description, String failingUrl) {
            try {
                webView.stopLoading();
            } catch (Exception e) {
            }

            if (webView.canGoBack()) {
                webView.goBack();
            }

            webView.loadUrl("about:blank");
            AlertDialog alertDialog = new AlertDialog.Builder(getContext()).create();
            alertDialog.setTitle("Erreur !");
            alertDialog.setMessage("Veuillez vérifier votre connexion internet et réessayer");
            alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Réessayer", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    getActivity().finish();
                    startActivity(getActivity().getIntent());
                }
            });

            alertDialog.show();
            super.onReceivedError(webView, errorCode, description, failingUrl);
        }
    });

    return v;
}    

Можете ли вы помочь мне, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Вы используете неправильную ссылку на веб-просмотр

public class MyFragment extends Fragment {


    private SwipeRefreshLayout mRefreshLayout;
    private WebView webView;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.fragment_home, container, false);
        mRefreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.sr);
        mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                webView.reload();
                mRefreshLayout.setRefreshing(false);
            }
        });
        webView = v.findViewById(R.id.webviewhome);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setAppCacheEnabled(true);
        webView.loadUrl("https://stackoverflow.com/questions/tagged/android");
        webView.setWebViewClient(new WebViewClient());
        webView.canGoBack();

        webView.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK
                        && event.getAction() == MotionEvent.ACTION_UP
                        && webView.canGoBack()) {
                    webView.goBack();
                    return true;
                }
                return false;
            }
        });

        webView.setWebViewClient(new WebViewClient() {
            public void onReceivedError(WebView webView, int errorCode, String description, String failingUrl) {
                try {
                    webView.stopLoading();
                } catch (Exception e) {
                }

                if (webView.canGoBack()) {
                    webView.goBack();
                }

                webView.loadUrl("about:blank");
                AlertDialog alertDialog = new AlertDialog.Builder(getContext()).create();
                alertDialog.setTitle("Erreur !");
                alertDialog.setMessage("Veuillez vérifier votre connexion internet et réessayer");
                alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Réessayer", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        getActivity().finish();
                        startActivity(getActivity().getIntent());
                    }
                });

                alertDialog.show();
                super.onReceivedError(webView, errorCode, description, failingUrl);
            }
        });

        return v;
    }
} 
0 голосов
/ 21 февраля 2020

Если мы не пропустили части вашего кода, то вы создали два экземпляра для веб-просмотра, в макете refre sh вы вызываете mWebView, который не был инициализирован. попробуйте это:

public HomeFragment(){
    // Required
}

private SwipeRefreshLayout mRefreshLayout;
private WebView WebView;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

View v = inflater.inflate(R.layout.fragment_home, container, false);
mRefreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.sr);
mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
        mWebView.reload();
        mRefreshLayout.setRefreshing(false);
    }
});
webView = (WebView) v.findViewById(R.id.webviewhome);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAppCacheEnabled(true);
webView.loadUrl("MYURL");
webView.setWebViewClient(new WebViewClient());
webView.canGoBack();

webView.setOnKeyListener(new View.OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK
                && event.getAction() == MotionEvent.ACTION_UP
                && webView.canGoBack()) {
            webView.goBack();
            return true;
        }
        return false;
    }
});

webView.setWebViewClient(new WebViewClient() {
    public void onReceivedError(WebView webView, int errorCode, String description, String failingUrl) {
        try {
            webView.stopLoading();
        } catch (Exception e) {
        }

        if (webView.canGoBack()) {
            webView.goBack();
        }

        webView.loadUrl("about:blank");
        AlertDialog alertDialog = new AlertDialog.Builder(getContext()).create();
        alertDialog.setTitle("Erreur !");
        alertDialog.setMessage("Veuillez vérifier votre connexion internet et réessayer");
        alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Réessayer", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                getActivity().finish();
                startActivity(getActivity().getIntent());
            }
        });

        alertDialog.show();
        super.onReceivedError(webView, errorCode, description, failingUrl);
    }
});

    return v;
}  
...