先做一个简单的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做了。