Skocz do zawartości
M D

WebView, użyć Activity czy Fragmentów???

    Rekomendowane odpowiedzi

    M D

    Witam. Piszę aplikację, w której wykorzystuję WebView do otwierania kilku stron www, ale do końca nie wiem czym się różni Activity od Fragment, większość przykładów na stackoverflow i ogólnie w necie jest pokazana na Activity, ale z tego co zauważyłem to nasze aplikacje w telefonach korzystają w większości przykładów z Fragmentów? I czy mogę użyć, albo czego powinienem użyć do wyświetlania stron, chodzi mi o WebView, normalnie wykorzystywałem, do tego Activity, ale jedną ze stron odpalam (to WebView) we Fragmencie i też działa, tylko mam czasami problem z TITLE który sam sobie ustawiam na pasku AppBar (Toolbar) i wywala mnie z apki przez to. Tak więc do WebView co jest bardziej wskazane Activity czy Fragmenty? Zauważyłem też, że np w activity jak odpalę jakąś stronę i zacznę coś na tej stronie robić, przejdę do jakiejś innej podstrony, to po naciśnięciu button back czyli wywołanie metody

    public void onBackPressed() 

    cofa mnie tak jak powinno, czyli do poprzedniej podstrony, lub strony głównej, w Fragmencie tak niestety nie mam, cofa mnie do ostatniego widoku w aplikacji, dlatego też pytam kiedy i do czego jest bardziej wskazane Activity a do czego Fragmenty, jak prawidłowo z tego korzystać itd ??? 

     

    Dodam kod Fragmentu z WebView może się przyda :D

     

    public class AdBlastFragment extends Fragment {
    
        SharedPreferences sharedPreferences;
    
        ProgressDialog pd = null;
        ProgressBar progressBar = null;
        private SwipeRefreshLayout swipe;
        private WebView webView;
    //    private NestedWebView webView;
    
        public static final String MyPREFERENCES = "AdBlast";
        private String login;
        private String password;
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            PowerManager pm = (PowerManager) getActivity().getSystemService(Context.POWER_SERVICE);
    
            PowerManager.WakeLock wakeLock = pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "T:AG");
            wakeLock.acquire();
            getActivity().getWindow().addFlags(
                    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    
            final View view = inflater.inflate(R.layout.website, container, false);
    
            sharedPreferences = getActivity().getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
            login = sharedPreferences.getString(this.getString(R.string.keyLogin), "");
            password = sharedPreferences.getString(this.getString(R.string.keyPassword), "");
    
            swipe = (SwipeRefreshLayout) view.findViewById(R.id.swpie);
            swipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                @Override
                public void onRefresh() {
                    LoadWeb(view);
                }
            });
            LoadWeb(view);
    
            wakeLock.release();
    
            return view;
        }
    
        public void LoadWeb(View view) {
            webView = (WebView) view.findViewById(R.id.website);
            WebSettings webSettings = webView.getSettings();
            webView.getSettings().setJavaScriptEnabled(true);
    
            webView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
    //        webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
            webView.getSettings().setAppCacheEnabled(true);
            webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
            webSettings.setDomStorageEnabled(true);
            webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
            webSettings.setUseWideViewPort(true);
            webSettings.setSavePassword(true);
            webSettings.setSaveFormData(true);
            webSettings.setEnableSmoothTransition(true);
    
            swipe.setRefreshing(true);
    
            webView.loadUrl("https://adblast.alternet.com/auth");
            final String js = "javascript:document.querySelector('input[name=email]').value='" + login + "';" +
                    "document.querySelector('input[name=password]').value='" + password + "';" +
                    "document.getElementById('submit').click()";
    
    
            webView.setWebViewClient(new WebViewClient() {
    //            @Override
    //            public boolean shouldOverrideUrlLoading(WebView view, String url) {
    //                if (Uri.parse(url).getHost().equals("https://adblast.alternet.com/home")) {
    //                    //open url contents in webview
    //                    return false;
    //                } else {
    //                    //here open external links in external browser or app
    //                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    //                    startActivity(intent);
    ////
    ////                    Intent intent = new Intent(Intent.ACTION_VIEW, AdBlastFragment.class); // Uri.parse(url)
    ////                    startActivity(intent);
    //
    ////                    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    ////                    fragmentTransaction.addToBackStack("tag of fragment"); // dzięki temu działa onBackPressed()
    ////                    fragmentTransaction.replace(R.id.content_frame, new AdBlastFragment());
    ////                    fragmentTransaction.commit();
    //                    return true;
    //                }
    //            }
    
                @Override
                public void onPageStarted(WebView view, String url, Bitmap favicon) {
                    Log.d("XXXXXXXXXXXXXXXXX", "your current url when webpage loading.." + url);
                    pd = new ProgressDialog(getActivity());
                    pd.setTitle("Please Wait..");
                    pd.setIcon(R.drawable.ad);
    //                pd.setProgressStyle(1);
                    pd.setMessage("Website is Loading..");
                    pd.show();
                    super.onPageStarted(view, url, favicon);
                }
    
                @Override
                public void onPageFinished(WebView view, String url) {
                    Log.d("YYYYYYYYYYYYYYYYYY", "your current url when webpage loading.. finish" + url);
                    pd.dismiss();
                    if (Build.VERSION.SDK_INT >= 19 && !login.isEmpty() && !password.isEmpty()) {
                        view.evaluateJavascript(js, new ValueCallback<String>() {
                            @Override
                            public void onReceiveValue(String s) {
                            }
                        });
                    }
                    swipe.setRefreshing(false);
                }
            });
    
            webView.setWebChromeClient(new WebChromeClient() {
                public void onProgressChanged(WebView view, int newProgress) {
                    ((MainActivity) getActivity()).setActionBarTitleAndIcon("Page loading : " + newProgress + "%", 0);
                    if (newProgress == 100) {
                        ((MainActivity) getActivity()).setActionBarTitleAndIcon(view.getTitle(), 0);
                    }
                }
            });
        }
    }

     

    I jeszcze jedno małe pytanie czy jest możliwość, żeby SWIPE po odświeżeniu nie cofało mnie do strony głównej, tylko odświeżyło tą stronę/podstronę gdzie się aktualnie znajduję? :D

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    W tym przypadku lepiej używać Activity. Fragmenty to takie moduły dzięki którym łatwiej zarządza się wyświetlana treścią. Mają sens jeżeli jest ich kilka w jednym activity. Na przykład w aplikacji youtube, gdy odpali się filmik, można jednocześnie przewijać/czytać komentarze  a u góry cały czas film będzie widoczny. Możliwe że w jednym fragmencie jest odtwarzacz, a w drugim komentarze. Dzięki fragmentom aplikacja może wyglądać inaczej na tablecie (gdzie ma więcej miejsca i więcej fragmentów może być widocznych) i inaczej na telefonie. Tutaj z dokumentacji googla:
    fragments.png

    Jeżeli chodzi o swipe to:

    swipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                @Override
                public void onRefresh() {
                    LoadWeb(view);
                }
            });

    Tutaj ustalasz sobie co ma się stać po wykonaniu odświeżeniu. W metodzie LoadWeb()

    webView.loadUrl("https://adblast.alternet.com/auth");

    ustawiasz URL. Wystarczy że ten url przeniesiesz do zmiennej i tą zmienną będziesz w odpowiednim momencie podmieniał na odpowiednią podstronę:

    //gdzieś na początku 
    String currentURL =  "https://adblast.alternet.com/auth";
    ...
      
    //potem w LoadWeb()
    webView.loadUrl(currentURL)
    
      
    // na końcu zostaje jeszcze przypisanie w onPageFinished albo w onPageStarted - to musisz przetestować
      
    currentURL = webView.getUrl().toString();

     

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    M D

    Super bardzo mi to pomogło, zwłaszcza co zrobić z tym SWPIE, dzięki za pomoc :D Dałoby rade podesłać jakieś dobre materiały o fragmentach i activity (niekoniecznie dokumentacja androida HAHA ). 

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

    Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

    Zarejestruj nowe konto

    Załóż nowe konto. To bardzo proste!

    Zarejestruj się

    Zaloguj się

    Posiadasz już konto? Zaloguj się poniżej.

    Zaloguj się

    • Ostatnio przeglądający   0 użytkowników

      Brak zarejestrowanych użytkowników przeglądających tę stronę.

    x