博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用Android Studio快速搭建App
阅读量:2061 次
发布时间:2019-04-29

本文共 16533 字,大约阅读时间需要 55 分钟。

大家好,我是烤鸭:

给大家分享一个简单的用Android Studio快速搭建app

工具:

 Android Studio 64位 专业版

插件:

  Datepicker Timepicker okhttp

实现需求:

 界面上选择时间,发get/post请求到后台,获取选择的时间。

1.修改AndroidManifest.xml文件

 其中可以修改app样式,app图标,进入app的最先执行哪个activity,

最重要的!!!

创建的activity一定要在这里注册。

项目名/app/build.gradle中添加依赖,这里贴一下我用到的。

apply plugin: 'com.android.application'android {    compileSdkVersion 26    defaultConfig {        applicationId "com.example.gmwang.washapplication"        minSdkVersion 15        targetSdkVersion 26        versionCode 1        versionName "1.0"        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}dependencies {    implementation fileTree(dir: 'libs', include: ['*.jar'])    implementation 'com.android.support:appcompat-v7:26.1.0'    implementation 'com.android.support.constraint:constraint-layout:1.0.2'    testImplementation 'junit:junit:4.12'    androidTestImplementation 'com.android.support.test:runner:1.0.1'    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'    compile 'pl.droidsonroids.gif:android-gif-drawable:1.2.7'    compile 'com.squareup.okhttp3:okhttp:3.3.0'    compile 'com.android.support:design:+'    compile 'com.zhy:okhttputils:2.6.1'    compile 'com.alibaba:fastjson:1.2.7'}

2.创建Splash页面

 可以看到上面我设置的最先跳转的activity是SplashActivity,这是一个过渡页面,一般app都是有一个页面或者是广告,等几秒再进入app的首页。

创建SplashActivity

package com.example.gmwang.washapplication;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.annotation.Nullable;import java.util.Timer;import java.util.TimerTask;/** * Created by gmwang on 2017/11/15. */public class SplashActivity extends Activity {    Timer timer;    Message message;    private Handler handler = new Handler() {        public void handleMessage(Message msg) {            switch (msg.what) {                case 1:                    if (timer != null) {                        timer.cancel();                        timer = null;                    }                    Intent i = new Intent(SplashActivity.this,WashViewActivity.class);                    startActivity(i);                    break;                default:                    break;            }        }    };    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_spalsh);        timer = new Timer();        timer.scheduleAtFixedRate(new TimerTask() {            @Override            public void run() {                message = new Message();                message.what = 1;                handler.sendMessage(message);            }        }, 3000, 3000);    }}

先说这一行:

setContentView(R.layout.activity_spalsh);

需要创建activity_spalsh的layout,就是页面。

这里就是画了一个简单的页面,里边放了一张图。

代码如下:

再说这一行:

Intent i = new Intent(SplashActivity.this,WashViewActivity.class);

就是从这个页面3秒之后,跳转到哪个acticity。

3.创建WashViewActivity页面

这个页面就稍微复杂点,需要有picker插件和okhttp。

先把代码贴出来:

package com.example.gmwang.washapplication;import android.app.Activity;import android.app.DatePickerDialog;import android.app.TimePickerDialog;import android.content.Intent;import android.os.Bundle;import android.support.constraint.ConstraintLayout;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.DatePicker;import android.widget.TextView;import android.widget.TimePicker;import android.widget.Toast;import com.alibaba.fastjson.JSONObject;import com.example.gmwang.washapplication.utils.Constants;import com.zhy.http.okhttp.OkHttpUtils;import com.zhy.http.okhttp.callback.StringCallback;import java.util.Calendar;import okhttp3.Call;/** * Created by gmwang on 2017/11/24. */public class WashViewActivity extends Activity {    private TextView tvShowDialog;    private TextView timeDialog;    private Calendar cal;    private int year, month, day;    private int hour, minute;    private String dateString = "0000";    private String timeString = "0000";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_washview);        Button recordButton = findViewById(R.id.recordId);        Button recordListButton = findViewById(R.id.recordList);        tvShowDialog = (TextView) findViewById(R.id.tvShowDialog);        timeDialog = (TextView) findViewById(R.id.timeDialog);        //获取当前日期        getDate();        tvShowDialog.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                switch (view.getId()) {                    case R.id.tvShowDialog:                        DatePickerDialog.OnDateSetListener listener = new DatePickerDialog.OnDateSetListener() {                            @Override                            public void onDateSet(DatePicker arg0, int year, int month, int day) {                                dateString = year + "-" + (++month) + "-" + day;                                tvShowDialog.setText(dateString);      //将选择的日期显示到TextView中,因为之前获取month直接使用,所以不需要+1,这个地方需要显示,所以+1                            }                        };                        DatePickerDialog dialog = new DatePickerDialog(WashViewActivity.this, 0, listener, year, month, day);//后边三个参数为显示dialog时默认的日期,月份从0开始,0-11对应1-12个月                        dialog.show();                        break;                    default:                        break;                }            }        });        timeDialog.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                switch (view.getId()) {                    case R.id.timeDialog:                        TimePickerDialog.OnTimeSetListener listener = new TimePickerDialog.OnTimeSetListener() {                            @Override                            public void onTimeSet(TimePicker timePicker, int hour, int minute) {                                timeString = hour + ":"+minute;                                timeDialog.setText(timeString);                            }                        };                        TimePickerDialog dialog = new TimePickerDialog(WashViewActivity.this, 0, listener, hour, minute,true);                        dialog.show();                        break;                    default:                        break;                }            }        });        recordButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Log.e("recordButton",dateString);                if(TextUtils.isEmpty(tvShowDialog.getText())){                    Toast.makeText(getApplicationContext(), "请先选择日期!!!!!!", Toast.LENGTH_LONG).show();                    return ;                }                if(TextUtils.isEmpty(timeDialog.getText())){                    Toast.makeText(getApplicationContext(), "请先选择时间!!!!!!", Toast.LENGTH_LONG).show();                    return ;                }                String url = Constants.url+"addRecord";                StringBuffer sb = new StringBuffer();                OkHttpUtils.get().url(url).addParams("cuuid","66666").addParams("washDate", dateString).addParams("washTime",timeString).build().execute(new StringCallback() {                    @Override                    public void onError(Call call, Exception e, int id) {                        Log.e("onError:", e.toString());                    }                    @Override                    public void onResponse(String response, int id) {                        Log.e("onResponse:", response);                        JSONObject responseJson = (JSONObject) JSONObject.parse(response);                        String code = responseJson.getString("code");                        String message = responseJson.getString("message");                        //保存成功                        if("100".equals(responseJson.get("code"))){                            Toast.makeText(getApplicationContext(), code+","+responseJson.get("message"), Toast.LENGTH_LONG).show();                        }else{                            Toast.makeText(getApplicationContext(), code+","+responseJson.get("message"), Toast.LENGTH_LONG).show();                        }                    }                });            }        });    }    //获取当前日期    private void getDate() {        cal = Calendar.getInstance();        year = cal.get(Calendar.YEAR);       //获取年月日时分秒        Log.i("wxy", "year" + year);        month = cal.get(Calendar.MONTH);   //获取到的月份是从0开始计数        day = cal.get(Calendar.DAY_OF_MONTH);        hour = cal.get(Calendar.HOUR_OF_DAY);        minute = cal.get(Calendar.MINUTE);    }}

代码有点多,我们一行一行看:

setContentView(R.layout.activity_washview);

跟上面一样,去画个页面activity_washview去,页面上有时间选择插件。

效果:

3.1 activity_washview代码:

>

3.2 贴一下自定义样式,就是个边框,dateshape.xml

3.3 关于textview和button

定义的textview和button都是根据id来找的。

比如:

private TextView tvShowDialog;

tvShowDialog = (TextView) findViewById(R.id.tvShowDialog);

这样就找到这个textView,就可以给他赋值或者其他操作了。button也是一样。

3.4 时间选择插件

DatePicker插件:

tvShowDialog.setOnClickListener 是选择后获取年/月/日/的

TimeDatePicker插件:

timeDialog.setOnClickListener 是选择后获取时/分/的

3.5 http请求

后面的按钮点击方法

recordButton.setOnClickListener,发送http请求,利用okhttp组件

可以看到这里的OkHttpUtils,贴一下代码

package com.zhy.http.okhttp;import com.zhy.http.okhttp.builder.GetBuilder;import com.zhy.http.okhttp.builder.HeadBuilder;import com.zhy.http.okhttp.builder.OtherRequestBuilder;import com.zhy.http.okhttp.builder.PostFileBuilder;import com.zhy.http.okhttp.builder.PostFormBuilder;import com.zhy.http.okhttp.builder.PostStringBuilder;import com.zhy.http.okhttp.callback.Callback;import com.zhy.http.okhttp.request.RequestCall;import com.zhy.http.okhttp.utils.Platform;import java.io.IOException;import java.util.concurrent.Executor;import okhttp3.Call;import okhttp3.OkHttpClient;import okhttp3.Response;/** * Created by zhy on 15/8/17. */public class OkHttpUtils{    public static final long DEFAULT_MILLISECONDS = 10_000L;    private volatile static OkHttpUtils mInstance;    private OkHttpClient mOkHttpClient;    private Platform mPlatform;    public OkHttpUtils(OkHttpClient okHttpClient)    {        if (okHttpClient == null)        {            mOkHttpClient = new OkHttpClient();        } else        {            mOkHttpClient = okHttpClient;        }        mPlatform = Platform.get();    }    public static OkHttpUtils initClient(OkHttpClient okHttpClient)    {        if (mInstance == null)        {            synchronized (OkHttpUtils.class)            {                if (mInstance == null)                {                    mInstance = new OkHttpUtils(okHttpClient);                }            }        }        return mInstance;    }    public static OkHttpUtils getInstance()    {        return initClient(null);    }    public Executor getDelivery()    {        return mPlatform.defaultCallbackExecutor();    }    public OkHttpClient getOkHttpClient()    {        return mOkHttpClient;    }    public static GetBuilder get()    {        return new GetBuilder();    }    public static PostStringBuilder postString()    {        return new PostStringBuilder();    }    public static PostFileBuilder postFile()    {        return new PostFileBuilder();    }    public static PostFormBuilder post()    {        return new PostFormBuilder();    }    public static OtherRequestBuilder put()    {        return new OtherRequestBuilder(METHOD.PUT);    }    public static HeadBuilder head()    {        return new HeadBuilder();    }    public static OtherRequestBuilder delete()    {        return new OtherRequestBuilder(METHOD.DELETE);    }    public static OtherRequestBuilder patch()    {        return new OtherRequestBuilder(METHOD.PATCH);    }    public void execute(final RequestCall requestCall, Callback callback)    {        if (callback == null)            callback = Callback.CALLBACK_DEFAULT;        final Callback finalCallback = callback;        final int id = requestCall.getOkHttpRequest().getId();        requestCall.getCall().enqueue(new okhttp3.Callback()        {            @Override            public void onFailure(Call call, final IOException e)            {                sendFailResultCallback(call, e, finalCallback, id);            }            @Override            public void onResponse(final Call call, final Response response)            {                if (call.isCanceled())                {                    sendFailResultCallback(call, new IOException("Canceled!"), finalCallback, id);                    return;                }                if (!finalCallback.validateReponse(response, id))                {                    sendFailResultCallback(call, new IOException("request failed , reponse's code is : " + response.code()), finalCallback, id);                    return;                }                try                {                    Object o = finalCallback.parseNetworkResponse(response, id);                    sendSuccessResultCallback(o, finalCallback, id);                } catch (Exception e)                {                    sendFailResultCallback(call, e, finalCallback, id);                }            }        });    }    public void sendFailResultCallback(final Call call, final Exception e, final Callback callback, final int id)    {        if (callback == null) return;        mPlatform.execute(new Runnable()        {            @Override            public void run()            {                callback.onError(call, e, id);                callback.onAfter(id);            }        });    }    public void sendSuccessResultCallback(final Object object, final Callback callback, final int id)    {        if (callback == null) return;        mPlatform.execute(new Runnable()        {            @Override            public void run()            {                callback.onResponse(object, id);                callback.onAfter(id);            }        });    }    public void cancelTag(Object tag)    {        for (Call call : mOkHttpClient.dispatcher().queuedCalls())        {            if (tag.equals(call.request().tag()))            {                call.cancel();            }        }        for (Call call : mOkHttpClient.dispatcher().runningCalls())        {            if (tag.equals(call.request().tag()))            {                call.cancel();            }        }    }    public static class METHOD    {        public static final String HEAD = "HEAD";        public static final String DELETE = "DELETE";        public static final String PUT = "PUT";        public static final String PATCH = "PATCH";    }}

要是没有添加依赖的,去build.gradle添加依赖,没有包的就ALT+ENTER引包。

再说一下这段请求代码,搞过后台的基本都能看懂。

OkHttpUtils.get().url(url).addParams("cuuid","66666").addParams("washDate", dateString).addParams("washTime",timeString).build().execute(new StringCallback() {                    @Override                    public void onError(Call call, Exception e, int id) {                        Log.e("onError:", e.toString());                    }                    @Override                    public void onResponse(String response, int id) {                        Log.e("onResponse:", response);                        JSONObject responseJson = (JSONObject) JSONObject.parse(response);                        String code = responseJson.getString("code");                        String message = responseJson.getString("message");                        //保存成功                        if("100".equals(responseJson.get("code"))){                            Toast.makeText(getApplicationContext(), code+","+responseJson.get("message"), Toast.LENGTH_LONG).show();                        }else{                            Toast.makeText(getApplicationContext(), code+","+responseJson.get("message"), Toast.LENGTH_LONG).show();                        }                    }                });

发了一个get请求,参数是cuuid,washDate,washTime,这两个时间就是上面从插件

选的。onResponse方法,需要返回标准的json格式,我这里定义的是

{"code":"100","message":"success"},后台需要的接口,这里不写了。

4.最后一步,打包

我这里没有连手机,如果你连手机,打开开发者模式,显示有你的手机,点击ok就好了。

打成apk文件。

第一次打的话,让你写密码什么的,一定要记住。。。

打好了就可以把apk分享给好友下载了。

贴一张我的app的图。

你可能感兴趣的文章
浏览器主页被篡改修复
查看>>
FFmpeg - 新老接口对比问题
查看>>
Windows下MinGW编译ffmpeg库
查看>>
SDL在windows下使用 - 显示YUV
查看>>
三种方式YUV420转RGB24/BGR24,实测可用
查看>>
Windows下使用VS2015编译openssl库
查看>>
Win10+VS2015编译libcurl
查看>>
Windows下使用jsoncpp
查看>>
Ubuntu下测试使用Nginx+uWsgi+Django
查看>>
Windows下编译x264
查看>>
visual studio调试内存泄漏工具
查看>>
开源Faac实现PCM编码AAC
查看>>
Windows下wave API 音频采集
查看>>
借船过河:一个据说能看穿你的人性和欲望的心理测试
查看>>
AndroidStudio 导入三方库使用
查看>>
Ubuntu解决gcc编译报错/usr/bin/ld: cannot find -lstdc++
查看>>
解决Ubuntu14.04 - 16.10版本 cheese摄像头灯亮却黑屏问题
查看>>
解决Ubuntu 64bit下使用交叉编译链提示error while loading shared libraries: libz.so.1
查看>>
MFC程序添加console窗口+printf打印输出信息
查看>>
VS生成DLL文件供第三方调用
查看>>