Android Studio 制作一個 WebView 外殼

背景

做為一條BS狗鹿榜,開發(fā)應用當然趨向于BS,為了方便維護土匀,降低開發(fā)成本子房,決定只做一個webview做為程序入口,所有的功能頁面集中在服務端就轧。

本次踩坑遇到了 js不支持证杭、點擊返回直接退出應用、https/http混雜模式不支持等小坑妒御,具體解決全部都在下面的代碼中解愤,請各位看官慢用。

工具

  • Android Studio


    3.2

過程

1携丁、新建一個FullScreen項目琢歇,命名為GodOne

2、應用配置:app/manifests/AndroidManifest.xml代碼

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ai.imud.godone">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/Theme.AppCompat.NoActionBar">
        <activity android:name=".MainActivity" android:screenOrientation="portrait">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

3梦鉴、后臺部分:app/java/ai.imud.godone/MainActivity.java代碼

package ai.imud.godone;

import android.annotation.SuppressLint;
import android.os.Build;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import android.view.Window;
import android.view.WindowManager;

import static android.view.KeyEvent.KEYCODE_BACK;

/**
 * An example full-screen activity that shows and hides the system UI (i.e.
 * status bar and navigation/system bar) with user interaction.
 */
public class MainActivity extends AppCompatActivity {
    /**
     * Whether or not the system UI should be auto-hidden after
     * {@link #AUTO_HIDE_DELAY_MILLIS} milliseconds.
     */
    private static final boolean AUTO_HIDE = true;

    /**
     * If {@link #AUTO_HIDE} is set, the number of milliseconds to wait after
     * user interaction before hiding the system UI.
     */
    private static final int AUTO_HIDE_DELAY_MILLIS = 3000;

    /**
     * Some older devices needs a small delay between UI widget updates
     * and a change of the status and navigation bar.
     */
    private static final int UI_ANIMATION_DELAY = 300;
    private final Handler mHideHandler = new Handler();
    private View mContentView;
    private final Runnable mHidePart2Runnable = new Runnable() {
        @SuppressLint("InlinedApi")
        @Override
        public void run() {
            // Delayed removal of status and navigation bar

            // Note that some of these constants are new as of API 16 (Jelly Bean)
            // and API 19 (KitKat). It is safe to use them, as they are inlined
            // at compile-time and do nothing on earlier devices.
            mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
        }
    };
    private View mControlsView;
    private final Runnable mShowPart2Runnable = new Runnable() {
        @Override
        public void run() {
            // Delayed display of UI elements
            ActionBar actionBar = getSupportActionBar();
            if (actionBar != null) {
                actionBar.show();
            }
            mControlsView.setVisibility(View.VISIBLE);
        }
    };

    /**
     * Touch listener to use for in-layout UI controls to delay hiding the
     * system UI. This is to prevent the jarring behavior of controls going away
     * while interacting with activity UI.
     */
    private final View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            return false;
        }
    };
    private WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //全屏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        webView = (WebView) findViewById(R.id.wv_webview);

        WebSettings webSettings = webView.getSettings();
        //如果訪問的頁面中要與Javascript交互,則webview必須設(shè)置支持Javascript
        webSettings.setJavaScriptEnabled(true);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }
        webSettings.setBlockNetworkImage(false);//解決圖片不顯示
        //設(shè)置自適應屏幕揭保,兩者合用
        webSettings.setUseWideViewPort(true); //將圖片調(diào)整到適合webview的大小
        webSettings.setLoadWithOverviewMode(true); // 縮放至屏幕的大小
        //縮放操作
        webSettings.setSupportZoom(true); //支持縮放肥橙,默認為true。是下面那個的前提秸侣。
        webSettings.setBuiltInZoomControls(true); //設(shè)置內(nèi)置的縮放控件存筏。若為false,則該WebView不可縮放
        webSettings.setDisplayZoomControls(false); //隱藏原生的縮放控件
        //其他細節(jié)操作
        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //關(guān)閉webview中緩存
        webSettings.setAllowFileAccess(true); //設(shè)置可以訪問文件
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通過JS打開新窗口
        webSettings.setLoadsImagesAutomatically(true); //支持自動加載圖片
        webSettings.setDefaultTextEncodingName("utf-8");//設(shè)置編碼格式
        webView.loadUrl("https://news.163.com");
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                //使用WebView加載顯示url
                view.loadUrl(url);
                //返回true
                return true;
            }
        });
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
    }
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KEYCODE_BACK) && webView.canGoBack()) {
            webView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);

    }

}

4味榛、 布局部分代碼app/res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
    android:background="#0099cc"
    tools:context=".MainActivity">
    <WebView android:id="@+id/wv_webview" android:layout_width="match_parent" android:layout_height="match_parent" />

</FrameLayout>

5椭坚、更改圖標


第一步
選擇前景圖,就是自己制作好的圖標
設(shè)置背景色

下一步搏色,警告不用管善茎,結(jié)束。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末频轿,一起剝皮案震驚了整個濱河市垂涯,隨后出現(xiàn)的幾起案子烁焙,更是在濱河造成了極大的恐慌,老刑警劉巖耕赘,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骄蝇,死亡現(xiàn)場離奇詭異,居然都是意外死亡操骡,警方通過查閱死者的電腦和手機九火,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來册招,“玉大人吃既,你說我怎么就攤上這事】缦福” “怎么了鹦倚?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冀惭。 經(jīng)常有香客問我震叙,道長,這世上最難降的妖魔是什么散休? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任媒楼,我火速辦了婚禮,結(jié)果婚禮上戚丸,老公的妹妹穿的比我還像新娘划址。我一直安慰自己,他們只是感情好限府,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布夺颤。 她就那樣靜靜地躺著,像睡著了一般胁勺。 火紅的嫁衣襯著肌膚如雪世澜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天署穗,我揣著相機與錄音寥裂,去河邊找鬼。 笑死案疲,一個胖子當著我的面吹牛封恰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播褐啡,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼诺舔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起混萝,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤遗遵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逸嘀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體车要,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年崭倘,在試婚紗的時候發(fā)現(xiàn)自己被綠了翼岁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡司光,死狀恐怖琅坡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情残家,我是刑警寧澤榆俺,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站坞淮,受9級特大地震影響茴晋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜回窘,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一诺擅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啡直,春花似錦烁涌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至阐滩,卻和暖如春二打,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掂榔。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留症杏,地道東北人装获。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像厉颤,于是被迫代替她去往敵國和親穴豫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容