公司想花最少的开发成本,将现有的移动H5 页面封装成APK,虽然现在这种封装平台也很多,也很方便,但没能精细到自己想要的一些细节,毕竟H5和封装后的APK 有些展示 还有一些差异。
混合开发想解决如下问题:
1.按其它APP的国际惯例,开屏广告位。
2.按APP支付处理方式直接跳转相应支付应用。
3.对应的联系方式快捷跳转相应应用场景(点QQ进入QQ对话框,电话直接发起拨号,分享直接进入朋友圈等)。
4.url地址过滤,针对某些地址,为了使用体验跳转到系统浏览器。
5.版本更新迭代。
6.APP访问请求头追加信息描述,服务器能做出相应不同的展示。
7.APP通过注入JS动态动对H5页面做一些智能化场景(自动登陆,智能填写补充,智能提示..)。
如果想要更精细,都是可以实现,比如消息推送,悬浮导航等。
//versionCheck.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
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
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
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
<?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
<?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
<?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
<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>
下载:代码打包