نمایش صفحات وب در اکتیویتی توسط WebView

به نام خدا. در این مبحث ابتدا به معرفی WebView در اندروید پرداخته سپس با نحوه فراخوانی و نمایش صفحات وب (HTML) آنلاین و آفلاین آشنا می‌شویم.

WebView چیست؟

آموزش کار با WebView در اندروید

WebView یکی دیگر از View (Widget)های کاربردی پلتفرم اندروید است. توسط این View می‌توانیم یک صفحه‌ی وب آنلاین یا آفلاین (لوکال) را درون یک Activity به کاربر نمایش دهیم. درست مانند باز کردن یک وب‌سایت در مرورگری مانند Chrome با این تفاوت که کاربر، صفحه وب را درون برنامه مشاهده می‌کند و به یک مرورگر مستقل منتقل نمی‌شود.
در WebView امکان کنترل محتوای دریافتی از صفحه‌ی وب وجود دارد. به عنوان مثال می‌توانیم تعیین کنیم کدهای JavaScript (جاوا اسکریپت) که در طراحی صفحات وب با کدهای HTML ترکیب می‌شوند امکان اجرا داشته باشد یا خیر.

کاربردهای WebView در اندروید

کاربردهای متعددی را می‌توان برای این View ذکر کرد. یکی از مثال‌های بارز و پرکاربرد، نمایش نقشه‌های آنلاین مانند Google Maps است. اگر قصد دارید محل شرکت خود را روی یک نقشه نشان دهید، استفاده از WebView یکی از گزینه‌های ساده و در دسترس است.
یک کاربرد دیگر، نمایش محتوایی است که مرتب در حال تغییر و بروزرسانی است. تعدادی از اپلیکیشن‌های مطرح (ازجمله اینستاگرام) برای نمایش متن “شرایط و قوانین استفاده از اپلیکیشن” از یک وب ویو استفاده می‌کنند. درنتیجه کاربر با مراجعه به این صفحه (اکتیویتی) متن قوانین را به صورت آنلاین و بروز از سرورهای اینستاگرام دریافت می‌کند. مزیت این روش در این است که برای اصلاح و بروزرسانی متن نیازی به انجام تغییرات درون خود برنامه و انتشار نسخه جدید نیست و کاربر بدون نیاز به بروزرسانی اپلیکیشن، هربار که قصد مطالعه قوانین برنامه را داشته باشد، آخرین نسخه را مشاهده می‌کند.
یا فرض کنید یک وب‌سایت فروشگاهی راه اندازی کرده‌اید و به دلایلی (وقت کم، هزینه‌ی زیاد و…) امکان ساخت اپلیکیشن کامل آنرا ندارید. در اینجا به راحتی می‌توان همان وب‌سایت را در قالب یک اپلیکیشن موبایلی به کاربر عرضه کرد. درست مانند این است که کاربر وارد یک مرورگر شده و آدرس وب‌سایت شما را وارد کند. تنها تفاوت در این است که نیازی به وارد کردن آدرس نیست و به محض اجرای برنامه، وب‌سایت لود می‌شود.

نکته: استفاده از این قابلیت برای نمایش یک وب‌سایت کامل در قالب یک اپلیکیشن موبایلی، راهکار استانداردی نیست و تجربه کاربری (UX) قابل قبولی را رقم نمی‌زند. هنگامی از این راهکار استفاده کنید که هیچ گزینه‌ی دیگری روی میز نباشد! در این صورت وب‌سایت باید برای انواع صفحات نمایش بهینه شده باشد، یعنی پیاده سازی طراحی واکنشگرا (Responsive) الزامی است.

در ادامه و در قالب یک پروژه شما را با WebView و قابلیت‌های آن آشنا می‌کنم.

ساخت پروژه‌ WebView در اندروید استودیو

یک پروژه‌ی جدید در اندروید استودیو با نام WebView می‌سازم. اکتیویتی پیش فرض را از نوع Empty Activity انتخاب می‌کنم.
همانطور که در مبحث آموزش کتابخانه Retrofit اندروید اشاره شد، جهت امکان برقراری ارتباط بین اپلیکیشن و شبکه (اینترنت) نیاز به تعریف مجوز دسترسی (Permission) داریم. بنابراین مجوز مربوطه را به مانیفست پروژه اضافه می‌کنم:

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ir.android_studio.webview">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

سپس در لایه‌ی رابط کاربری اکتیویتی (UI) در حالت Design ویجت WebView را روی صفحه‌ی پیش نمایش کشیده (Drag & drop) یا به صورت دستی و در حالت Text، تگ آنرا به Layout اضافه می‌کنم:

ویجت WebView در اندروید استودیو

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<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=".MainActivity">

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

</RelativeLayout>

حالا فایل جاوای اکتیویتی یعنی MainActivity.java را به صورت زیر تکمیل می‌کنم:

package ir.android_studio.webview;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.webkit.WebView;

public class MainActivity extends AppCompatActivity {

    private WebView mWebView;

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

        mWebView = findViewById(R.id.web_view);

        String siteUrl = "https://android-studio.ir";
        mWebView.loadUrl(siteUrl);

    }
}

ابتدا یک شیء از کلاس WebView با نام دلخواه mWebView ساختم. سپس درون متد onCreate این شیء را به View مربوطه متصل کردم. در اینجا قصد دارم آدرس https://android-studio.ir را در این اکتیویتی نمایش دهم که این امر توسط متد loadUrl صورت می‌پذیرد. همانطور که از نام این متد پیداست، Url مدنظر ما بارگزاری (load) می‌شود. در نهایت محتوای این آدرس به mWebView که به ویجت web_view متصل شده ارسال می‌گردد.
پروژه را اجرا می‌کنم. اگر شبیه ساز یا دیوایس دسترسی به اینترنت داشته و وب‌سایت نیز در دسترس باشد، باید محتوای آن را نمایش دهد.

نمایش وب سایت در اپلیکیشن اندروید توسط WebView

صفحه‌ی وب با موفقیت درون اکتیویتی لود شده و می‌توانم به بالا و پایین اسکرول کنم.
اگر هدف من از ساخت این اپلیکیشن، تبدیل وب‌سایت به یک برنامه‌ی موبایلی باشد شاید تنها کار لازم حذف ActionBar است که در مبحث آموزش ساخت Toolbar در اندروید با نحوه‌ی انجام آن آشنا شدیم. کافیست در فایل styles.xml استایل مربوط به Theme متریال پروژه را به Theme.AppCompat.Light.NoActionBar تغییر دهم:

styles.xml:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

حذف اکشن بار در اندروید استودیو

بجز loadUrl متدهای دیگری مانند canGoBack()، canGoForward()، clearHistory()، getUrl()، getTitle() و… قابل استفاده است که در صورت نیاز می‌توانید در مورد هرکدام جستجو کنید.
در ابتدای مبحث گفتیم در WebView امکان کنترل و اعمال تنظیمات بر روی اجزای دریافتی از صفحه‌ی وب را داریم.
به عنوان مثال اجرای کدهای جاوا اسکریپت (جاوا اسکریپت را با جاوا اشتباه نگیرید) به صورت پیش فرض غیر فعال است که این امر باعث می‌شود منوی سایت من باز نشود. زیرا باز و بسته شدن زیرمنوها توسط کتابخانه‌ی جی‌کوئری (jQuery) که با جاوا اسکریپت نوشته شده مدیریت و اجرا می‌شود.

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mWebView = findViewById(R.id.web_view);

    String siteUrl = "https://android-studio.ir";
    mWebView.loadUrl(siteUrl);

    mWebView.getSettings().setJavaScriptEnabled(true);

}

با استفاده از متد getSettings() امکان اجرای تنظیمات وسیعی وجود دارد که برای هرکدام یک متد مشخص تهیه شده. همانطور که در کد بالا ملاحظه می‌کنید با استفاده از متد setJavaScriptEnabled و مقدار true برای آن، کدهای جاوا اسکریپت فعال (Enable) می‌شوند. مجدد پروژه را Run یا Apply Changes می‌کنم تا تغییرات روی شبیه ساز بروزرسانی شود:

متد setJavaScriptEnabled برای فعالسازی جاوا اسکریپت در WebView

متدهای دیگری نیز در اختیار توسعه دهنده قرار گرفته تا بتواند بر حسب نیاز خود، سایر قسمت‌ها را شخصی سازی کند:

متدهای مربوط به getSettings در WebView

برای مثال اولین مورد موجود در لیست (setDefaultFontSize) برای تعیین اندازه فونت بکار می‌رود.
یا با استفاده از متدهای زیر، دکمه‌های زوم به صفحه اضافه می‌شوند:

mWebView.getSettings().setSupportZoom(true);
mWebView.getSettings().setBuiltInZoomControls(true);
mWebView.getSettings().setDisplayZoomControls(true);

متد زوم setSupportZoom در WebView

(دکمه‌های Zoom هنگام اسکرول صفحه ظاهر می‌شوند)
تعدادی دیگر از قابلیت‌ها را توسط متد setWebViewClient می‌توان مدیریت کرد. جهت مدیریت بهتر کدها ابتدا یک کلاس داخلی با نام دلخواه mWebViewClient درون اکتیویتی و بعد از بلاک مربوط به متد onCreate می‌سازم که از کلاس WebViewClient ارث بری می‌کند:

public class MainActivity extends AppCompatActivity {

    private WebView mWebView;

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

        mWebView = findViewById(R.id.web_view);

        String siteUrl = "https://android-studio.ir";
        mWebView.loadUrl(siteUrl);

        mWebView.getSettings().setJavaScriptEnabled(true);

        mWebView.getSettings().setSupportZoom(true);
        mWebView.getSettings().setBuiltInZoomControls(true);
        mWebView.getSettings().setDisplayZoomControls(true);

    }

    private class mWebViewClient extends WebViewClient {


    }

}

اولین متدی که به این کلاس اضافه می‌کنم مربوط به مدیریت کلیک روی لینک‌های موجود در صفحه‌ی وب است. روی لینک یکی از مطالب وب‌سایت کلیک می‌کنم:

WebView Browser Tester

مشاهده می‌کنید صفحه‌ی جدید در قالب یک مرورگر با نام WebView Browser Tester باز شده که چندان مطلوب نیست. متد shouldOverrideUrlLoading لینک‌ها را مستقیما درون خود وب‌ویو لود کرده و به مرورگر دیگری منتقل نمی‌شود.

متد shouldOverrideUrlLoading در WebView

از لیست متدی را انتخاب می‌کنم که پارامترهای ورودی آن از نوع WebView با نام view و String با نام url هستند. این متد با این دو پارامتر مدتیست از سوی اندروید منقضی یا Deprecated تلقی شده با اینحال همچنان استفاده می‌شود.

private class mWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {

        view.loadUrl(url);
        return true;

    }
}

متد را به اینصورت اصلاح و تکمیل کردم. حالا با لمس یا کلیک روی هر لینک، آدرس موردنظر در قالب url توسط loadUrl لود و به view منتقل شده که باعث می‌شود صفحه‌ی جدید مستقیما درون WebView نمایش داده شود.
قبل از اجرا و تست این متد، دو متد پرکاربرد دیگر را معرفی می‌کنم. متدهای onPageStarted و onPageFinished به ترتیب، زمان بارگزاری صفحه و پایان این پروسه را برمی‌گردانند.

private class mWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {

        view.loadUrl(url);
        return true;

    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
    }
    
}

برای مثال می‌توان در متد onPageStarted یک ProgressBar را اجرا کرده و در onPageFinished آنرا متوقف نمود. با اینحال برای درک بهتر و همچنین به حاشیه نرفتن مبحث آموزشی، از Toast استفاده می‌کنم:

private class mWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {

        view.loadUrl(url);
        return true;

    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {

        Toast.makeText(MainActivity.this, "Loading page...", Toast.LENGTH_SHORT).show();

    }

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

        Toast.makeText(MainActivity.this, "Loading finished", Toast.LENGTH_SHORT).show();
        
    }

}

در نهایت متد setWebViewClient را درون onCreate تعریف کرده و ورودی آنرا کلاس mWebViewClient قرار می‌دهم:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mWebView = findViewById(R.id.web_view);

    String siteUrl = "https://android-studio.ir";
    mWebView.loadUrl(siteUrl);

    mWebView.getSettings().setJavaScriptEnabled(true);

    mWebView.getSettings().setSupportZoom(true);
    mWebView.getSettings().setBuiltInZoomControls(true);
    mWebView.getSettings().setDisplayZoomControls(true);

    mWebView.setWebViewClient(new mWebViewClient());

}

پروژه را اجرا کرده و روی یک لینک کلیک می‌کنم:

آموزش کار با متد onPageStarted در WebView

آموزش کار با متد onPageFinished در WebView

مشاهده می‌کنید صفحه‌ی جدید درون خود WebView بارگزاری شد نه یک مرورگر. همچنین پیغام‌های بارگزاری (Loading page…) و اتمام بارگزاری (Loading finished) را می‌بینید که در قالب Toast چاپ شده‌اند.

سورس کامل MainActivity.java:

package ir.android_studio.webview;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Bitmap;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private WebView mWebView;

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

        mWebView = findViewById(R.id.web_view);

        String siteUrl = "https://android-studio.ir";
        mWebView.loadUrl(siteUrl);

        mWebView.getSettings().setJavaScriptEnabled(true);

        mWebView.getSettings().setSupportZoom(true);
        mWebView.getSettings().setBuiltInZoomControls(true);
        mWebView.getSettings().setDisplayZoomControls(true);

        mWebView.setWebViewClient(new mWebViewClient());

    }

    private class mWebViewClient extends WebViewClient {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            view.loadUrl(url);
            return true;

        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {

            Toast.makeText(MainActivity.this, "Loading page...", Toast.LENGTH_SHORT).show();

        }

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

            Toast.makeText(MainActivity.this, "Loading finished", Toast.LENGTH_SHORT).show();

        }

    }

}

نمایش صفحات HTML محلی و آفلاین در WebView

در قسمت قبل محتوای مدنظر ما از یک url و بصورت آنلاین دریافت می‌شد که مستلزم برقراری ارتباط اینترنتی بود. اما ممکن است در مواردی نیاز به نمایش محتوایی با فرمت وب و HTML بصورت آفلاین داشته باشیم. به عنوان مثال طراحی یک یا چند صفحه‌ی خاص از اپلیکیشن برای توسعه دهنده‌ای که با اصول طراحی صفحات وب نیز آشناست، ممکن است پیاده سازی آن در فرمت HTML و CSS ساده‌تر از کار با Layout های اندروید باشد. یا ممکن است شخص بخواهد یک اپلیکیشن کتابچه را به‌طور کامل توسط صفحات وب پیاده‌سازی کند. محتوای این صفحات، ایستا (استاتیک) است و نیازی به اتصال به سرور نیست.
در این روش فایل‌های مرتبط با صفحات وب را در فولدر assets پروژه قرار می‌دهیم. این فولدر به صورت پیش‌فرض وجود ندارد. برای ساخت آن در قسمت نمایش ساختار پروژه روی app راست کلیک کرده و مسیر
New > Folder > Assets Folder
را دنبال کرده و در پنجره‌ی باز شده Finish بزنید تا فولدر ساخته شود:

ساخت فولدر assets در پروژه اندروید استودیو

اضافه کردن فولدر assets در پروژه اندروید استودیو

همچنین می‌توان این کار را در خارج از محیط اندروید استودیو و در محل قرارگیری پروژه، این فولدر را اضافه کرد:

ساخت فولدر assets در File Explorer سیستم عامل

من یک صفحه‌ی ساده‌ی وب ساختم که شامل یک فایل html و یک css است:

نمایش فایل HTML لوکال در WebView اندروید

این دو فایل را کپی کرده و در محیط اندروید استودیو یا File explorer سیستم عامل درون فولدر paste می‌کنم:

اضافه کردن صفحات وب HTML به فولدر assets در اندروید استودیو

در مرحله آخر برای اجرای این فایلِ محلی بجای url وب‌سایت، آدرس زیر را در siteUrl جایگزین آدرس وب‌سایت می‌کنم:

String siteUrl = "file:///android_asset/index.html";

به اینصورت فایل index.html موجود در فولدر assets پروژه اندرویدی در WebView اجرا می‌شود:

نمایش صفحات وب آفلاین در WebView اندروید

در این پروژه صرفا جهت آشنایی با نحوه‌ی اضافه کردن صفحات وب به اپلیکیشن یک صفحه‌ی HTML بسیار ساده را استفاده کردم اما پیچیده‌ترین صفحات وب (شامل متن، تصویر، کدهای جاوا اسکریپت و..) را به تعداد زیاد و نامحدود می‌توان در اپلیکیشن‌های اندرویدی بکار برد.

مطالعه‌ی بیشتر:

https://developer.android.com/reference/android/webkit/WebView
https://developer.android.com/reference/android/webkit/WebSettings
https://developer.android.com/guide/webapps/webview

توجه: سورس پروژه درون پوشه Exercises قرار دارد

دانلود فایل این آموزش با فرمت PDF به همراه سورس پروژه
تعداد صفحات : ۲۰
حجم : ۲ مگابایت
قیمت : رایگان
دانلود رایگان با حجم ۲ مگابایت لینک کمکی
این مطلب چقدر برایتان مفید بود؟ لطفا امتیاز دهید
4.4/5 - (21 امتیاز)
پرسش‌ها و دیدگاه‌های کاربران
دوره آموزش برنامه نویسی اندروید
دوره آموزش برنامه نویسی اندروید

با دریافت این دوره به تمامی آموزش‌های غیر رایگان و رایگان موجود در وب سایت دسترسی دارید که تخفیفی برای آموزش‌های غیر رایگان نیز درنظر گرفته شده. این پکیج به دو صورت دانلودی و ارسال پستی ارائه می‌گردد.
آموزش‌های اندروید استودیو در دو دسته «پایه» و «تکمیلی» منتشر می‌شوند.
آموزش‌های پایه شامل مباحث اصلی و ضروری و آموزش‌های تکمیلی مطالبی است که می‌بایست در کنار مطالب اصلی بررسی شود.
با خرید این دوره، به تمامی آموزش‌های غیر رایگانی که در آینده منتشر می‌شود نیز به صورت رایگان دسترسی خواهید داشت!

یک دیدگاه بنویسید

پرسش‌های زیر تایید و پاسخ داده نـــخواهند شد:
۱: جزء موارد مطرح شده در صفحات مشکلات و پرسش‌های رایج و بروزرسانی‌های محتوای آموزشی باشد
۲: سوال قبلا توسط کاربران در دیدگاه‌ها مطرح و پاسخ داده شده باشد
۳: پرسش خارج از مبحث آموزشی موجود در این صفحه باشد

  • زهرا گفت:

    سلام استاد
    اینکه گفتید وب ویو برای صفحاتی که مرتبا تغییر می کنند استفاده می شود ، همانند صفحه ی قوانین اینستاگرام ، اولین چیزی که قبل از صفحه ی قوانین به نظر می آید ، صفحه ای است که پست های کاربران دیگر را به ما نشان می دهد . منظور از پست ، همان تصاویر یا ویدیوهایی است که هر کس می تواند اضافه کند .
    خب این صفحه ی پست ها که دائما باید به صورت بروز نشان داده شود و دائما هم باید برای نمایش بروز ، به دیتابیس وصل باشد . سوال من که خیلی ذهنم را مشغول کرده ، این است که آیا این قسمت هم باید در وب ویو نمایش داده شود ؟

    • سیدمهدی مطهری گفت:

      هرچیزی رو میشه با وب ویو نمایش داد ولی خب در اپ ها بجز موارد استثناء که محتوای ساده ای مثل قوانین و… رو نشون میده، استفاده نمیشه. مگر در موردی که نخواد برای توسعه اپ نیتیو موبایلی هزینه بشه و تصمیم بر استفاده کامل از وب سایت به عنوان نسخه موبایل باشه

  • مهرداد گفت:

    دوستانی وب ویو مشکل دانلود داره نمیتونه دانلود کنه کد زیر اضافه کنید

    myWebView.setDownloadListener(new DownloadListener()

    {

    public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength)

    {

    //download file using web browser

    Intent i = new Intent(Intent.ACTION_VIEW);

    i.setData(Uri.parse(url));

    startActivity(i);

    }

    });

    اگه مشکل دکمه بک دارید یعنی وقتی بک میزنید کل برنامه بسته میشه کد زیر استفاده کنید

    Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(event.getAction() == KeyEvent.ACTION_DOWN){
    switch(keyCode)
    {
    case KeyEvent.KEYCODE_BACK:
    if(webView.canGoBack()){
    webView.goBack();
    }else{
    finish();
    }
    return true;
    }

    }
    return super.onKeyDown(keyCode, event);
    }

  • مهرداد پاسیان گفت:

    سلام. من میخوام چند وب ویو تو یک برنامه داشته باشم به این صورت که مثلا برنامه بعد از لود شن صفحه اسپلش اسکرین به صفحه هوم برسه که اونجا مثلا زده اسنپ دیجی کالا پلیس +۱۰ ….. روی هر کد.م کلیک کنه وب ویو اون سایتا بیاد ابلا باید چیکار کنم؟

    ضمنا چرا درج نظر در ابتدای نظرات نمیزاری بهتره چون تا اسکرول کنیم به پایین اذیت میشیم

  • امیر گفت:

    با درود فراوان
    مشکلی که من با webview دارم اینه که با وصل شدن فیلتر شکن دیگه کار نمیکنه و سایت را باز نمیکنه , و با قطع کردن فیلتر شکن باز همه چی درست و webview سایت را نمایش میده

    میشه لطفا راهنمایی کنید که برای رفع این مشکل چه کاری باید انجام داد ؟

    چون اگه فیلترشکن کاربر وصل باشه webview براش کار نمیکنه

    • سیدمهدی مطهری گفت:

      قطعا این یه مسئله عمومی نیست. ممکنه سایتی که داخل WebView کار می کنید با IP وی‌پی‌انی که استفاده می کنید مشکل داره یا دیوایسی که دارید روش تست رو انجام میدید با فعال شدن VPN تنظیمات اینترنتش به مشکل برمیخوره

  • Morteza گفت:

    سلام استاد خوبی میگم
    اگه بخوام یه اپلیکیشنی داشته باشم که چند صد تا موضوع را به صورت جداگونه شرح میده و موضوعات دارای تصاویر وغیره هستند ایا بهترین راه استفاده از وب ویو است؟ یا راهی هست که این نوع اپلیکیشن ها رو با خود اندروید استدیو ساخت

  • مهرداد پاسیان گفت:

    سلام دستت درد نکنه اوکی شد فقط لوگو سایت نشون نمیده چرا؟

  • فاضل گفت:

    سلام
    آیا یادگیری زبان HTML برای برنامه نویسی اندروید بخصوص در اندروید استودیو لازم هست ؟
    لطفا اگه میشه جواب بدید من میدونم زبان XML‌ لازم هست ولی در خیلی از آموزش های مربوط به XML یادگیری HTML‌رو مقدمه ی کار میدونن بنظر شما اول HTML رو یاد بگیریم بعد XML‌یا HTML بدرد ما نمیخوره

  • هاشمی گفت:

    با سلام و خسته نباشید
    من اپ وب ویو برای سایتم ساختم. ولی input type=file
    کار نمیکند و اصلا صفحه انتخاب فایل باز نمیشود که فایل انتخاب کنم

  • سعید گفت:

    با تشکر از آموزش و توضیحات خوبیتون ، چطور میتونم آیکن برای این پرژه اختصاصی بدم ؟
    و اینکه صفحه اسپلش تعریف کنم . ممنون

  • K گفت:

    سلام خسته نباشید و ممنون بابت آموزش
    من زمانی که او رو ران میکنم و کد وب ویو اجرا میشه دیالوگی اجرا میشه که میگه با کدوم مرورگر می‌خوابد باز بشه و توی خود اپ اجرا نمیشه
    من از این کد‌ وب ویو توی الرت دیالوگ استفاده کردم امکان مشکل از این باشه؟

  • مهرداد گفت:

    سلام خسته نباشید. من داخل برنامم از یه WebView استفاده کردم که مطالب داخل پست رو از وردپرس میگیره نمایش میده ولی کلا متن ها چپ چین هستن ولی داخل سایت راست چین نمایش میده چطور میتونم این مشکل و برطرف کنم؟کد خاصی داره ک بشه وب ویو رو راست چین کرد؟

  • زهرا گفت:

    با سلام
    ممنون از آموزش و سایت خوبتون، مطابق مراحل سایت یک وب ویو طراحی کردم ولی متد onPageStarted , onPageFinished برای من کار نمیکنه؟ دلیلش چیه؟ ایا منسوخ شده؟

  • Kiyarash گفت:

    سلام آقای مطهری،
    می خواستم ببینم امکان داره یک آموزش در رابطه با اینکه اگر کاربر آفلاین بود به صفحه خاصی منتقل شود و اگر آنلاین بود به یک صفحه دیگر؟
    اگر کمک کنید ممنون میشم.

  • حیدری گفت:

    با سلام
    من یک سایت vuejs دارم
    لینکش رو میدم به وب ویو ولی چیزی رو نمایش نمیده
    شما اطلاع دارید مشکل از چیه؟

  • rucube گفت:

    سلام ببخشید من وقتی اپلیکیشنو ران میکنم با ارور err_cache_miss مواجه میشم خواهشا جواب بدید

  • مژگان سادات قائم محمدی گفت:

    بله درسته لینکی که فرستادید رو دیدم . ظاهرا وب ویو از webgl پشتیبانی نمیکنه . خیلی حیف شد . ممنون از،لطفتون .
    راستی ایا به جز وب ویو راه دیگه ای هم برای نمایش صفحات وب وجود داره ؟

  • مژگان سادات قائم محمدی گفت:

    سلام .
    میگم اون ریاد مهم نیست . .ففط نوشته که
    Created by coppercube
    دیگه هیچ اروری نیست فقط یه صفجه سفید باز میشه
    میتونم سورس رو براتون بفرستم ؟ سورس مثال هست . خیلی کم حجمه .
    یه جا سرچ کردم گفته بود webview باید حتما webgl رو ساپورت کنه تا بتونه فایل شما رو نشون بده . این یعنی چی ؟

  • مژگان قائم محمدی گفت:

    سلام .
    من یک فایل html به همراه پوشه محتویاتش رو در داخل پوشه asset قرار دادم
    و بعد طبق اموزش شما ( html محلی و آفلاین) پیش رفتم . و خروجی apk گرفتم و روی گوشی نصب و اجرا کردم . اما فقط صفحه سفید ظاهر میشه و یک عبارت یک خطی هم تو اون هست ( که البته عبارته مهم نیست . فقط گفته که این فایل webgl توسط یک موتور بازی سازی ایجاد شده )
    در واقع این یک بازی وب جی ال هست که میخوام توسط وب ویو نشان داده بشه . اما خب همون طوری که گفتم فقط صفحه سفید ظاهر میشه و نمیتونه کامل لودش کنه

  • امید گفت:

    سلام
    ببخشید من میخوام که مثلا فوتر سایتم توی اپ وب ویو نمایش داده نشه باید چیکار کنم

  • آریا گفت:

    سلام خسته نباشید
    اول آموزش فرمودید که این روش برا ی ساخت اپ برای وب سایت اصلا مناسب نیست
    لطفا اگه میشه یه روشی معرفی کنید که بتونم برای وب سایت اپ اندروید بسازم
    به این صورت که تمام بخش های مربوط به طراحی و UI و UX رو توی وبسایت طراحی کنم و اپ فقط اون رو نشون بده ( نیاز به طراحی برخی چیز ها توی اپ نباشه)
    وب سایتم ورد پرسی هست
    ممنون میشم جواب بدید و اگر مقاله یا مطلبی هم توی سایتتون موجود هست لینکش رو بزارید

  • آرمیتا گفت:

    سلام وقت بخیر
    چندتا سوال داشتم
    چطوری میشه پاپ آپ با تبلیغات یه سایتی رو بست؟
    طوریکه هیچ تبلیغی روی سایت که هست بالا نیاد و پاپ آپ هاشم از کار بیوفتن

  • احسان گفت:

    سلام وقتتون بخیر
    ببخشید آر (R) setContentView(R.layout.activity_main; و mWebView = findViewById(R.id.web_view); رو ایراد میگیره

  • هادی گفت:

    سلام مهندس جان خسته نباشید من خیلی دنبال همچین کد بودم ممنون فقط من به مشکل بر خوردم میخواستم اگه میشه فایل پروژه در این سایت بزارید

  • موسوی گفت:

    سلام
    میخوام یک سایت رو کامل بوسیله وب ویو در آپ اندروید نمایش بدم(بطوری ک کل آپ رو وب ویو هست). سایت اشتراکی هست و کاربر با درگاه پرداخت در ارتباط هست. اگر بخوام کل سایت رو با وب ویو نمایش بدم، زمانی ک کاربر به خواد به درگاه وصل بشه باز هم در وب ویو هست و این مورد هم کاربر رو میترسونه چون url شاپرک رو نمیتونه ببینه هم آپ استورها این مورد رو قبول نمیکنن.

    راهی هست ک بشه کل سایت رو با وب ویو نمایش داد و زمانی ک بخواد به درگاه وصل بشه بره تو مرورگر و بعد دوباره به آپ برگرده؟
    اگر هست یه توضیح درموردش بدید.

  • علی گفت:

    سلام.وقتتون بخیر.واقعا از سایت و آموزشهای کاملتون ممنونم.یه سوالی داشتم:
    من عین این کدهارو کپی کردم و ازش خروجی گرفتم و الحمدلله بدون هیچ مشکلی کار کرد.اما سوالم اینه،وقتی چند تا صفحه وب رو پشت سرهم باز میکنم و دکمه back گوشی رو میزنم به صفحه وب قبلی منتقل نمیشم بلکه کامل از برنامه خارج میشم.چطوری میتونم این مشکلو برطرف کنم

  • Armita گفت:

    سلام وقت بخیر
    اولا ممنونم بابت سایت خوبتون واقعا تک و آموزشی هستش و اینکه این سورس رو دانلود کردم و کامپایل هم که خیلی عالی بود،چندتا سوال داشتم
    چطوری میشه کاری کرد مثلا توی سایتی هستیم که میخواد یه فیلم رو پخش کنه بجای پخش دو تا گزینه داشته باشه هم اینکه پخش کنه هم اینکه بشه دانلودش کرد چون بعضی سایت ها گزینه دانلود ندارن اگه امکان داره راهنماییم کنید ممنونم

  • رضا زمینی مقدم گفت:

    سلام مهندس جان خسته نباشید
    یه مشکلی داشتم لطفا امکانش باشه راهنماییم کنید
    یه نرم افزار ساختم با webview که سایتم رو توش باز میکنه مشکلی که داشتم اینه که کد برای چک کردن اینترنت این کد (android:name=”android.permission.ACCESS_NETWORK_STATE” />) وارد میکنم در قسمت manifest ، تا اندروید ۶ کار میکنه ولی ۶ به بالا دچار مشکل میشه و سایت رو نمیتونه باز کنه
    ولی وقتی این کد رو بر میدارم سایت دوباره رو گوشی اندروید ۱۰ هم کار میکنه ولی دیگه نمیتونه اینترنت رو چک کنه
    لطفا راهنماییم کنید

  • ناصر براتی گفت:

    سلام خسته نباشید
    ایا میشه از طریق وب ویو فرم ها پر کرد +همراه فایل ارسال کرد؟
    منظورم این هست من داخل سایتم یک صفحه استخدام دارم که اطلاعات رو به همراه چند فایل pdf وjpg میگیره ایا اینکار توسط این اپ وب ویو هم انجام میشه ؟

  • محمد گفت:

    با سلام و خسته نباشید یه سوال داشتم خدمتتون من با این که setJavaScriptEnabled رو true قرار دام ولی بازم جاوا اسکریپت اجرا نمیشه میشه راهنمایی کنید ممنون.

  • علی گفت:

    سلام
    سورس رو میشه بدید

  • علیرضا ابراهیمی گفت:

    سلام چطوری میتونم مقادیر فرم سایتی رو که از طریق وب ویو باز شده رو در اکتیویتی های دیگ استفاده کنم؟

  • راد گفت:

    سلام وقت بخیر. بنده برنامه نویسی جاوا با اندروید استودیو کار میکنم میخوام خروجی کارمو بعد از هربار ران گرفتن روی مرورگر ببینم میشه لطفا آسون ترین راه و سریع ترین راه رو برای بنده معرفی کنید خیلی ممنون میشم.
    منتظرم سپاس

  • علی رضا گفت:

    سلام،ببخشید جچوری میشه داده های که ما در حین استفاده از وب ویو هستیم رو دریافت کرد فرمتش هم هرچی بخواد باشه مثلا شما دریک صفحه ای هستید اون لحظه داده رو قطع می کنید ولی اون صفحه هنوز هست اما مثلا یک حرکتی می کنید که به دلیل نداشتن اینترنت صفحه بسته میشه خب در اون لحظه می خواسته داده دریافت بشه من می خوام اون داده ها رو تو کدنویسی در یافت کنم ممنون

  • پوریا گفت:

    سلام ممنون از سایت خوبتون این خطا یعنی چی
    res/values/styles.xml:2: error: Error parsing XML: not well-formed (invalid token)

    • سیدمهدی مطهری گفت:

      https://stackoverflow.com/q/7089718

      • پوریا گفت:

        این فایل استیل من هست

          @color/colorPrimary

            @color/colorPrimaryDark

            @color/colorAccent

        هنگام خروجی گرفتن این خطا رو میده
        res/values/styles.xml:1: error: Invalid start tag style

        هر کجاش اشتباه هست بگید درستش کنم
        ممنون

        • سیدمهدی مطهری گفت:

          اگه به این فایل دست نزدید که نباید ایرادی داشته باشه و قاعدتا با Rebuild Project (منوی Build) مشکل حل میشه. ولی اگه تغییرش دادید، یه پروژه جدید بسازید و محتویات styles.xml رو از اونجا کپی کنید داخل پروژه اصلی. یا یکی از سورس های داخل سایت رو دانلود کنید و محتویات این فایل رو کپی کنید ازش

  • علی گفت:

    سلام
    کدی هست که قرار بدیم برای لینک های خارجی سایت (هر لینکی غیر از لینک خودمون)
    که وقتی کاربر توی برنامه روی اون لینک خارجی کلیک میکنه با مرورگر باز بشه نه داخل وب ویو

    من خیلی گشتم درمورد

  • محمد گفت:

    سلام علیکم وقتتون بخیر و خوشی
    بنده میخوام مقداری که داخل وب ویو هست را بدست بیاورم؟

  • منصور گفت:

    با سلام وقت بخیر
    ممنون بابت اموزش خوبتون من دارم یک کتاب مینویسم ک متنشو میخوام تو قالب html بنویسم (نمیخوام صفحه html به صورت از پیش ساخته شده رو پوشه asset قرار بدم) تکه کد رو در انتها میزارم
    مشکلم اینه ک میخوام عکس و لینک و متن رو در دیتابیس بزارم و در وب ویو نمایش بدم منتهی عکس و لینک نمایش داده نمیشه
    لینک سفید میشه و ری اکشنی نداره البته تو شبیه ساز امتحان کردم
    عکس هم بالا نمیاد کلا
    میخواستم بدونم وب ویوو قدرت خوندن کد های html رو داره ؟

    تکه کد من در دیتا بیس:

    در ۳ سپتامبر ۲۰۱۳ توسعه‌دهندگان اندروید به‌طور رسمی اعلام کردند که با شرکت نستله، که از شرکت‌های مطرح صنعت شکلات‌سازی جهان می‌باشد، همکاری خواهند کرد. در همین راستا نگارش ۴٫۴ سیستم‌عامل اندروید، کیت‌کت نام گرفت. کیت کت از مارک‌های معروف شکلات است که توسط شرکت نستله تولید می‌شود.

    تست لینک گوگل

    نمیدونم تونستم سوالمو واضح بپرسم یا نه
    اگر کمکم کنید خیلی خیلی ممنونتون میشم 🙂

  • زهرا گفت:

    برای بلاک کردن تبلیغات داخل وب ویو باید چیکار کنیم؟

  • امیرحسین گفت:

    سلام وقت بخیر
    خیلی ممنون از آموزش های کاربردی شما
    فقط مسئله من این است که وقتی روی لینکی کلیک میکنم و در قالب خود وب ویوو نمایش داده میشود به محض برگشت به عقب کلا از برنامه خارج میشود ممنون میشم راهنمایی کنید

  • سید ابراهیم گفت:

    سلام ممنون از آموزش های خیلی خوبتون. من تمام نکات رو مو به مو اجرا کردم داخل وب ویو مشکلم اینجاست که سایتم رو اندروید ۴٫۲ لود نمیشه و ارور میده webpage not available ولی تو ورژن های بالاتر مشکلی نداره. علتش چیه و چطوری رفع میشه؟ ممنون

  • amir گفت:

    سلام
    روی اندروید ۱۰ وب ویو باز نمیکنه سایت رو چرا؟
    نمیدونید مشکلش چیه؟
    فقط هم روی اندروید ۱۰ باز نمیکنه!خود نرم افزار مشکلی ندارها فقط قسمت وب ویوش صفحه رو بارگزاری نمیکنه

  • عباس گفت:

    سلام
    ممنون به خاطر آموزش های خوبتون?
    برای وب سایت های فروشگاهی، صفحه پرداخت امنیت داره با این سورس؟
    و میشه که صفحه پرداخت رو با مرورگر گوشی باز کنه و بعد از پرداخت برگرده به اپ؟

    • سیدمهدی مطهری گفت:

      تو بحث امنیت که نباید مشکلی باشه چون درگاهها روی https هستن و اطلاعات کد شده رد و بدل میشن
      مورد دوم هم دو لینک زیر رو مطالعه کنید:
      https://stackoverflow.com/questions/4229494/webview-link-click-open-default-browser
      https://discourse.nativescript.org/t/how-to-make-links-in-a-webview-to-open-in-the-default-browser/945/2

  • یزدخواستی گفت:

    سلام
    برای کار با فایلها و فولدرهای روی هاست که حفاظت شده هستند باید چکار کنیم

  • مهدیار گفت:

    باسلام بسیار بسیار ممنون آموزش بسیار کاربردی و عالی بود.
    یه مسئله چرا بعد از خروجی گرفتن apk و انتقال بر روی گوشی جهت نصب برنامه رو ویروس شناسایی میکنه سپر گوگل؟! چطور میشه رفع کرد این مشکل رو؟

    • سیدمهدی مطهری گفت:

      ویروس شناسایی میکنه یا منبع نامعتبر؟ اگه گزینه دوم هست که خب طبیعیه و باید نصب از منبع نامعتبر رو اجازه بدید به دیوایس

      • مهدیار گفت:

        سلام وقت بخیر با سپاس از آموزش بسیار کاربردی و تکمیلتون.
        وقتی خروجی میگیرم میخوام نصب کنم رو گوشی ویروس شناسایی میکنه سپر امنیتی گوگل ، چگونه می توان این مشکل رو رفع کرد؟ چون میخوام برنامه ای که میسازم رو بفرستم بقیه هم نصب کنن ، اگه ویروس شناسایی بشه کسی نصب نمیکنه!
        در صورت امکان راهنمای بفرمایید بزرگوار

  • Samin گفت:

    عالی بود اگر امکان داره راجع به امنیت وب ویو هم مطلب بزارید.
    سپاس

  • زهرا گفت:

    خیلی کامل و دقیق توضیح دادین
    واقعا متشکرم
    خسته نباشید

  • علي گفت:

    سلام جناب مهندس سوالی داشتم.در پکیج آموزشیتون زوم کردن بر روی عکسی که توسط لایبراری picasso در اپلیکیشن باز شده هم وجود داره یه راهنمایی بفرمایید .منظورم این هست که زوم کردن بر روی عکسی که از طریق سرور لود شده چگونه است؟ ممنون.تشکر..

  • یزدخواستی گفت:

    با سلام اگر در مثال بالا بجای آدرس https://android-studio.ir آدرس http://domain.com/t.html که محتوای آن نمایش یک نقشه ساده از گوگل می باشد قرار دهم و با شبیه ساز جنی موشن آنرا اجرا کنم نقشه نمایش داده نمی شود و خالی و سفید است ولی در محیط مرورگر اجرا میشود مشکل چیست راهنمائی بفرمائید.یعنی آدرسهای غیر نقشه گوگل API مشکلی ندارند.

  • سجاد گفت:

    سلام.روزتون بخیر.من برنامه اندرویدی رو نوشتم که صفحه ی وب رو بدون مشکل باز میکنه.اما اون صفحه ی وب تبلیغات و پاپ اپ های زیادی داره و بعضی وقت ها به صفحات دیگه ریدایرکت میشه و باعث مشکا ui میشه.چطوذ میشه جلو این ریدایرکت ها و تبلیغات رو گرفت؟؟؟

  • مهدی گفت:

    با سلام
    من این برنامه رو مو به مو نوشتم ودسترسی اینترنت رو هم اوکی کردم .
    ولی موقع اجرا رو nox بدون هیچ مشکلی کار میکنی .
    ولی رو گوشی خودم که اجرا میکنم . فورس کلوز میده .
    دلیلش چیه واقعا ؟؟؟

    • سیدمهدی مطهری گفت:

      Logcat رو بررسی کنید. ممکنه یک متد با API Level دیوایس مربوطه سازگاری نداشته باشه

    • حسین گفت:

      اصلا ربطی به استفاده از وب ویو نداره من با اندروید استدیو ۴.۱ هر وقت لینک میدم روی box بدون مشکل باز میکنه ولی رو گوشی فورس کلوز میده نسخه قبلی اندروید استدیو این مشکل رو نداشتم نمدونم چرا اینجوری میشه
      اگه کسی میدونه رانمایی کنه ممنون