精华内容
下载资源
问答
  • 大前端场景前两天在福建,朋友打麻将要求我提供可以麻将上使用的摇骰子小程序(PS:之前开发了喝酒摇骰子的小程序),于是决定将之前的小程序功能迭代一下。之前的微信小程序《摇骰子辅助工具》,使用过的人数16万+,...
    9ea737da97466726689148aff673944e.png

    大前端

    场景

    前两天在福建,朋友打麻将要求我提供可以麻将上使用的摇骰子小程序(PS:之前开发了喝酒摇骰子的小程序),于是决定将之前的小程序功能迭代一下。

    之前的微信小程序《摇骰子辅助工具》,使用过的人数16万+,每月收益约1000元的广告费……关于这个小程序的功能就不细说了,真的有兴趣的小伙伴请自行点击看下,GitHub 也是开源的 https://github.com/ZweiZhao/DicePlay。

    9ed185a1db69d9ce1a2a4895527f296c.png

    DicePlay


    Uni

    Uni-App 是数字天堂公司维护开发的多端整合大前端框架,不做广告,自行查阅,只是我用到这个技术栈而已。


    之前技术

    《摇骰子辅助工具》最早使用原生小程序开发,后面转了 mpvue + coffeescript + pug + sass 开发,所以从 mpvue 转到 uni 很简单,因为 uni 官网有相关教程,按照方法走就行了。我这里遇到点恶心的事情,就是 cs、pug 与 sass 的抉择问题。最终结论就是手动(肯定用工具啦)把 cs、pug 与 sass 转换回了 js、html 与 css,原因很简单,那三个用着爽但是在新工具或框架下,未必完美支持,换回基础语言就可以保证换平台的便捷性

    6b2f8c65242f1319a98fe969d07c5ebc.png

    mpvue

    之前 mpvue 的一个页面或组件的结构是这样的,因为那时候 mpvue 对 cs 的支持很差,只能这样丑陋的外部引入了(现在 mpvue 好像凉了)。


    Uni Ver

    c0a02a23e91f48a68ac5ea5b504e7dc8.png

    uni ver

    uni 版本的结构会相对简单一点,官网也限制了你想不简单的路子……


    条件编译

    这个是真填坑神器……

    总之这个简单的修改项目,我要做到全平台(APP,H5,微信小程序),目前唯一遇到的坑,就是文件引用路径问题。

    1. 小程序引用 mp3 文件,使用本地路径不播放
    2. h5 打包发布使用 GitHub Pages 时候,换相对路径
    3. APP 使用绝对根路径

    上面三点把我坑惨了,换代码半小时,搞路径,快两小时。有想玩这个 uni 的,这一块务必注意啊!


    上面问题的解决方案如下:

    mp3 文件直接挂在小程序云开发的腾讯云上面

    点击上面的云开发,进去授权,并上传到储存管理即可。

    3d6017afd6d130e0a7698dbb391a6423.png

    云开发位置

    d4c1cea3a689e5c13de366238cb7ee3e.png

    存储管理

    获取存储后的地址然后小程序调用即可。

    注意,注意!这个链接是 cloud:// 协议,所以其他平台不能用!!!

    因此要用到条件编译来区分这个地址是小程序专用的,具体条件编译下面统一贴图。


    H5 打包引用路径处理

    比如我放在 GitHub Pages,依赖项目是 DicePlay,那么 Pages 给的地址就是(我绑定了域名):http://www.zweizhao.com/DicePlay/,结合这边打包后,生成的最后路径就是:http://www.zweizhao.com/DicePlay/unpackage/dist/build/h5/。

    可是,uni 默认是打包静态文件引用路径是:/static,那么这样引用就炸了,肯定获取不到。

    所以要去 manifest.json 里面源码修改添加这样:

    59d2f96a61c2b77e8f9f9ca683d91c6d.png

    manifest

    把文件包指定到这个地方。

    呵呵,你以为这就完了?

    js 文件里面引用的文件也要修改是相对路径,比如:"./"。

    所以……又要条件编译,同样等下面统一。

    这个问题,如果你项目丢在链接根目录就不用操心。


    APP 根路径

    这个我是试出来的,起码 iOS 是设置根路径获取,安卓就不是很清楚了,如果不是,那就再加一个条件变编译吧。

    于是当前就有了三个条件编译(APP,H5,微信小程序),如下:

    718906867260e2d94803cfb285ab21f7.png

    条件编译

    为什么我写的这么不优雅?

    还不是因为 uni 只提供了条件编译 || 判断,没有提供 && 判断……


    成果

    其他的暂时也不知道说啥,直接看成果吧,从左到右依次:H5,小程序,APP。

    4af28d6c652343723f3c2fb2d1021c57.png

    成果

    恩,看到这里,我觉得坑一点还是值得的……撒花。

    希望大家能够从文章里学到一点东西,谢谢。

    展开全文
  • 使用Retrofit这个网络框架而非直接使用OKhttp是因为Retrofit使用起来入手简单,...简单使用1、创建Retrofit实例Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.movie.com/") .build();注:bas...
    99c389097412451aad9962e94c0af744

    使用Retrofit这个网络框架而非直接使用OKhttp是因为Retrofit使用起来入手简单,配置灵活,而且其实质上也是对OKhttp的一个封装,并且支持同步异步和RXjava。

    简单使用

    1、创建Retrofit实例

    Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.movie.com/") .build();

    注:baseUrl必须以/结尾

    2、创建Java服务接口

    public interface MoviceService { @GET("users/{user}/movies") Call listMovies(@Path("user") String user);}

    注:此接口为实现服务调用接口,通过Retofit可以创建该接口的代理实现,从而进行方法调用。

    3、创建代理实现

    MoviceService service = retrofit.create(MoviceService.class);

    4、接口调用

    Call repos = service.listMovies("jshare");

    升级使用

    在默认情况下Retrofit只支持将HTTP的响应体转换换为ResponseBody,但一般情况下我们需要它返回我们自定义的实体;所以Retrofit提供了泛型支持响应转换。

    1、添加转换Converter支持

    api 'com.squareup.retrofit2:converter-gson:2.3.0'

    2、创建Retrofit实例支持转换

    Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.movie.com") //url 自己写 .addConverterFactory(GsonConverterFactory.create()) .build();

    3、自定义返回实体

    public class HttpResult { /** * 编码 */ protected int code; /** * 信息 */ protected String message; /** * 返回的数据内容,类型不确定,使用泛型T表示 */ private T data; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public T getData() { return data; } public void setData(T data) { this.data = data; }}

    4、接口调用

    @POST("api/movie")Observable> getCurrMovie(@Body MovieRequest request);

    再升级使用结合RxJava

    RxJava与CallAdapter

    简介

    RxJava 的本质可以压缩为异步这一个词。它就是一个实现异步操作的库。RxJava 的异步实现,是通过一种扩展的观察者模式来实现的。

    参考:扔物线大神的给Android开发者的 RxJava 详解

    RxJava的四个基本概念

    Observable (可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件.

    19dc42050af04556b409c57baf60fbb6

    Observable Observer 通过 subscribe() 方法实现订阅关系;从而 Observable 可以在需要的时候发出事件来通知 Observer。

    RxJava的四个事件回调方法:

    onSubscribe(@NonNull Disposable d): 提供给观察者当需要取消建立的连接时,进行取消操作;

    public void onSubscribe(@NonNull Disposable d) { d.dispose();//实现断开Observer 与 Observable 的连接 }

    onNext(): 被观察者可以多次调用此方法,返回给观察者不同的事件;

    onCompleted(): 事件队列完结;

    RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的 onNext() 发出时,需要触发 onCompleted() 方法作为标志。

    onError(): 事件队列异常;

    在事件处理过程中出异常时,onError() 会被触发,同时队列自动终止,不允许再有事件发出。

    注:在一个正确运行的事件序列中, onCompleted() 和 onError() 有且只有一个,并且是事件序列中的最后一个。需要注意的是,onCompleted() 和 onError() 二者也是互斥的,即在队列中调用了其中一个,就不应该再调用另一个。

    CallAdapter

    Converter是对于Call中T的转换,而CallAdapter则可以对Call转换;这样的话Call中的Call也是可以被替换的,而返回值的类型就决定你后续的处理程序逻辑,同样Retrofit提供了多个CallAdapter,这里以RxJava的为例,用Observable代替Call。

    Retrofit&RxJava使用

    1、引入RXJava支持

    api 'com.squareup.retrofit2:converter-gson:2.3.0'api 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

    2、Retrofit添加RXjava支持

    Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.movie.com").addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build();

    3、接口定义

    @POST("api/movieTask")Observable> getCurrTask(@Body MovieRequest request);

    4、接口调用

    MoviceService service = retrofit.create(MoviceService.class);Observable observable = service.getmovieResult(request).subscribeOn(Schedulers.io()) .subscribe(new Subscriber>() { @Override public void onCompleted() { System.out.println("onCompleted"); } @Override public void onError(Throwable e) { System.err.println("onError"); } @Override public void onNext(Result> movieResult) { System.out.println(movieResult); } });
    展开全文
  • 主要介绍了Android studio开发一个小型对话机器人app,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
  • 因项目需要做一个Android 的蓝牙app来通过手机蓝牙传输数据以及控制飞行器,... 该应用的Compile Sdk Version 和targetSdkVersion均为26,Min Sdk Version为22,基于Android studio平台开发。 一、声明蓝牙权限 ...

     

     

           因项目需要做一个Android 的蓝牙app来通过手机蓝牙传输数据以及控制飞行器,在此,我对这段时间里写的蓝牙app的代码进行知识梳理和出现错误的总结。

           该应用的Compile Sdk Version 和targetSdkVersion均为26,Min Sdk Version为22,基于Android studio平台开发。

     一、声明蓝牙权限

           首先,要在新建项目中的AndroidManifest.xml中声明两个权限:BLUETOOTH权限和BLUETOOTH_ADMIN权限。其中,BLUETOOTH权限用于请求连接和传送数据;BLUETOOTH_ADMIN权限用于启动设备、发现或进行蓝牙设置,如果要拥有该权限,必须现拥有BLUETOOTH权限。

           其次,因为android 6.0之后采用新的权限机制来保护用户的隐私,如果我们设置的targetSdkVersion大于或等于23,则需要另外添加ACCESS_COARSE_LOCATION和ACCESS_FINE_LOCATION权限,否则,可能会出现搜索不到蓝牙设备的问题。

     

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>

     


     二、 启动和关闭蓝牙

    1.首先,要获取BluetoothAdapter蓝牙适配器的对象,然后检测设备是否支持蓝牙。

     

    BluetoothAdapter blueadapter = BluetoothAdapter.getDefaultAdapter();
    //获取蓝牙适配器

     

    if(blueadapter==bull)
    //表示手机不支持蓝牙
    return;

     


    2.启动蓝牙功能:isEnable()方法用来检查蓝牙当前状态,如果方法返回false,则蓝牙没启动。enable()方法用来打开本地蓝牙适配器。

     if (!blueadapter.isEnabled())
            //判断本机蓝牙是否打开
            {//如果没打开,则打开蓝牙
            blueadapter.enable();
            }

     

    3.使用disable()可以关闭本地蓝牙适配器。

     

    三、发现蓝牙设备

    1.开启当前蓝牙的可见性
           Android 设备默认是不能被搜索的,如果想要本机设备可被搜索,可以以BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE动作为startActivity()方法的参数,这个方法会提交一个开启蓝牙可见的请求。默认的情况下,设备在120秒内可以被搜索,也可以自定义一个间隔时间,但是规定的最大值为300秒,0秒则表示设备可以一直被搜索,自定义时间通过EXTRA_DISCOVERABLE_DURATION来定义,代码如下。

    if (blueadapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) //不在可被搜索的范围
            {
            Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
            discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);//设置本机蓝牙在300秒内可见
            startActivity(discoverableIntent);
            }

     


    2.调用startDiscover()搜索蓝牙

           开启蓝牙后,调用startDiscover()方法搜索蓝牙,注意,只有开启了蓝牙可见性的设备才会响应。该搜索过程为异步操作,调用后讲以广播的机制返回搜索到的对象,搜索的过程一般为12秒,搜索过程页面会显示搜索到的设备。

     

    public void doDiscovry() {
        if (blueadapter.isDiscovering()) {
            //判断蓝牙是否正在扫描,如果是调用取消扫描方法;如果不是,则开始扫描
            blueadapter.cancelDiscovery();
        } else
            blueadapter.startDiscovery();
    
    }

     


    3.注册广播
           通过blueadapter.startDiscovery()来搜索蓝牙设备,要获取到搜索的结果需要注册广播。

     

           定义一个列表

    public ArrayAdapter adapter;
    ListView listView = (ListView) findViewById(R.id.list);//控件 列表

     

     

    //定义一个列表,存蓝牙设备的地址。
    public ArrayList<String> arrayList=new ArrayList<>();
    //定义一个列表,存蓝牙设备地址,用于显示。
    public ArrayList<String> deviceName=new ArrayList<>();

     

     

           将搜索到的显示在控件列表上

    adapter = new ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1, deviceName);
    listView.setAdapter(adapter);

     

     

           定义广播和处理广播消息

    IntentFilter intentFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);//注册广播接收信号
    registerReceiver(bluetoothReceiver, intentFilter);//用BroadcastReceiver 来取得结果
    
    private final BroadcastReceiver bluetoothReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                deviceName.add("设备名:"+device.getName()+"\n" +"设备地址:"+device.getAddress() + "\n");//将搜索到的蓝牙名称和地址添加到列表。
                arrayList.add( device.getAddress());//将搜索到的蓝牙地址添加到列表。
                adapter.notifyDataSetChanged();//更新
            }
        }
     };

     


           搜索完设备后,要记得注销广播。注册后的广播对象在其他地方有强引用,如果不取消,activity会释放不了资源 。

    protected void onDestroy(){
        super.onDestroy();//解除注册
        unregisterReceiver(bluetoothReceiver);
    }



    4.了解targetSdkVersion是否大于或等于23

           若是大于或等于23,除了添加了蓝牙权限外,还要动态获取位置权限,才能将搜索到的蓝牙设备显示出来。若是小于,则不需要动态获取权限。
    动态申请权限,网上例子如下。

     

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        if (requestCode == REQUEST_ENABLE_BT) {
            if (resultCode == RESULT_OK) {
                textView.setText("打开蓝牙成功");
            }
            if (resultCode == RESULT_CANCELED) {
                textView.setText("放弃打开蓝牙");
            }
        } else {
            textView.setText("蓝牙异常");
        }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_COARSE_LOCATION:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                }
                break;
        }
    }

     

     

     四、配对蓝牙设备

           蓝牙的配对和连接有两种方式。一种是每个设备作为一个客户端去连接一个服务端,向对方发起连接。另一种则是作为服务端来接收客户端发来连接的消息。蓝牙之间的数据传输采用的是和TCP传输类似的传输机制。

    1.作为客户端连接
           首先要获取一个代表远程设备BluetoothDevice的对象,然后使用该BluetoothDevice的对象来获取一个BluetoothSocket对象。BluetoothSocket对象调用connect()可以建立连接。

           蓝牙连接整个过程需要在子线程中执行的,并且要将 scoket.connect()放在一个新的子线程中,因为如果将这个方法也放在同一个子线程中解决的话,就会永远报错read failed, socket might closed or timeout, read ret: -1;借鉴网上的方法:再开一个子线程专门执行socket.connect()方法,问题可以解决;

           另外,借鉴网上方法和建议,在获得socket的时候 ,尽量不使用uuid方式;因为这样虽然能够获取到socket 但是不能进行自动,所以使用的前提是已经配对了的设备连接;

           使用反射的方式,能够自动提示配对,也适合手机间通信。

     

    final BluetoothSocket socket = (BluetoothSocket) device.getClass().getDeclaredMethod("createRfcommSocket", new Class[]{int.class}).invoke(device, 1);

     


           代码中的device需要把注册广播时的device作为参数传进线程中。注意,传进来的device的值要为远程设备的地址,若不是或有出入,则可能会出现NullPointerException异常,并提示尝试调用一个空的对象。为了解决这个问题,可以把显示获得的device名字、地址和传入线程的device的地址分在不同的集合类。传入线程的device使用只有设备地址的集合类。

           在连接蓝牙之前,还要先取消蓝牙设备的扫描,否则容易连接失败。

     

    adapter.cancelDiscovery();//adapter为获取到的蓝牙适配器
    socket.connect();//连接

     

     

    2.作为服务端连接
           服务端接收连接需要使用BluetoothServerSocket类,它的作用是监听进来的连接,在一个连接被接收之后,会返回一个BluetoothSocket对象,这个对象可以用来和客户端进行通信。

           与客户端一样,服务端也要在子线程中实现。通过调用listenUsingRfcommWithServiceRecord(String,UUID)方法可以得到一个BluetoothServerSocket的对象,然后再用这个对象来调用accept()来返回一个BluetoothSocket对象。由于accept()是个阻塞的方法,它会直到接收到一个连接或异常之后才会返回,所以要放在子线程中。

    
    
    bluetoothServerSocket=bluetoothAdapter.listenUsingRfcommWithServiceRecord(bluetoothAdapter.getDefaultAdapter().getName(), UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
    //bluetoothServerSocket= (BluetoothServerSocket) bluetoothAdapter.getClass().getMethod("listenUsingRfcommOn",new Class[]{int.class}).invoke(bluetoothAdapter,10);
    socket=bluetoothServerSocket.accept();//接收连接

     


           代码中注释掉的内容是通过反射的方式来接收,由于我使用时出现了异常,所以暂时不考虑这个方法。

           还有,与TCP不同的是,这个连接时只允许一个客户端连接,因此在BluetoothServerSocket对象接收到一个连接请求时就要立刻调用close()方法把服务端关闭。


    五、客户端发送数据

           当两个设备成功连接之后,双方都会有一个BluetoothSocket对象,这时,就可以在设备之间传送数据了。

           1.使用getOutputStream()方法来获取输出流来处理传输。

           2.调用write()。

    os = socket.getOutputStream();//获取输出流
    if (os != null) {//判断输出流是否为空
        os.write(message.getBytes("UTF-8"));
    }
    os.flush();//将输出流的数据强制提交
    os.close();//关闭输出流
    }

     

           将输出流中的数据提交后,要记得关闭输出流,否则,可能会造成只能发送一次数据。

     

    六、服务端接收数据

           1.使用getInputStream()方法来获取输入流来处理传输。

           2.调用read()。

     

       

    InputStream im=null;
    im=bluetoothSocket.getInputStream();
    byte buf[] = new byte[1024];
    if (is != null) {
        is.read(buf, 0, buf.length);//读取发来的数据
        String message = new String(buf);//把发来的数据转化为String类型
        BuletoothMainActivity.UpdateRevMsg(message);//更新信息在显示文本框
        is.close();//关闭输入流

     

     

           使用服务端接收数据时,要先从客户端向服务端发起连接,只有接收到连接请求之后,才会返回一个BluetoothSocket对象。有BluetoothSocket对象才能获取到输入流。

     

           下面是将接收到数据显示在界面的方法:

            在Activity中定义Handler类的对象handler。

    public static void UpdateRevMsg(String revMsg) {
        mRevMsg=revMsg;
        handler.post(RefreshTextView);
    }
    
    private static Runnable RefreshTextView=new Runnable() {
        @Override
        public void run() {
            textView2.setText(mRevMsg);
        }
    };

     

    转载于:https://www.cnblogs.com/lwkdbk/p/9939643.html

    展开全文
  • 资源名称:Android APP开发入门 使用Android Studio环境内容简介:本书从初学者的角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用AndroidStudio开发环境开发Android应用程序应该掌握的各方面技术。...
  • 前言:这是我独立做的第一个...源码:欢迎satr or fork备注:APP中所涉及到的图标请勿商用效果图(备注:在把图片制作成gif时,图片的质量受损,所以最终呈现出来的gif图片,背景变得有些模糊)开发环境IDE:Android...

    前言:

    这是我独立做的第一个APP,是一个记账本APP。

    This is the first APP, I've ever done on my own. It's a accountbook APP.

    源码:

    欢迎satr or fork

    备注:

    APP中所涉及到的图标请勿商用

    效果图

    (备注:在把图片制作成gif时,图片的质量受损,所以最终呈现出来的gif图片,背景变得有些模糊)

    开发环境

    IDE:Android Studio

    Database:SQLite

    功能介绍

    该APP共包含6个功能,分别是:

    1、登录&注册功能:

    进入该界面,默认是让用户进行登录操作;

    若用户之前没有注册过,则会提示让用户进行注册;

    若用户忘记登录密码,也有重置密码的功能。

    2、收入&支出功能:

    该功能分为两个页签:明细、类别报表

    这两个页签内容,都根据月份来统计呈现(开发中,目前是呈现所有收支明细)

    并根据月份,显示当月的收入与支出(开发中,目前是呈现固定值)

    明细页签:

    在该页签最下方会显示【记一笔】按钮,点击该按钮,会提示让用户选择记录的类型,是收入 or 支出

    然后会进入到记录收支明细的界面

    根据用户的选择类型,来呈现不同的内容

    当用户录入好收支明细,点击保存,会返回到明细页签,此时会刷新明细页签的内容(刷新功能开发中)

    类别报表页签:

    该页签会根据用户的收支明细的类别来进行统计,呈现方式是圆形饼图(具体的统计逻辑开发中)

    3、统计功能:

    该功能分为两个页签:明细、类别报表(该功能和收入&支出功能类似)

    这两个页签内容,都根据月份来统计呈现(开发中,目前是呈现所有收支明细)

    并根据月份,显示当月的结余,以及相比上月支出(开发中,目前是呈现固定值)

    4、特殊设置功能:该功能正在设计中。

    5、心愿墙功能:该功能正在设计中。

    6、关于我们功能:该功能主要是对APP进行简要介绍。

    数据库设计:

    目前APP共涉及到三个表,分别是:用户信息表、配置表、收支明细表

    1 public voidonCreate(SQLiteDatabase db){2 //user table

    3 db.execSQL("create table if not exists user_tb(_id integer primary key autoincrement," +

    4 "userID text not null," +

    5 "pwd text not null)");6

    7 //Configuration table

    8 db.execSQL("create table if not exists refCode_tb(_id integer primary key autoincrement," +

    9 "CodeType text not null," +

    10 "CodeID text not null," +

    11 "CodeName text null)");12

    13 //costDetail_tb

    14 db.execSQL("create table if not exists basicCode_tb(_id integer primary key autoincrement," +

    15 "userID text not null," +

    16 "Type integer not null," +

    17 "incomeWay text not null," +

    18 "incomeBy text not null," +

    19 "category text not null," +

    20 "item text not null," +

    21 "cost money not null," +

    22 "note text not null," +

    23 "makeDate text not null)");24 }

    教程

    以下博文是根据APP中涉及到的功能进行整理的,如下:

    参考:

    首页的旋转菜单参考该博文:参考

    版本:

    目前的版本为V1.0

    APP还有很多功能需要继续完善,希望有兴趣的小伙伴可以一起参与进来,和我一起来开发完善。

    一点想说的话

    不论遇到什么困难,都不应该成为我们放弃的理由

    展开全文
  • 全书共分16章,内容包括使用AndroidStudio开发AndroidApp、Android程序设计基础讲座、应用程序界面设计、事件处理、用户界面的基本组件、高级UI组件、即时信息对话框、用Intent启动程序中的其他Activity、用Intent...
  • update完整操作实例创建SQLiteOpenHelper类创建数据库调用和操作类与DatabaseButtonActivity 相关联的XML文件运行效果结语 SQLite数据库 简介 SQLite数据库是开源嵌入式数据库,支持的数据库大小为2TB. SQLite
  • 开发安卓APP的五种框架界面设计 开发安卓app,我们需要美观的界面,然后这些界面,我们必须要掌握的就是对应的框架布局,本次博客,我们将进行app界面的五种框架布局,并给出对应的界面设计的例子 (一)、线性布局...
  • 写好aidl 文件以后,利用Android Studio自动生成代码,并通过两个app实现简单的binder通信
  • android for vs (一)visual studio android 开发实例 相关 vs 的 android 开发环境安装配置可以看我的前一篇文章 这里使用 vs2010 自带的实例进行开发与调试 一、新建项目  文件 -> 新建 -> 项目,我们...
  • Android Studio中有一个模板可以创建左侧抽屉,但儒释道网络电台APP需要两边两个抽屉。在网上找到一篇文章《AndroidDrawerLayout+fragment布局实现左右侧滑 》,是使用FragmentTransaction来实现左右侧栏的显现。...
  • 前言:这是我独立做的第一个...源码:欢迎satr or fork备注:APP中所涉及到的图标请勿商用效果图(备注:在把图片制作成gif时,图片的质量受损,所以最终呈现出来的gif图片,背景变得有些模糊)开发环境IDE:Android...
  • 使用的工具:Android Studio 开发APP Eclipse 发布Servlet,数据传递 二丶运行代码: Tomcat 发布的Servlet 类: package com.Servlet; import java.io.IOException; import javax.servlet.ServletException; ...
  • 作为一名android客户端开发人员,肯定会遇到过ANR或者OOM的案例, 少部分案例除了部分业务上面的代码同步或者死锁的原因导致的外,绝大多数都是因为我们缺乏良好的代码质量导致内存泄漏或者说app内存优化的经验....
  • 前言:现在一般的Android软件...开发环境:AndroidStudio2.1.2+gradle-2.10 部分代码: public class UpdateVersionController { private Context context; //更新文件的实例 private AppUpdateInfo info; //当前

空空如也

空空如也

1 2 3 4
收藏数 68
精华内容 27
关键字:

androidstudio开发app实例