ส่วนประกอบ WebView ที่ได้รับการปรับปรุงสำหรับ Android ที่ทำงานตามที่ตั้งใจไว้นอกกรอบ
ประกาศที่เก็บ Gradle ในรูทของคุณ build.gradle
allprojects {
repositories {
maven { url " https://jitpack.io " }
}
} ประกาศการพึ่งพา Gradle ใน build.gradle
dependencies {
implementation ' com.github.delight-im:Android-AdvancedWebView:v3.2.1 '
}< uses-permission android : name = " android.permission.INTERNET " />< im .delight.android.webview.AdvancedWebView
android : id = " @+id/webview "
android : layout_width = " match_parent "
android : layout_height = " match_parent " /> public class MyActivity extends Activity implements AdvancedWebView . Listener {
private AdvancedWebView mWebView ;
@ Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView ( R . layout . activity_my );
mWebView = ( AdvancedWebView ) findViewById ( R . id . webview );
mWebView . setListener ( this , this );
mWebView . setMixedContentAllowed ( false );
mWebView . loadUrl ( "http://www.example.org/" );
// ...
}
@ SuppressLint ( "NewApi" )
@ Override
protected void onResume () {
super . onResume ();
mWebView . onResume ();
// ...
}
@ SuppressLint ( "NewApi" )
@ Override
protected void onPause () {
mWebView . onPause ();
// ...
super . onPause ();
}
@ Override
protected void onDestroy () {
mWebView . onDestroy ();
// ...
super . onDestroy ();
}
@ Override
protected void onActivityResult ( int requestCode , int resultCode , Intent intent ) {
super . onActivityResult ( requestCode , resultCode , intent );
mWebView . onActivityResult ( requestCode , resultCode , intent );
// ...
}
@ Override
public void onBackPressed () {
if (! mWebView . onBackPressed ()) { return ; }
// ...
super . onBackPressed ();
}
@ Override
public void onPageStarted ( String url , Bitmap favicon ) { }
@ Override
public void onPageFinished ( String url ) { }
@ Override
public void onPageError ( int errorCode , String description , String failingUrl ) { }
@ Override
public void onDownloadRequested ( String url , String suggestedFilename , String mimeType , long contentLength , String contentDisposition , String userAgent ) { }
@ Override
public void onExternalPageRequest ( String url ) { }
}android.app.Fragment ) หมายเหตุ: หากคุณใช้คลาส Fragment จากไลบรารีสนับสนุน ( android.support.v4.app.Fragment ) โปรดดูส่วนถัดไป (ดูด้านล่าง) แทนอันนี้
public class MyFragment extends Fragment implements AdvancedWebView . Listener {
private AdvancedWebView mWebView ;
public MyFragment () { }
@ Override
public View onCreateView ( LayoutInflater inflater , ViewGroup container , Bundle savedInstanceState ) {
View rootView = inflater . inflate ( R . layout . fragment_my , container , false );
mWebView = ( AdvancedWebView ) rootView . findViewById ( R . id . webview );
mWebView . setListener ( this , this );
mWebView . setMixedContentAllowed ( false );
mWebView . loadUrl ( "http://www.example.org/" );
// ...
return rootView ;
}
@ SuppressLint ( "NewApi" )
@ Override
public void onResume () {
super . onResume ();
mWebView . onResume ();
// ...
}
@ SuppressLint ( "NewApi" )
@ Override
public void onPause () {
mWebView . onPause ();
// ...
super . onPause ();
}
@ Override
public void onDestroy () {
mWebView . onDestroy ();
// ...
super . onDestroy ();
}
@ Override
public void onActivityResult ( int requestCode , int resultCode , Intent intent ) {
super . onActivityResult ( requestCode , resultCode , intent );
mWebView . onActivityResult ( requestCode , resultCode , intent );
// ...
}
@ Override
public void onPageStarted ( String url , Bitmap favicon ) { }
@ Override
public void onPageFinished ( String url ) { }
@ Override
public void onPageError ( int errorCode , String description , String failingUrl ) { }
@ Override
public void onDownloadRequested ( String url , String suggestedFilename , String mimeType , long contentLength , String contentDisposition , String userAgent ) { }
@ Override
public void onExternalPageRequest ( String url ) { }
}android.support.v4.app.Fragment ) ใช้รหัสสำหรับการใช้งาน Fragment ปกติตามที่แสดงด้านบน
เปลี่ยน
mWebView . setListener ( this , this );ถึง
mWebView . setListener ( getActivity (), this ); เพิ่มรหัสต่อไปนี้ลงใน FragmentActivity พาเรนต์เพื่อส่งต่อผลลัพธ์จาก FragmentActivity ไปยังอินสแตนซ์ Fragment เมนต์ที่เหมาะสม
public class MyActivity extends FragmentActivity implements AdvancedWebView . Listener {
@ Override
public void onActivityResult ( int requestCode , int resultCode , Intent intent ) {
super . onActivityResult ( requestCode , resultCode , intent );
if ( mFragment != null ) {
mFragment . onActivityResult ( requestCode , resultCode , intent );
}
}
} -keep class * extends android.webkit.WebChromeClient { *; }
-dontwarn im.delight.android.webview.**
หากคุณต้องการให้บริการเว็บไซต์หรือเพียงแค่ทรัพยากรเดียวผ่าน http ธรรมดาแทน https มักจะไม่มีอะไรจะทำหากคุณกำหนดเป้าหมาย Android 8.1 (API Level 27) หรือก่อนหน้านี้ บน Android 9 (API Level 28) และใหม่กว่าอย่างไรก็ตามการสนับสนุน ClearText จะถูกปิดใช้งานโดยค่าเริ่มต้น คุณอาจต้องตั้งค่า android:usesCleartextTraffic="true" บนองค์ประกอบ <application> ใน AndroidManifest.xml หรือให้การกำหนดค่าความปลอดภัยเครือข่ายที่กำหนดเอง
ปรับให้เหมาะสมเพื่อประสิทธิภาพและความปลอดภัยที่ดีที่สุด
คุณสมบัติจะถูกแก้ไขในเวอร์ชัน Android
การอัปโหลดไฟล์จะได้รับการจัดการโดยอัตโนมัติ (ตรวจสอบความพร้อมใช้งานด้วย AdvancedWebView.isFileUploadAvailable() )
multiple แอตทริบิวต์ใน HTML) ได้รับการสนับสนุนบน Android 5.0+ แอปพลิเคชันที่ใช้ในการเลือกไฟล์ (เช่นโดยปกติแล้วแอพแกลเลอรี่หรือตัวจัดการไฟล์) จะต้องให้การควบคุมสำหรับการเลือกหลายไฟล์ซึ่งแอพบางตัวไม่ได้JavaScript และ WebStorage เปิดใช้งานโดยค่าเริ่มต้น
รวมถึงการแปลสำหรับ 25 ภาษาที่พูดกันอย่างกว้างขวางที่สุด
รับการโทรกลับเมื่อหน้าเริ่ม/เสร็จสิ้นการโหลดหรือมีข้อผิดพลาด
@ Override
public void onPageStarted ( String url , Bitmap favicon ) {
// a new page started loading
}
@ Override
public void onPageFinished ( String url ) {
// the new page finished loading
}
@ Override
public void onPageError ( int errorCode , String description , String failingUrl ) {
// the new page failed to load
}การดาวน์โหลดจะถูกจัดการโดยอัตโนมัติและสามารถฟังได้
@ Override
public void onDownloadRequested ( String url , String suggestedFilename , String mimeType , long contentLength , String contentDisposition , String userAgent ) {
// some file is available for download
// either handle the download yourself or use the code below
if ( AdvancedWebView . handleDownload ( this , url , suggestedFilename )) {
// download successfully handled
}
else {
// download couldn't be handled because user has disabled download manager app on the device
// TODO show some notice to the user
}
} เปิดใช้งานการสนับสนุนตำแหน่งทางภูมิศาสตร์ (ความต้องการ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> )
mWebView . setGeolocationEnabled ( true );เพิ่มส่วนหัว HTTP ที่กำหนดเองนอกเหนือจากส่วนที่ส่งโดยการใช้งานเว็บเบราว์เซอร์
mWebView . addHttpHeader ( "X-Requested-With" , "My wonderful app" );กำหนดชุดโฮสต์ที่อนุญาตและรับการเรียกกลับสำหรับชื่อโฮสต์อื่น ๆ ทั้งหมด
mWebView . addPermittedHostname ( "example.org" );และ
@ Override
public void onExternalPageRequest ( String url ) {
// the user tried to open a page from a non-permitted hostname
}ป้องกันการแคชของหน้า HTML
boolean preventCaching = true ;
mWebView . loadUrl ( "http://www.example.org/" , preventCaching );ตรวจสอบเบราว์เซอร์ทางเลือกที่ติดตั้งบนอุปกรณ์
if ( AdvancedWebView . Browsers . hasAlternative ( this )) {
AdvancedWebView . Browsers . openUrl ( this , "http://www.example.org/" );
}ปิดการใช้งานคุกกี้
// disable third-party cookies only
mWebView . setThirdPartyCookiesEnabled ( false );
// or disable cookies in general
mWebView . setCookiesEnabled ( false );อนุญาตหรือไม่อนุญาต (ทั้งเนื้อหาแบบพาสซีฟและแอคทีฟ) (เนื้อหา HTTP ถูกโหลดภายในไซต์ HTTPS)
mWebView . setMixedContentAllowed ( true );
// or
mWebView . setMixedContentAllowed ( false );สลับระหว่างโหมดมือถือและเดสก์ท็อป
mWebView . setDesktopMode ( true );
// or
// mWebView.setDesktopMode(false); โหลดไฟล์ HTML จาก“ สินทรัพย์” (เช่นที่ app/src/main/assets/html/index.html )
mWebView . loadUrl ( "file:///android_asset/html/index.html" );โหลดไฟล์ HTML จากการ์ด SD
// <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
if ( Environment . getExternalStorageState (). equals ( Environment . MEDIA_MOUNTED )) {
mWebView . getSettings (). setAllowFileAccess ( true );
mWebView . loadUrl ( "file:///sdcard/Android/data/com.my.app/my_folder/index.html" );
}โหลดข้อความต้นฉบับ HTML และแสดงเป็นหน้า
myWebView . loadHtml ( "<html>...</html>" );
// or
final String myBaseUrl = "http://www.example.com/" ;
myWebView . loadHtml ( "<html>...</html>" , myBaseUrl );เปิดใช้งานการสนับสนุนหลายหน้าต่าง
myWebView . getSettings (). setSupportMultipleWindows ( true );
// myWebView.getSettings().setJavaScriptEnabled(true);
// myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
myWebView . setWebChromeClient ( new WebChromeClient () {
@ Override
public boolean onCreateWindow ( WebView view , boolean isDialog , boolean isUserGesture , Message resultMsg ) {
AdvancedWebView newWebView = new AdvancedWebView ( MyNewActivity . this );
// myParentLayout.addView(newWebView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
WebView . WebViewTransport transport = ( WebView . WebViewTransport ) resultMsg . obj ;
transport . setWebView ( newWebView );
resultMsg . sendToTarget ();
return true ;
}
}ยินดีต้อนรับการมีส่วนร่วมทั้งหมด! หากคุณต้องการมีส่วนร่วมโปรดสร้างปัญหาก่อนเพื่อให้สามารถพูดคุยกับคุณลักษณะปัญหาหรือคำถามของคุณ
โครงการนี้ได้รับใบอนุญาตภายใต้ข้อกำหนดของใบอนุญาต MIT