কোনও ইউআরএল লোড সমাপ্তি ওয়েবভিউয়ের জন্য কীভাবে শুনবেন?


447

আমার একটি রয়েছে WebViewযা ইন্টারনেট থেকে কোনও পৃষ্ঠা লোড করছে is ProgressBarলোডিং শেষ না হওয়া পর্যন্ত আমি একটি দেখাতে চাই ।

এ এর পৃষ্ঠা লোডিংয়ের সমাপ্তির জন্য আমি কীভাবে শুনব WebView?


1
দয়া করে আমার উত্তরটিকে চিহ্নিত হিসাবে সঠিক হিসাবে বিবেচনা করুন, কারণ এটি কিছু সমস্যা সমাধান করে যা আয়ানের নয়।
neteinstein

আমার মনে হয় পৃষ্ঠাটি লোড হওয়ার পরে দেশীয় জাভা কোডটি কল করার আরও ভাল উপায়। এই উত্তরটি রেফার করুন, যদিও এটি আইওএসের জন্য, তবে ধারণাটি এখানেও প্রযোজ্য
ক্রিস রুফ

সর্বনিম্ন এবং সংক্ষিপ্ত সমাধানের জন্য নীচে আমার উত্তরটি দেখুন
স্কিনেট

উত্তর:


716

ওয়েবভিউক্লিয়েন্টকে প্রসারিত করুন এবং পেজফিনিশড () তে কল করুন :

mWebView.setWebViewClient(new WebViewClient() {

   public void onPageFinished(WebView view, String url) {
        // do your stuff here
    }
});

ইন্টারনেট যখন এত দ্রুত না হয় তখন বাইরের লোডিংয়ের সাথে আমার কিছু সমস্যা রয়েছে। উদাহরণস্বরূপ গুগল অ্যানালিটিক্স বা এর মতো অন্যান্য স্টাফ। আমি কিছু কাজের চেষ্টা করেছি এবং এটি অনেক উন্নত হয়েছে, তবে এখনও নিখুঁত নয়। কখনও কখনও অ্যাপ্লিকেশনটি লোডিং স্ক্রিনে হিমশীতল হয়ে যায় এবং প্রস্থান করা অসম্ভব, যদি না আপনি নেটওয়ার্কটি সংযোগ বিচ্ছিন্ন করেন বা অন্য কোনও একটিতে সংযুক্ত না হন। আমি কীভাবে এটি এখনও সমাধান করবেন জানি না, আমি চেষ্টা করছি।
ফিলিপ

1
নিখুঁত কাজ করে। লোড করার আগে আপনি mWebView.setVisibility (View.INVISIBLE) ব্যবহার করতে পারেন। লোড সম্পূর্ণ হয়ে গেলে এটিকে আবার ভিউতে সেট করুন IS ভিসিবল। আমি এই স্প্ল্যাশ স্ক্রিনের সাহায্যে এটি ব্যবহার করেছি: android-developers.blogspot.de/2009/03/…
জোহান হিকসমা

39
এটি মোটেই সমাধান নয়। এই পদ্ধতিটি বলা হলে পৃষ্ঠাটি ইতিমধ্যে লোড হওয়ার কোনও গ্যারান্টি নেই।
হক

3
গুগলের পক্ষ থেকে এটি এমন একটি খারাপ নকশা। প্রায়শই সমস্ত সময় এই ক্রিয়াটি সম্পূর্ণ হয়ে গেলে আপনি পিতামাতার ক্রিয়াকলাপকে ঘিরে কোনও কিছু করতে চান, ওয়েব ভিউ নিজেই নয়। কোনও ইভেন্টে সাবস্ক্রাইব করার পরিবর্তে কোনও ক্রিয়াকে ওভাররাইড করা একটি সাধারণ অ্যান্টি-প্যাটার্ন এবং কারণ অ্যান্ড্রয়েড বিকাশকে আমি পছন্দ করি না।
রায়ান

6
এই পদ্ধতিটি লোড ফিনিসটির গ্যারান্টি দেয় না এবং যদি ইউআরএল লোড কিছু মধ্যবর্তী url নেভিগেশন নেয় তবে একাধিকবার কল করা যেতে পারে। সুতরাং এটি একাধিকবার বলা হয়। তবে এটি পরীক্ষা করার এক উপায় way
শিক্ষানবিশ

150

@ তবে এটি 100% সঠিক নয়। আপনার যদি কোনও পৃষ্ঠায় বেশ কয়েকটি আইফ্রেম থাকে তবে আপনার একাধিক অন পেজফিনিশড (এবং অন পেজ স্টারটেড) থাকবে। এবং যদি আপনার বেশ কয়েকটি পুনঃনির্দেশ থাকে তবে এটি ব্যর্থও হতে পারে। এই পদ্ধতির সমস্ত সমস্যার সমাধান করে (প্রায়):

boolean loadingFinished = true;
boolean redirect = false;

mWebView.setWebViewClient(new WebViewClient() {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) {
        if (!loadingFinished) {
            redirect = true;
        }

        loadingFinished = false;
        webView.loadUrl(urlNewString);
        return true;
    }

    @Override
    public void onPageStarted(WebView view, String url) {
        loadingFinished = false;
        //SHOW LOADING IF IT ISNT ALREADY VISIBLE  
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        if (!redirect) {
           loadingFinished = true;
            //HIDE LOADING IT HAS FINISHED
        } else {
            redirect = false; 
        }
    }
});

হালনাগাদ:

ডকুমেন্টেশন অনুসারে: এমবেড থাকা ফ্রেমের সামগ্রী পরিবর্তিত হলে অনপেজ স্টার্টযুক্ত কল করা হবে না, অর্থাত্ একটি লিঙ্কে ক্লিক করা যার লক্ষ্য একটি আইফ্রেমে।

আমি টুইটারে এর মতো একটি সুনির্দিষ্ট কেস পেয়েছি যেখানে কেবলমাত্র একটি পৃষ্ঠাফিনিশড বলা হয়েছিল এবং যুক্তিটি কিছুটা গোলমাল করল। এটি সমাধান করার জন্য আমি এক্স সেকেন্ডের পরে লোডিং অপসারণের জন্য একটি নির্ধারিত কাজ যুক্ত করেছি। অন্যান্য সমস্ত ক্ষেত্রে এটির প্রয়োজন নেই।

আপডেট 2 :

এখনকার অ্যান্ড্রয়েড ওয়েবভিউ বাস্তবায়নের সাথে:

boolean loadingFinished = true;
boolean redirect = false;

    mWebView.setWebViewClient(new WebViewClient() {

        @Override
        public boolean shouldOverrideUrlLoading(
                WebView view, WebResourceRequest request) {
            if (!loadingFinished) {
               redirect = true;
            }

            loadingFinished = false;
            webView.loadUrl(request.getUrl().toString());
            return true;
        }

        @Override
        public void onPageStarted(
                WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            loadingFinished = false;
            //SHOW LOADING IF IT ISNT ALREADY VISIBLE  
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            if (!redirect) {
               loadingFinished = true;
                //HIDE LOADING IT HAS FINISHED
            } else {
                redirect = false; 
            }
        }
    });

3
আপনি সম্ভবত পেজ স্টার্টডের ডকটিতে ক্যাভিয়েটটি লক্ষ্য করেছেন: এমবেডেড ফ্রেমের সামগ্রী পরিবর্তিত হলে অনপেজ স্টার্ট্ট বলা হবে না , অর্থাত্ একটি লিঙ্কে ক্লিক করা যার লক্ষ্য একটি আইফ্রেমে। সুতরাং এটি এই ক্ষেত্রে যুক্তি আঁকতে পারে। বিটিডাব্লু, @ পোলের সরলকরণ কি সত্যিই কাজ করে?
an00b

1
ভাল ধরা, ফ্রেম স্টাফ কখনও লক্ষ্য করা যায় না। আমি পোলের কোডটি চেষ্টা করি নি .. কেবলমাত্র আমি নিশ্চিত হতে পারি যে আমি যে কাজটি ব্যবহার করছি এটি উপরের কাজটি।
neteinstein

3
কেবল একটি ছোটখাটো সংশোধন। এটি আসলে "সার্বজনীন অন পেজ স্টারটেড (ওয়েবভিউ ভিউ, স্ট্রিং ইউআরএল, বিটম্যাপ ফ্যাভিকন)" এর পরিবর্তে "পাবলিক শূন্য অন পেজ স্টার্টড (ওয়েবভিউ ভিউ, স্ট্রিং ইউআরএল)"
মিঃ মাফেন

নতুন কিছু সাইটের জন্য কাজ করে না যা লোড শেষ করে না ... উদাহরণস্বরূপ, "অ্যাগোডা ডট কম"। আপনি অন পেজফিনিশড কলটি কখনই পাবেন না কারণ এটি পুনর্নির্দেশ।
কেনেই

আমি অন পেজফিনিশকে পুনঃনির্দেশের সময় দু'বার কল করা দেখেছি। তবে, আপনি যা বলেছেন "যদি আপনার একটি পৃষ্ঠায় বেশ কয়েকটি আইফ্রেম থাকে তবে আপনার একাধিক অন পেজফিনিশড (এবং onPageStarted) থাকতে হবে" অনপেজফিনিশডের ডকুমেন্টেশন অনুযায়ী সঠিক নয়: "এই পদ্ধতিটি কেবলমাত্র মূল ফ্রেমের জন্য ডাকা হয়।"
গারনেট

40

আমি @ নেটটিইনস্টেইএন (এবং @ পলান) সমাধানের পক্ষে বেশ আংশিক, তবে এটি একাধিক বুলেট বা রাষ্ট্র পর্যবেক্ষকগুলির পরিবর্তে একটি কাউন্টার দিয়ে প্রয়োগ করতে পেরেছি (কেবল অন্য একটি গন্ধ তবে আমি ভেবেছিলাম ভাগ করে নিতে পারে)। এটি সম্পর্কে একটি জেএস উপসর্গ আছে তবে আমি মনে করি যুক্তিটি বুঝতে একটু সহজ।

private void setupWebViewClient() {
    webView.setWebViewClient(new WebViewClient() {
        private int running = 0; // Could be public if you want a timer to check.

        @Override
        public boolean shouldOverrideUrlLoading(WebView webView, String urlNewString) {
            running++;
            webView.loadUrl(urlNewString);
            return true;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            running = Math.max(running, 1); // First request move it to 1.
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            if(--running == 0) { // just "running--;" if you add a timer.
                // TODO: finished... if you want to fire a method.
            }
        }
    });
}

2
আপনার কোডটি দুর্দান্ত দেখাচ্ছে। আমি আমার ওয়েবভিউয়ের জন্য একই চেষ্টা করছি যা এইচটিএমএল ডেটা url নয় লোড হয়। প্রথম ওয়েবভিউ দ্রুত এবং দ্বিতীয়টি লোড হওয়া শুরু হওয়ার আগেই এটি অন পেজফিনিশড ট্রিগার করে। সাধারণ দৃশ্য। চলমান = 1, চলমান = 2, চালনা = 1, - চালনা = 0। অস্বাভাবিক পরিস্থিতি যা ব্যর্থ হয় - দৌড়াতে = 1, - চালানো = 0, চলমান = 1 চালানো = 0
আজিত মেমানা

1
আরও একটি দৃশ্য রয়েছে, যখন কোনও কারণে কোনও অনুষ্ঠান বরখাস্ত করা হয় না তখন টোও অংশটি কখনই পৌঁছানো যাবে না। টাইমআউটগুলি পরীক্ষা করতে আপনার টাইমার দরকার need অথবা আপনি যখন জানবেন যে সবকিছু ঠিকঠাকভাবে লোড হয়েছে তখন আপনি জাভাস্ক্রিপ্টে রফতানি করা জাভা ফাংশনটিকে কল করতে পারেন। ডকুমেন্ট রেডি () এর মতো কিছু বা এরকম কিছু।
কোডবিট

শুধু running = 1;ভিতরে না কেন onPageStarted()?
চোলতস্কি

@ চোলিটস্কি কারণ সর্বাধিক 1 এবং 1 এর চেয়ে বড় সংখ্যা 1 নয়
ম্যাথু

25

আমি একটি মার্জিত সমাধানও পেয়েছি, এটি কঠোরভাবে পরীক্ষা করা হয়নি যদিও:

public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            if (m_webView.getProgress() == 100) {
                progressBar.setVisibility(View.GONE);
                m_webView.setVisibility(View.VISIBLE);
            }
        } 

2
আমি এটি পরীক্ষা করেছি এবং এটি নিখুঁতভাবে কাজ করছে, আপনি অবশ্যই অনপেজফিনিশড পদ্ধতির বাইরে থেকে কল করতে পারেন এবং সংক্ষিপ্ত বিরতিতে পরীক্ষা করতে কোনও হ্যান্ডলার ব্যবহার করতে পারেন - যদি আপনি ওয়েবভিউক্লিয়েন্ট শ্রেণিটি প্রসারিত করতে চান না।
গাল রোম

1
আমি বিশ্বাস করি এটি গৃহীত উত্তরের চেয়ে ভাল হতে পারে, আপনার কেবলমাত্র অনিয়ার পরীক্ষা করা দরকার এবং আপনি সেট হয়ে গেছেন।
ইভিনি 1_

1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
زيাদ

1
এইটির জন্য উত্সাহ দিন
Khdkls

23

আমি NeTeInStEiN এর কোডটি এরকম হতে সহজ করে তুলেছি :

mWebView.setWebViewClient(new WebViewClient() {
        private int       webViewPreviousState;
        private final int PAGE_STARTED    = 0x1;
        private final int PAGE_REDIRECTED = 0x2;

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) {
            webViewPreviousState = PAGE_REDIRECTED;
            mWebView.loadUrl(urlNewString);
            return true;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            webViewPreviousState = PAGE_STARTED;
            if (dialog == null || !dialog.isShowing())
                dialog = ProgressDialog.show(WebViewActivity.this, "", getString(R.string.loadingMessege), true, true,
                        new OnCancelListener() {

                            @Override
                            public void onCancel(DialogInterface dialog) {
                                // do something
                            }
                        });
        }

        @Override
        public void onPageFinished(WebView view, String url) {

            if (webViewPreviousState == PAGE_STARTED) {
                dialog.dismiss();
                dialog = null;
            }

        }
 });

এটি সহজেই বুঝতে পারা যায়, আগের কলব্যাকটি অনপেজ স্টার্টডে চালু থাকলে অনপেজফিনিশড, পৃষ্ঠাটি সম্পূর্ণ লোড হয়ে গেছে is


3
@PLlen PAGE_STARTED কখনও সাফ হয়ে যায় না? ওভাররাইড ইউআরএললয়েডিং () কখন না কল করা উচিত?
an00b

20

আপনি যদি কোনও অগ্রগতি বার প্রদর্শন করতে চান তবে কেবলমাত্র পৃষ্ঠার সমাপ্তির জন্য নয়, আপনাকে একটি অগ্রগতি পরিবর্তনের ইভেন্টটি শুনতে হবে:

mWebView.setWebChromeClient(new WebChromeClient(){

            @Override
            public void onProgressChanged(WebView view, int newProgress) {

                //change your progress bar
            }


        });

বিটিডাব্লু যদি আপনি কেবলমাত্র একটি নির্ধারিত অগ্রগতি বার প্রদর্শন করতে চান তবে পেজফিনিশড পদ্ধতিটি ওভাররাইডিং যথেষ্ট



5

আপনি দ্বারা অগ্রগতি স্তরের ট্রেস করতে পারেন getProgress পদ্ধতি WebView বর্গ।

অগ্রগতির স্থিতি শুরু করুন

private int mProgressStatus = 0;

তারপরে এ জাতীয় লোড করার জন্য অ্যাসিঙ্কটাস্ক:

private class Task_News_ArticleView extends AsyncTask<Void, Void, Void> {
    private final ProgressDialog dialog = new ProgressDialog(
            your_class.this);

    // can use UI thread here
    protected void onPreExecute() {
        this.dialog.setMessage("Loading...");
        this.dialog.setCancelable(false);
        this.dialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
        try {
            while (mProgressStatus < 100) {
                mProgressStatus = webview.getProgress();

            }
        } catch (Exception e) {

        }
        return null;

    }

    protected void onPostExecute(Void result) {
        if (this.dialog.isShowing()) {
            this.dialog.dismiss();
        }
    }
}

এমপ্রোগ্রেস্ট্যাটাস = ওয়েবভিউ.জেটপ্রোগ্রেস (); একটি ইউআই থ্রেড থেকে কল করা প্রয়োজন।
স্কাইনেট

5

উত্তরের জন্য ধন্যবাদ। এটি আমাকে সহায়তা করেছিল, তবে আমার প্রয়োজনের জন্য আমাকে এটি কিছুটা উন্নতি করতে হয়েছিল। আমার বেশ কয়েকটি পেজস্টার্ট এবং সমাপ্তি ছিল তাই আমি একটি টাইমার যুক্ত করেছি যা পরীক্ষা করে যদি পৃষ্ঠা পৃষ্ঠাটি একটি নতুন পেজস্টার্ট শুরু হয়। ঠিক আছে, খারাপ ব্যাখ্যা। কোডটি দেখুন :)

myWebView.setWebViewClient(new WebViewClient() {
        boolean loadingFinished = true;
        boolean redirect = false;

        long last_page_start;
        long now;

        // Load the url
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (!loadingFinished) {
                redirect = true;
            }

            loadingFinished = false;
            view.loadUrl(url);
            return false;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            Log.i("p","pagestart");
            loadingFinished = false;
            last_page_start = System.nanoTime();
            show_splash();
        }

        // When finish loading page
        public void onPageFinished(WebView view, String url) {
            Log.i("p","pagefinish");
            if(!redirect){
                loadingFinished = true;
            }
            //call remove_splash in 500 miSec
            if(loadingFinished && !redirect){
                now = System.nanoTime();
                new android.os.Handler().postDelayed(
                        new Runnable() {
                            public void run() {
                                remove_splash();
                            }
                        },
                        500);
            } else{
                redirect = false;
            }
        }
        private void show_splash() {
            if(myWebView.getVisibility() == View.VISIBLE) {
                myWebView.setVisibility(View.GONE);
                myWebView_splash.setVisibility(View.VISIBLE);
            }
        }
        //if a new "page start" was fired dont remove splash screen
        private void remove_splash() {
            if (last_page_start < now) {
                myWebView.setVisibility(View.VISIBLE);
                myWebView_splash.setVisibility(View.GONE);
            }
        }

});

2

জাভাস্ক্রিপ্ট হুকের জন্য অ্যান্ড্রয়েডের সক্ষমতা ব্যবহার করে যখন কোনও URL টি লোড হয়েছে তখন সনাক্ত করার জন্য এখানে একটি অভিনব পদ্ধতি । এই নিদর্শনটি ব্যবহার করে, আমরা অ্যান্ড্রয়েড রানটাইমের অভ্যন্তরে একটি নেটিভ পদ্ধতি কল উত্পন্ন করতে ডকুমেন্টের রাজ্যের জাভাস্ক্রিপ্টের জ্ঞানটি কাজে লাগাই। এই জাভাস্ক্রিপ্ট-অ্যাক্সেসযোগ্য কলগুলি ব্যবহার করে করা যেতে পারে@JavaScriptInterface টীকাটি ।

এই বাস্তবায়ন প্রয়োজন যে আমরা কল setJavaScriptEnabled(true)উপর WebViewএর সেটিংস, তাই এটি উপযুক্ত নাও হতে পারে আপনার আবেদন এর প্রয়োজনীয়তা, যেমন নিরাপত্তা উদ্বেগ উপর নির্ভর করে।

src / io / github / cawfree / webviewcallback / MainActivity.java (জেলি বিন, এপিআই স্তর 16)

package io.github.cawfree.webviewcallback;

/**
 *  Created by Alex Thomas (@Cawfree), 30/03/2017.
 **/

import android.net.http.SslError;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.JavascriptInterface;
import android.webkit.SslErrorHandler;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

/** An Activity demonstrating how to introduce a callback mechanism into Android's WebView. */
public class MainActivity extends AppCompatActivity {

    /* Static Declarations. */
    private static final String HOOK_JS             = "Android";
    private static final String URL_TEST            = "http://www.zonal.co.uk/";
    private static final String URL_PREPARE_WEBVIEW = "";

    /* Member Variables. */
    private WebView mWebView = null;

    /** Create the Activity. */
    @Override protected final void onCreate(final Bundle pSavedInstanceState) {
        // Initialize the parent definition.
        super.onCreate(pSavedInstanceState);
        // Set the Content View.
        this.setContentView(R.layout.activity_main);
        // Fetch the WebView.
        this.mWebView = (WebView)this.findViewById(R.id.webView);
        // Enable JavaScript.
        this.getWebView().getSettings().setJavaScriptEnabled(true);
        // Define the custom WebClient. (Here I'm just suppressing security errors, since older Android devices struggle with TLS.)
        this.getWebView().setWebViewClient(new WebViewClient() { @Override     public final void onReceivedSslError(final WebView pWebView, final SslErrorHandler pSslErrorHandler, final SslError pSslError) { pSslErrorHandler.proceed(); } });
        // Define the WebView JavaScript hook.
        this.getWebView().addJavascriptInterface(this, MainActivity.HOOK_JS);
        // Make this initial call to prepare JavaScript execution.
        this.getWebView().loadUrl(MainActivity.URL_PREPARE_WEBVIEW);
    }

    /** When the Activity is Resumed. */
    @Override protected final void onPostResume() {
        // Handle as usual.
        super.onPostResume();
        // Load the URL as usual.
        this.getWebView().loadUrl(MainActivity.URL_TEST);
        // Use JavaScript to embed a hook to Android's MainActivity. (The onExportPageLoaded() function implements the callback, whilst we add some tests for the state of the WebPage so as to infer when to export the event.)
        this.getWebView().loadUrl("javascript:" + "function onExportPageLoaded() { " + MainActivity.HOOK_JS + ".onPageLoaded(); }" + "if(document.readyState === 'complete') { onExportPageLoaded(); } else { window.addEventListener('onload', function () { onExportPageLoaded(); }, false); }");
    }

    /** Javascript-accessible callback for declaring when a page has loaded. */
    @JavascriptInterface @SuppressWarnings("unused") public final void onPageLoaded() {
        // Display the Message.
        Toast.makeText(this, "Page has loaded!", Toast.LENGTH_SHORT).show();
    }

    /* Getters. */
    public final WebView getWebView() {
        return this.mWebView;
    }

}

মাঝামাঝি / লেআউট / activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<WebView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/webView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
/>

মূলত, আমরা একটি অতিরিক্ত জাভাস্ক্রিপ্ট ফাংশন সংযোজন করছি যা নথির স্থিতি পরীক্ষা করতে ব্যবহৃত হয়। যদি এটি লোড হয়, আমরা onPageLoaded()অ্যান্ড্রয়েডের মধ্যে একটি কাস্টম ইভেন্ট চালু করি MainActivity; অন্যথায়, আমরা এমন ইভেন্ট শ্রোতার তালিকাভুক্ত করি যা একবার পৃষ্ঠার প্রস্তুত হয়ে ব্যবহারের পরে অ্যান্ড্রয়েড আপডেট করে window.addEventListener('onload', ...);

যেহেতু আমরা কলটি করার পরে এই স্ক্রিপ্টটি সংযোজন করছি this.getWebView().loadURL(""), তাই সম্ভবত এটি ঘটনার জন্য আমাদের 'শোনার' দরকার নেই , কারণ আমরা কেবল একটি পরপর কল করে জাভাস্ক্রিপ্ট হুক সংযোজন করার সুযোগ পাই loadURLপৃষ্ঠাটি একবারে লোড হয়ে গেলে।


দুর্দান্ত সমাধান, যা সাধারণত কাজ করে। Https://reddit.com / r / প্রকৃতি (সাধারণত রেডডিট সহ) নিয়ে আমার সমস্যা হচ্ছে , যখন আপনি কোনও থ্রেডে ক্লিক করেন এবং থ্রেডটি লোড হয়ে যায়, আমি সেই ইভেন্টটি ধরতে সক্ষম হই না। তুমি কি আমাকে সাহায্য করতে পারবে?
প্রিমো ক্রলজ

@ প্রিমোক্র্লজ এই শুনে আপনারা কিছুটা সাফল্য পেয়েছেন শুনে খুশি হলেন ... বিশেষভাবে কী প্রস্তাব করবেন তা আমি নিশ্চিত নই, তবে যদি আপনি জানেন যে কোনও ধরণের সার্বজনীন ইভেন্টগুলি ট্রিগার হয়ে গেছে যে আপনি হুক করতে পারেন, উদাহরণস্বরূপ যখন মন্তব্য গণনা আপডেট হয়েছে, আপনি এটি উত্স হিসাবে ব্যবহার করতে পারেন। আপনি কি বিবেচনা করেছেন যে সম্ভবত রেডডিটের এপিআই সরাসরি আঘাত করে আপনার সমস্যাটি ঠিক করা যেতে পারে ?
ম্যাপসি

1
ধন্যবাদ, আমি ঘটনাসমূহে ট্রিগার হওয়াতে আরও একবার নজর রাখব এবং সেগুলির মধ্যে একটিতে আটকানোর চেষ্টা করব। আমি এপিআই সম্পর্কে সচেতন, এবং ভবিষ্যতে এটি ব্যবহার করে আরও দৃust় সমাধান বাস্তবায়নের চেষ্টা করব। ধন্যবাদ!
প্রিমো ক্রলজ

1

কেবল অগ্রগতি বার দেখানোর জন্য, "অনপেজস্টার্ট্ট" এবং "অনপেজফিনিশড" পদ্ধতিগুলি যথেষ্ট; তবে আপনি যদি একটি "ইস_লোডিং" পতাকা পেতে চান (পৃষ্ঠা পুনর্নির্দেশগুলির পাশাপাশি, ...), এই পদ্ধতিগুলি অন-সিকোয়েন্সিং দ্বারা সম্পাদিত হতে পারে, যেমন "onPageStarted> onPageSarted> onPageFinished> onPageFinished" সারি।

তবে আমার সংক্ষিপ্ত পরীক্ষা দিয়ে (এটি নিজেই পরীক্ষা করুন)), "onProgressChanged" পদ্ধতির মানগুলির সারিটি "0-100> 0-100> 0-100> ..."

private boolean is_loading = false;

webView.setWebChromeClient(new MyWebChromeClient(context));

private final class MyWebChromeClient extends WebChromeClient{
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        if (newProgress == 0){
            is_loading = true;
        } else if (newProgress == 100){
            is_loading = false;
        }
        super.onProgressChanged(view, newProgress);
    }
}

is_loading = falseক্রিয়াকলাপের উপরে " " সেটও করুন, যদি এটি স্থির পরিবর্তনশীল হয় কারণ পৃষ্ঠা সমাপ্তির আগে ক্রিয়াকলাপ শেষ হতে পারে।


0

Url সহ লোড করা হচ্ছে SwipeRefreshLayoutএবং ProgressBar:

UrlPageActivity.java:

    WebView webView;
    SwipeRefreshLayout _swipe_procesbar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_url_page);


        String url = "http://stackoverflow.com/";

        _swipe_procesbar = (SwipeRefreshLayout)findViewById(R.id.url_path_swipe_procesbar);

        _swipe_procesbar.post(new Runnable() {
                                  @Override
                                  public void run() {
                                      _swipe_procesbar.setRefreshing(true);
                                  }
                              }
        );

        webView = (WebView) findViewById(R.id.url_page_web_view);
        webView.getSettings().setJavaScriptEnabled(true);

        webView.setWebViewClient(new WebViewClient() {
            public void onPageFinished(WebView view, String url) {
                _swipe_procesbar.setRefreshing(false);
                _swipe_procesbar.setEnabled(false);
            }
        });
        webView.loadUrl(url);
    }

activity_url_page.xml:

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/url_path_swipe_procesbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context="com.test.test1.UrlPageActivity">


            <WebView
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:id="@+id/url_page_web_view" />
        </RelativeLayout>

</android.support.v4.widget.SwipeRefreshLayout>

0

এখানে একটি পদ্ধতি যা আপনাকে Runnableকোনও নির্দিষ্ট ওয়েব ঠিকানা লোডিং শেষ হয়ে গেলে কার্যকর করতে একটি নিবন্ধকরণ করতে দেয় । আমরা একে সংযুক্ত Runnableএকটি সংশ্লিষ্ট URL সহ Stringএকটি Map, এবং আমরা ব্যবহার WebViewএর getOriginalUrl()পদ্ধতি উপযুক্ত কলব্যাক পছন্দ করে নিন।

package io.github.cawfree.webviewcallback;

/**
 *  Created by Alex Thomas (@Cawfree), 30/03/2017.
 **/

import android.net.http.SslError;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.webkit.SslErrorHandler;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import java.util.HashMap;
import java.util.Map;

/** An Activity demonstrating how to introduce a callback mechanism into Android's WebView. */
public class MainActivity extends AppCompatActivity {

    /* Member Variables. */
    private WebView               mWebView;
    private Map<String, Runnable> mCallbackMap;

    /** Create the Activity. */
    @Override protected final void onCreate(final Bundle pSavedInstanceState) {
        // Initialize the parent definition.
        super.onCreate(pSavedInstanceState);
        // Set the Content View.
        this.setContentView(R.layout.activity_main);
        // Fetch the WebView.
        this.mWebView     = (WebView)this.findViewById(R.id.webView);
        this.mCallbackMap = new HashMap<>();
        // Define the custom WebClient. (Here I'm just suppressing security errors, since older Android devices struggle with TLS.)
        this.getWebView().setWebViewClient(new WebViewClient() {
            /** Handle when a request has been launched. */
            @Override public final void onPageFinished(final WebView pWebView, final String pUrl) {
                // Determine whether we're allowed to process the Runnable; if the page hadn't been redirected, or if we've finished redirection.
                if(pUrl.equals(pWebView.getOriginalUrl())) {
                    // Fetch the Runnable for the OriginalUrl.
                    final Runnable lRunnable = getCallbackMap().get(pWebView.getOriginalUrl());
                    // Is it valid?
                    if(lRunnable != null) { lRunnable.run(); }
                }
                // Handle as usual.
                super.onPageFinished(pWebView, pUrl);
            }
            /** Ensure we handle SSL state properly. */
            @Override public final void onReceivedSslError(final WebView pWebView, final SslErrorHandler pSslErrorHandler, final SslError pSslError) { pSslErrorHandler.proceed(); }
        });
        // Assert that we wish to visit Zonal's website.
        this.getWebView().loadUrl("http://www.zonal.co.uk/");
        // Align a Callback for Zonal; this will be serviced once the page has loaded.
        this.getCallbackMap().put("http://www.zonal.co.uk/", new Runnable() {     @Override public void run() { /* Do something. */ } });
    }

    /* Getters. */
    public final WebView getWebView() {
        return this.mWebView;
    }

    private final Map<String, Runnable> getCallbackMap() {
        return this.mCallbackMap;
    }

}

0

অনপেজফিনশেড পদ্ধতিটি কল করা বা অগ্রগতি 100% এ পৌঁছে দেওয়ার সাথে সাথে উপস্থাপনাটি সমাপ্ত হবে না যাতে উভয় পদ্ধতিই আপনাকে গ্যারান্টি দেয় না যে দর্শন সম্পূর্ণরূপে রেন্ডার হয়েছিল was

তবে আপনি ইতিমধ্যে কীভাবে রেন্ডার করা হয়েছে এবং কী এখনও রেন্ডারিং করছে সেটি অনলয়েডআর রিসোর্স পদ্ধতি থেকে বের করতে পারেন। এবং এই পদ্ধতিটি বেশ কয়েকবার বলা হয়।

        @Override
        public void onLoadResource(WebView view, String url) {
            super.onLoadResource(view, url);
           // Log and see all the urls and know exactly what is being rendered and visible. If you wanna know when the entire page is completely rendered, find the last url from log and check it with if clause and implement your logic there.
            if (url.contains("assets/loginpage/img/ui/forms/")) {
                // loginpage is rendered and visible now.
               // your logic here.

            }
        }

0

এটির উচিত এটি ব্যবহার করুন `

ওয়েবভিউ.সেটউইভভিউক্লিয়েন্ট (অবজেক্ট: ওয়েবভিউক্লিয়েন্ট () {

override fun onLoadResource(WebView view, String url) {
     //call loadUrl() method  here 
     // also check if url contains partOfUrl, if not load it differently.
     if(url.contains(partOfUrl, true)) {
         //it should work if you reach inside this if scope.
     } else if(!(currentUrl.startWith("w", true))) {
         webView.loadurl("www.$currentUrl")

     } else if(!(currentUrl.startWith("h", true))) {
         webView.loadurl("https://$currentUrl")

     } else { ...}


 }

override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) {
   // you can call again loadUrl from here too if there is any error.
}

// এই সমস্ত পদ্ধতি কীভাবে একের পর এক বলা হয় এবং ব্রেক পয়েন্টের সাথে ডিবাগ করার সময় তারা কীভাবে আচরণ করে তা দেখতে আপনার অনারাইভারেরর মতো ত্রুটির জন্য অন্যান্য ওভাররাইড পদ্ধতি ওভাররাইড করা উচিত। ``


-1

কোটলিন ব্যবহারকারীদের জন্য:

webView.webViewClient = object : WebViewClient() {
            override fun onPageFinished(view: WebView?, url: String?) {
                // do your logic
            }
        }

এমন অনেকগুলি পদ্ধতি রয়েছে যা আপনি যদিও ওভাররাইড করতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.