سؤال

لقد قمت بتحميل عنوان URL خارجي في بلدي WebView. الآن ما أحتاجه هو أنه عندما ينقر المستخدم على الروابط الموجودة على الصفحة المحملة ، يجب أن يعمل مثل المتصفح العادي وفتح الرابط في نفسه WebView. لكنه يفتح المتصفح الافتراضي وتحميل الصفحة هناك؟

لقد قمت بتمكين JavaScript. ولكن لا يزال لا يعمل. هل نسيت شيئا؟

هل كانت مفيدة؟

المحلول

إذا كنت تستخدم WebView سيكون عليك اعتراض النقرات بنفسك إذا كنت لا تريد سلوك Android الافتراضي.

يمكنك مراقبة الأحداث في WebView باستخدام WebViewClient. الطريقة التي تريدها هي shouldOverrideUrlLoading(). يتيح لك ذلك أداء الإجراء الخاص بك عند تحديد عنوان URL معين.

قمت بتعيين WebViewClient من الخاص بك WebView باستخدام setWebViewClient() طريقة.

إذا نظرت إلى WebView عينة في SDK هناك مثال يفعل ما تريده فقط. الأمر بسيط مثل:

private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}

نصائح أخرى

في بعض الحالات ، قد تحتاج إلى تجاوز من OnloadResource إذا حصلت على إعادة توجيه لا تؤدي إلى تشغيل طريقة تحميل عنوان URL. في هذه الحالة ، جربت ما يلي:

@Override
public void onLoadResource(WebView view, String url)
{
    if (url.equals("http://redirectexample.com"))
    {
        //do your own thing here
    }
    else
    {
        super.onLoadResource(view, url);
    }           
}

الرسمية توثيق يقول ، انقر على رابط في WebView سيقوم بتشغيل تطبيق يتولى عناوين URL. تحتاج إلى تجاوز هذا السلوك الافتراضي

    myWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });

أو إذا لم يكن هناك منطق مشروط في الطريقة ببساطة قم بذلك

myWebView.setWebViewClient(new WebViewClient());

أضف هذا الخطين في الكود الخاص بك -

mWebView.setWebChromeClient(new WebChromeClient()); 
mWebView.setWebViewClient(new WebViewClient());

طريقة boolean shouldOverrideUrlLoading(WebView view, String url) تم إهماله في API 24. إذا كنت تدعم أجهزة جديدة ، فيجب عليك استخدامها boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request).

يمكنك استخدام كليهما من خلال القيام بشيء كهذا:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    newsItem.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            view.loadUrl(request.getUrl().toString());
            return true;
        }
    });
} else {
    newsItem.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    });
}

كان إجابة Arulx Z بالضبط ما كنت أبحث عنه.

أنا أكتب تطبيقًا مع درج التنقل باستخدام RecyClerview و WebViews ، للحفاظ على تصفح الويب داخل التطبيق بغض النظر عن الارتباطات التشعبية التي تم النقر عليها (وبالتالي عدم إطلاق متصفح الويب الخارجي). لذلك سيكون كافياً لوضع خطين من التعليمات البرمجية التالية:

mWebView.setWebChromeClient(new WebChromeClient()); mWebView.setWebViewClient(new WebViewClient());

بالضبط تحت بيان WebView الخاص بك.

إليك مثال على رمز WebView الذي تم تنفيذه:

public class WebView1 extends AppCompatActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    WebView wv = (WebView) findViewById(R.id.wv1); //webview statement
    wv.setWebViewClient(new WebViewClient());    //the lines of code added
    wv.setWebChromeClient(new WebChromeClient()); //same as above

    wv.loadUrl("http://www.google.com");
}}

وبهذه الطريقة ، سيتم تحميل كل رابط تم النقر عليه في موقع الويب داخل عرض الويب الخاص بك. (باستخدام Android Studio 1.2.2 مع تحديث جميع SDK)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top