soft

soft

移动版页面打包成APK安装包,混合开发体验

        公司想花最少的开发成本,将现有的移动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>


下载:代码打包



发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

联系我 331434376    15629529961