公司想花最少的开发成本,将现有的移动H5 页面封装成APK,虽然现在这种封装平台也很多,也很方便,但没能精细到自己想要的一些细节,毕竟H5和封装后的APK 有些展示 还有一些差异。
混合开发想解决如下问题:
1.按其它APP的国际惯例,开屏广告位。
2.按APP支付处理方式直接跳转相应支付应用。
3.对应的联系方式快捷跳转相应应用场景(点QQ进入QQ对话框,电话直接发起拨号,分享直接进入朋友圈等)。
4.url地址过滤,针对某些地址,为了使用体验跳转到系统浏览器。
5.版本更新迭代。
6.APP访问请求头追加信息描述,服务器能做出相应不同的展示。
7.APP通过注入JS动态动对H5页面做一些智能化场景(自动登陆,智能填写补充,智能提示..)。
如果想要更精细,都是可以实现,比如消息推送,悬浮导航等。
//versionCheck.java
Java
package com.haoniu7;
import android.content.Context;
import android.util.Log;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class VersionCheck {
public String getversion(Context context){
StringBuffer message=new StringBuffer();
String registerUrl =context.getString(R.string.host)+"/app/apkversion.php";
//Log.d("zzz", "getversion: ");
try {
// 创建远程url连接对象
URL url = new URL(registerUrl);
// 通过远程url连接对象打开一个连接,强转成httpURLConnection类
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
// 设置连接方式:get
connection.setRequestMethod("GET");
// 设置连接主机服务器的超时时间:15000毫秒
connection.setConnectTimeout(15000);
// 设置读取远程返回的数据时间:60000毫秒
connection.setReadTimeout(60000);
// 发送请求
connection.connect();
// 通过connection连接,获取输入流
if (connection.getResponseCode() == 200) {
InputStream inputStream=connection.getInputStream();
byte[] data=new byte[1024];
StringBuffer sb1=new StringBuffer();
int length=0;
while ((length=inputStream.read(data))!=-1){
String s=new String(data, 0,length);
sb1.append(s);
}
message.append(sb1.toString());
//Log.d("zzz", "getversion: "+message.toString());
inputStream.close();
}
//关闭连接
connection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return message.toString();
}
}
splashActivity.java
Java
package com.haoniu7;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Handler;
import android.webkit.WebView;
import android.widget.ImageView;
import android.widget.Toast;
import com.youth.banner.Banner;
import com.youth.banner.listener.OnBannerListener;
import java.util.ArrayList;
import java.util.List;
@SuppressWarnings("ALL")
public class SplashActivity extends AppCompatActivity {
ImageView imageView=null;
final int SPLASH_DISPLAY_LENGHT= 5000; //延迟5秒
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
//WebView webView=findViewById(R.id.splshwebview);
//webView.loadUrl("file:///android_asset/splash.html");
//int r=(int)(1+Math.random()*(6-1+1));
//getWindow().requestFeature(Window.FEATURE_NO_TITLE);//去掉标题
//setContentView(R.layout.activity_splash);
List images = new ArrayList();
if (isNetworkAvailable(SplashActivity.this)){
images.add(getString(R.string.host)+"/img/pad01.png");
images.add(getString(R.string.host)+"/img/pad02.png");
images.add(getString(R.string.host)+"/img/pad03.png");
}else{
images.add("file:///android_asset/splash1.jpg");
images.add("file:///android_asset/splash2.jpg");
images.add("file:///android_asset/splash3.jpg");
}
Banner banner = (Banner) findViewById(R.id.banner);
//设置图片加载器
banner.setImageLoader(new GlideImageLoader());
//设置图片集合
banner.setImages(images);
//banner设置方法全部调用完毕时最后调用
banner.start();
//增加点击事件-->直接进入main activity
banner.setOnBannerListener(new OnBannerListener() {
@Override
public void OnBannerClick(int position) {
// Toast.makeText(SplashActivity.this, "position"+position, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
startActivity(intent);
SplashActivity.this.finish();
}
});
new Handler().postDelayed(new Runnable() {
public void run() {
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
startActivity(intent);
SplashActivity.this.finish(); //关闭splashActivity,将其回收,否则按返回键会返回此界面
}
}, SPLASH_DISPLAY_LENGHT);
}
public boolean isNetworkAvailable(Activity activity)
{
Context context = activity.getApplicationContext();
// 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager == null)
{
return false;
}
else
{
// 获取NetworkInfo对象
NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo();
if (networkInfo != null && networkInfo.length > 0)
{
for (int i = 0; i < networkInfo.length; i++)
{
//System.out.println(i + "===状态===" + networkInfo[i].getState());
//System.out.println(i + "===类型===" + networkInfo[i].getTypeName());
// 判断当前网络状态是否为连接状态
if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED)
{
return true;
}
}
}
}
return false;
}
}
mainActivity.java
Java
package com.haoniu7;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.app.DownloadManager;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.JsResult;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;
import java.util.HashMap;
public class MainActivity extends AppCompatActivity {
final String thisversion="1.1.1";
private WebView webView= null;
private Context context;
private SharedPreferences mSp;
EditText tu,tp;
AlertDialog loginalert;
HashMap<String, String> header = new HashMap<>();
ProgressDialog mDefaultDialog;
private int bar = 0;
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch(msg.what){
case 1:
webView.loadUrl(getString(R.string.host)+"/m/user/",header);
loginalert.dismiss();
break;
case 2:
//Toast.makeText(getApplicationContext(),"发现新版本,请升级版本",Toast.LENGTH_LONG).show();
onPlay(msg.obj.toString());
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final VersionCheck vc=new VersionCheck();
new Thread(new Runnable() {
@Override
public void run() {
String[] info=vc.getversion(context).split(",");
if(info.length>1){
String webver=info[0];
String webveraddress=info[1];
if(0!=webver.compareTo(thisversion)){
Message msg = new Message();
msg.what=2;
msg.obj=webveraddress;
mHandler.sendMessage(msg);
//Log.d("zzz", "run: "+webveraddress);
}
}
//Log.d("zzz", "onCreate: "+ vc.getversion());
}
}).start();
context=this;
//存储相关
mSp=super.getSharedPreferences("config",MODE_PRIVATE);
//webview 相关
webView=findViewById(R.id.wv_webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setLoadsImagesAutomatically(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);//允许js弹出窗口
//不缓存
webView.getSettings().setCacheMode( webView.getSettings().LOAD_NO_CACHE);
webView.canGoBack();
header.put("app", "android");
webView.loadUrl(getString(R.string.host)+"/m/",header);
//Log.d("zzz", "onCreate: "+getString(R.string.host)+"/m/");
//webView.loadUrl(getString(R.string.host)+"/zhf/test.php",header);
//@JavascriptInterface注释是必须的
webView.addJavascriptInterface(new JavaScriptInterface(), "JSInterface");
//webView.setWebChromeClient(new WebChromeClient());
// webView.setWebViewClient(new WebViewClient(
webView.setWebViewClient(new WebViewClient(){
/*
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result){
return super.onJsAlert(view,url,message,result);
}
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
String url=request.getUrl().toString();
if(url.matches("(.*)pay.haoniu7.com(.*)")){
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
return true;
}
else if( url.matches("tencent://message(.*)") ){
//tencent://message/?uin=2511339036&Site=&menu=yes }
int uinI=url.indexOf("uin=");
int siteI=url.indexOf("&Site=");
String qqs=url.substring(uinI+"uin=".length(),siteI);
//Log.d("zzz", "shouldOverrideUrlLoading: "+qqs);
//String qq=String.valueOf (Integer.parseInt( qqs ));
//Log.d("zzz", "shouldOverrideUrlLoading: "+qq);
String urlStr="mqqwpa://im/chat?chat_type=wpa&uin="+qqs;
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(urlStr)));
return true;
}
else if(!url.matches("(.*).haoniu7.com(.*)")){
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
webView.goBack();
//webView.stopLoading();
return true;
}
return super.shouldOverrideUrlLoading(view, request);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
/*
//网络加载条
mDefaultDialog = new ProgressDialog(context);
mDefaultDialog.setProgressStyle(android.app.ProgressDialog.STYLE_SPINNER); //默认就是小圆圈的那种形式
mDefaultDialog.setMessage("正在加载中...");
// mDefaultDialog.setCancelable(true);//默认true
mDefaultDialog.setCanceledOnTouchOutside(false);//默认true
mDefaultDialog.show();
*/
}
@Override
public boolean shouldOverrideUrlLoading(WebView view,String url ){
view.loadUrl(url,header);
return true;
}
@Override
public void onLoadResource(WebView view, String url) {
super.onLoadResource(view, url);
//注入APP 相关的JS html 1
if( 0== (context.getString(R.string.host)+"/m/reg/index.php").compareTo(url) || 0==(context.getString(R.string.host)+"/m/reg/").compareTo(url)){
String username= mSp.getString("username","");
String password= mSp.getString("password","");
if(username.length()<4 || password.length()<4){
webView.loadUrl("javascript: (function() { "+
"$(\"h1\").insertAfter($(\"html\"));" +
"$(\"html\").remove();"+
"})()");
}
}
}
@Override
public void onPageFinished(final WebView view, String url) {
super.onPageFinished(view, url);
//加载不显示
webView.loadUrl("javascript: (function() { "+
"if(document.getElementById('downapp1')){document.getElementById('downapp1').setAttribute(\"style\",'display:none')}"+
"if(document.getElementById('downapp2')){document.getElementById('downapp2').setAttribute(\"style\",'display:none')}"+
"})()");
if( 0==(getString(R.string.host)+"/m/reg/index.php").compareTo(url) || 0==(getString(R.string.host)+"/m/reg/").compareTo(url)){
//Toast.makeText(getApplicationContext(),"----------",Toast.LENGTH_LONG).show();
String username= mSp.getString("username","").trim();
String password= mSp.getString("password","").trim();
if(username.length()>4 && password.length()>1){
webView.loadUrl("javascript: (function() { "+
"document.getElementsByName(\"t1\").valueOf()[0].value=\""+username +"\";" +
"document.getElementsByName(\"t2\").valueOf()[0].value=\""+password +"\";" +
"document.getElementsByName(\"t2\").valueOf()[0].type=\"password\";" +
"})()");
}
view.loadUrl("javascript:" + buildInjection());
//
}
/*
if(0==url.compareTo("getString(R.string.host)+"/m/user/") || 0==url.compareTo("getString(R.string.host)+"/m/user/index.php") ){
//document.body.style.marginTop="50x";
//Log.d("zzz", "onPageFinished: 11");
webView.loadUrl("javascript: (function() { "+
"document.body.style.marginTop=\"0px\";" +
"})()");
}
//new ValueCallback<String> 中的范型只可以传 String型 也就是说只能回调String当作数据
view.evaluateJavascript("document.getElementsByClassName('buy box').length"
, new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
//Log.d("zzz", "onReceiveValue: "+value);
if( 0==value.compareTo("1")){
//Log.d("zzz", "onReceiveValue: "+value);
webView.loadUrl("javascript: (function() { "+
"document.getElementsByClassName('buy box').valueOf()[0].setAttribute(\"style\",\"margin-bottom: 46px\");"+
"document.getElementsByClassName('tbuy box').valueOf()[0].setAttribute(\"style\",\"margin-bottom: 46px\");"+
"})()");
}
}
});
*/
/*
//mDefaultDialog.dismiss();
//CookieManager cookieManager = CookieManager.getInstance();
//String CookieStr = cookieManager.getCookie(url);
//Toast.makeText(getApplicationContext(),CookieStr,Toast.LENGTH_LONG).show();
//通过builder构建器来构造
AlertDialog.Builder builder=new AlertDialog.Builder(context);//在对话框中,上下文只能使用this
builder.setTitle("警告!");
builder.setMessage(url);
//设置按钮及监听
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.out.println("点击了确定按钮!");
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.out.println("点击了取消按钮!");
}
});
//记得要show出来
builder.show();
*/
/*
String username= mSp.getString("username","");
String password= mSp.getString("password","");
if(username.length()>4 && password.length()>1){
webView.loadUrl("javascript: (function() { "+
"$.ajax(\"getString(R.string.host)+"/m/reg/index.php?action=login\", {" +
"type: 'post'," +
"data: {yj:\"yjcode\",t1:'"+username+"',t2:'"+password+"'}, " +
"success: function(){ window.location.href =\"getString(R.string.host)+"/m/user/\"}" +
" });"+
"})()");
}else{
webView.loadUrl("javascript: (function() { "+
"$(\"h1\").insertAfter($(\"html\"));" +
"$(\"html\").remove();"+
"})()");
loginalert= new AlertDialog.Builder(MainActivity.this,R.style.Dialog_Fullscreen).create();
loginalert.setView(getLayoutInflater().inflate(R.layout.login, null));
loginalert.show();
loginalert.getWindow().setGravity(Gravity.BOTTOM);
loginalert.getWindow().setLayout(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT);
loginalert.getWindow().getDecorView().setPadding(0,0,0,0);
loginalert.getWindow().setContentView(getLayoutInflater().inflate(R.layout.login, null));
tu=loginalert.getWindow().findViewById(R.id.txt_username);
tp=loginalert.getWindow().findViewById(R.id.txt_password);
Button button= loginalert.getWindow().findViewById(R.id.loginbtn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String u=tu.getText().toString().trim();
final String p=tp.getText().toString().trim();
//Log.d("zzzzzzzz", "onClick: "+u+" " +p);
new Thread(new Runnable() {
@Override
public void run() {
//把从服务端获取的数据提示出来
Login li=new Login();
String v=li.applogin(context,u,p,"");
if (0==v.compareTo("ok")){
//Log.d("zzz", "run: "+v);
//得到SharedPreferences.Editor对象,并保存数据到该对象中
SharedPreferences.Editor editor = mSp.edit();
editor.putString("username", u);
editor.putString("password", p);
//保存key-value对到文件中
editor.commit();
Message msg = new Message();
msg.what=1;
mHandler.sendMessage(msg);
}
}
}).start();
}
});
}
*/
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
StringBuffer str=new StringBuffer();
str.append("<h3 id='t' style='text-align: center;margin-top:50%;'>网络走丢了");
int r=(int)(1+Math.random()*(3-1+1));
if(1==r) {
str.append(".</h3>");
}else if(2==r){
str.append("...</h3>");
}else {
str.append(".....</h3>");
}
view.loadData(str.toString(), "text/html", "UTF-8");
}
});
}
private String buildInjection() {
StringBuilder sb = new StringBuilder();
sb.append("document.getElementsByTagName('form')[0].onclick = function () {");
sb.append("var applyname, pccc_applyname;var str = '';");
sb.append("var inputs = document.getElementsByTagName('input');");
sb.append("for (var i = 0; i < inputs.length; i++) {");
sb.append("if (inputs[i].name.toLowerCase() === 't1') {applyname = inputs[i];}");
sb.append("else if (inputs[i].name.toLowerCase() === 't2') {pccc_applyname= inputs[i];}");
sb.append("}");
sb.append("if (pccc_applyname!= null) {str += pccc_applyname.value;}");
sb.append("if (applyname!= null) { str += ' , ' + applyname.value;}");
sb.append("window.JSInterface.processFormInputs(str);");
sb.append("return true;");
sb.append("};");
return sb.toString();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if( keyCode== event.KEYCODE_BACK && webView.canGoBack()){
webView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
public void Click(View view){
switch (view.getId()){
case R.id.tb_home:
webView.loadUrl(getString(R.string.host)+"/m/",header);
break;
case R.id.tb_type:
webView.loadUrl(getString(R.string.host)+"/m/alltype/",header);
break;
case R.id.tb_order:
webView.loadUrl(getString(R.string.host)+"/m/user/order.php",header);
break;
case R.id.tb_purchase:
webView.loadUrl(getString(R.string.host)+"/m/user/car.php",header);
break;
case R.id.tb_my:
webView.loadUrl(getString(R.string.host)+"/m/user/",header);
break;
default:
webView.loadUrl(getString(R.string.host)+"/m/reg/",header);
}
}
class JavaScriptInterface {
@JavascriptInterface
public void processFormInputs(String html) {
//Log.d("zzz", "processFormInputs: "+html);
String[] pu=html.split(",");
//Log.d("zzz", "processFormInputs: "+pu[0]+" "+pu[1]);
SharedPreferences.Editor editor = mSp.edit();
editor.putString("username", pu[1].trim());
editor.putString("password", pu[0].trim());
//保存key-value对到文件中
editor.commit();
}
}
//AlertDialog提示的进度框
public void onPlay(final String downloadurl){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("发现新版本");
builder.setIcon(R.mipmap.ic_launcher);
builder.setMessage("是否确认版本升级");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//Toast.makeText(MainActivity.this,"确认点击",Toast.LENGTH_LONG).show();
//Log.d("zzz", "onClick: "+downloadurl);
Log.d("zzz", "onClick: "+downloadurl);
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri.parse(downloadurl);
intent.setData(content_url);
startActivity(intent);
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"您取消了版本升级",Toast.LENGTH_LONG).show();
}
});
builder.show();
}
}
login.java
Java
package com.haoniu7;
import android.content.Context;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
class Login {
public String applogin(final Context context,final String u, final String p, final String v){
String registerUrl =context.getString(R.string.host)+"/app/applogincheck.php";
try {
URL url = new URL(registerUrl);
HttpURLConnection postConnection = (HttpURLConnection) url.openConnection();
postConnection.setRequestMethod("POST");//post 请求
postConnection.setConnectTimeout(1000*5);
postConnection.setReadTimeout(1000*5);
postConnection.setDoInput(true);//允许从服务端读取数据
postConnection.setDoOutput(true);//允许写入
postConnection.setRequestProperty("app", "android");
postConnection.setRequestProperty("Content-type", "application/x-www-form-urlencoded");//以表单形式传递参数
String postParms = "name="+u+"&password="+p+"&verifyCode="+v;
OutputStream outputStream = postConnection.getOutputStream();
outputStream.write(postParms.getBytes());//把参数发送过去.
outputStream.flush();
final StringBuffer buffer = new StringBuffer();
int code = postConnection.getResponseCode();
if (code == 200) {//成功
InputStream inputStream = postConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line = null;//一行一行的读取
while ((line = bufferedReader.readLine()) != null) {
buffer.append(line);//把一行数据拼接到buffer里
}
//把从服务端获取的数据提示出来
//Toast.makeText(context.getApplicationContext(), buffer.toString(), Toast.LENGTH_SHORT).show();
//Log.d("zzzz", "login: "+buffer.toString());
return buffer.toString();
}
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
}
//mainactivity.xml
Markup
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:id="@+id/ucenter"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ff8000"
android:orientation="horizontal"
>
</LinearLayout>>
<WebView
android:id="@+id/wv_webview"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/ll_tabview"
/>
<LinearLayout
android:id="@+id/ll_tabview"
android:layout_width="match_parent"
android:layout_height="46dp"
android:gravity="center"
android:layout_alignParentBottom="true"
android:orientation="horizontal"
android:background="#ff6600"
android:visibility="invisible"
>
<LinearLayout
android:id="@+id/tb_home"
android:onClick="Click"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
>
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/home"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="首页"
android:textColor="#ffffff"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/tb_type"
android:onClick="Click"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
>
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/type"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="分类"
android:textColor="#ffffff"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/tb_order"
android:onClick="Click"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
>
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/order"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="订单"
android:textColor="#ffffff"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/tb_purchase"
android:onClick="Click"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
>
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/purchase"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="购物车"
android:textColor="#ffffff"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/tb_my"
android:onClick="Click"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
>
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/my"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我的"
android:textColor="#ffffff"
/>
</LinearLayout>
</LinearLayout>
</RelativeLayout >
splashactivity.xml
Markup
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff6600"
tools:context=".SplashActivity">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.youth.banner.Banner
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/banner"
android:layout_width="280dp"
android:layout_height="359dp"
android:layout_gravity="center"
android:layout_marginTop="90dp"
/>
<ImageView
android:visibility="visible"
android:id="@+id/imageView"
android:layout_width="130dp"
android:layout_height="60dp"
android:layout_gravity="center"
android:layout_marginTop="200dp"
app:srcCompat="@drawable/logo" />
</LinearLayout>
</RelativeLayout>
login.xml
Markup
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:id="@+id/ucenter"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ff8000"
android:orientation="horizontal"
>
</LinearLayout>>
<WebView
android:id="@+id/wv_webview"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/ll_tabview"
/>
<LinearLayout
android:id="@+id/ll_tabview"
android:layout_width="match_parent"
android:layout_height="46dp"
android:gravity="center"
android:layout_alignParentBottom="true"
android:orientation="horizontal"
android:background="#ff6600"
android:visibility="invisible"
>
<LinearLayout
android:id="@+id/tb_home"
android:onClick="Click"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
>
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/home"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="首页"
android:textColor="#ffffff"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/tb_type"
android:onClick="Click"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
>
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/type"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="分类"
android:textColor="#ffffff"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/tb_order"
android:onClick="Click"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
>
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/order"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="订单"
android:textColor="#ffffff"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/tb_purchase"
android:onClick="Click"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
>
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/purchase"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="购物车"
android:textColor="#ffffff"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/tb_my"
android:onClick="Click"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
>
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/my"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我的"
android:textColor="#ffffff"
/>
</LinearLayout>
</LinearLayout>
</RelativeLayout >
styles.xml
Markup
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="windowNoTitle">true</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="Dialog_Fullscreen">
<item name="android:windowFullscreen">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowCloseOnTouchOutside">true</item>
</style>
</resources>
下载:代码打包