Android开发笔记:内嵌外链

先做一个简单的APP,直接用现有的h5页面套用到APP中,就是内嵌外链。现记录开发过程,以方便以后实时阅览。

用Android studio创建新项目,我的项目名称都采用默认。
在这里插入图片描述
activity_ main.xml作用是APP的显示布局,外链展示放在WebView控件中,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<!--  This layout does not use <merge/> to slow down the drawing -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <WebView
        android:id="@+id/webView"
        android:layout_width="fill_parent"	//fill_parent可以使WebView充满父级容器
        android:layout_height="fill_parent"
        android:visibility="gone"	//设置WebView隐藏,不可见(invisible),可见(visible)
        android:scrollbars="none"	//隐藏滚动条
    />
</LinearLayout>

styles.xml设置APP样式
在这里插入图片描述
在这里插入图片描述

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    	<!--NoActionBar可以去掉难看的项目标题头-->
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    <style name="WindowDefault" parent="AppTheme">
	    <!--设置默认背景图片,活动采用WindowDefault主题在加载时就不用显示白屏了-->
        <item name="android:windowBackground">@drawable/ic_launcher_start</item><!--图片位置如上图所示,格式可采用常用图片格式jpg、png等-->
        <item name="android:windowFullscreen">true</item><!--设置APP全屏-->
    </style>
</resources>

默认的APP图标太丑啦,就去网上下了图片根据各图标尺寸放在对应的文件夹里。

图标尺寸:

hdpi:72x72px
mdpi:48x48px
xhdpi:96x96px
xxhdpi:144x144px
xxxhdpi:192x192px
在这里插入图片描述
推荐一个在线定制APP图标超好用的网址:https://resizeappicon.com/
在这里插入图片描述
各尺寸文件夹的图标名要一样的哦
在这里插入图片描述
之后在图中文件夹中复制ic_launcher.xml并重命名和图标同名就好啦,Android studio就会自动显示下图内容
在这里插入图片描述
AndroidManifest.xml配置活动
在这里插入图片描述

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

    <uses-permission android:name="android.permission.INTERNET" /><!--设置APP联网权限-->
    <application
        android:hardwareAccelerated="true"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher_my"	//这里图标名用弄好的自定义名称
        android:label="@string/app_name">
        <activity android:name=".MainActivity"
            android:hardwareAccelerated="false"
            android:screenOrientation="portrait"	//限制APP只能竖屏显示,设置这个就是用平板模拟器也会自适应为竖屏模式
            android:theme="@style/WindowDefault">	//MainActivity主题设置
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

在这里插入图片描述

public class MainActivity extends AppCompatActivity {
    private WebView webView;
    private WebSettings webSettings;
    public static final String url = "mylink";	//设置外链的全局变量
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = (WebView) findViewById(R.id.webView); //初始化控件,R.id.webView就是activity_main.xml设置的WebView的id名
        webSettings = webView.getSettings();
        // 开启Javascript脚本
        webSettings.setJavaScriptEnabled(true); //支持js
        webView.setWebViewClient(new WebViewClient() {
            @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);
                view.setVisibility(View.VISIBLE);	//前面已设置了页面隐藏,因此在这里就设置显示webView
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return super.shouldOverrideUrlLoading(view, url);	//url跳转在APP内进行,不用自动打开默认浏览器
            }

            @Override
            public void onReceivedError(WebView view, int errorCode,
                                        String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
                //这里进行无网络或错误处理,具体可以根据errorCode的值进行判断,做跟详细的处理。
                view.loadUrl("file:///android_asset/html/reset.html");
            }
        });
        webView.loadUrl(url);
    }
}

Android loadUrl加载有两种方式,一种是外链网址,一种是本地html
加载本地html需将预加载的文件放置如下路径中的assets,没有就创建一个。之后调用html文件就使用该格式“file:///android_asset/xxx/xxx.html"
在这里插入图片描述
在Android网络异常时加载reset.html,从reset.html中刷新重载url,需要进行java和js的互动,增加代码:webView.addJavascriptInterface(new JsInterface(), “jsobj”);
并在MainActivity 加入如下代码:

public class JsInterface {
        @JavascriptInterface
        public void refresh() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
	                webView.setVisibility(View.INVISIBLE);//视图不可见
                    webView.loadUrl(url);
                }
            });
        }
    }

相应reset.html的JavaScript代码如下:

<script type="text/javascript">
	function refresh(){
		jsobj.refresh();
	}
</script>

设置按两下返回键退出APP:

// 用来计算返回键的点击间隔时间
    private long exitTime = 0;
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
            webView.goBack();
            return true;
        }
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
            if ((System.currentTimeMillis() - exitTime) > 2000) {
                //弹出提示,可以有多种方式
                Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
                exitTime = System.currentTimeMillis();
            } else {
                finish();
            }
            return true;
        }

        return super.onKeyDown(keyCode, event);
    }

在写java代码发现有些代码飘红怎么办?直接点击红色代码,按下Alt+Enter即可导入对应包。

开发过程会遇到APP显示不全的情况

首先看activity_main.xml的属性layout_width、layout_height,检查控件是否完全覆盖父级容器,fill_parent优先级是最高的,如控件和父级容器一样的属性则以父级容器为先,我踩了这个坑导致APP蛋疼的只显示一半,检查半天是控件的layout_width和父级的属性是一样的。

至于APP内容是否有适配屏幕、样式什么的,这些我都交给js、css做了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值