Android的Kotlin尝试之记账APP1

简介

大一开始憧憬写安卓APP,然后只是个全然不懂编程的小白,2017年暑假开始接触编写Android APP.之前搭建了个简单的MQTT服务器,现在的目标是用APP实现数据的查询与可视化,关于MQTT,以前有使用paho.mqtt的经验.现在先学习下Android UI相关的知识.当然,这次学习也是收获了良多的坑.

第一步:布局(解析json数据,并将数据展示在Fragment上)

添加依赖

首先创建工程
添加依赖:

ext.anko_version='0.10.1'
/*AnkoCommons*/
compile "org.jetbrains.anko:anko-commons:$anko_version"
/*AnkoLayouts*/
compile "org.jetbrains.anko:anko-sdk25:$anko_version"
compile "org.jetbrains.anko:anko-appcompat-v7:$anko_version"
/*Kotson 基于Gson的json序列化工具*/
compile 'com.github.salomonbrys.kotson:kotson:2.5.0'

布局文件:

<!--activity_main-->
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/constraintLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.view.ViewPager
        android:id="@+id/vpMain"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

</android.support.constraint.ConstraintLayout>

源码:

/*MainActivity.kt*/
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v4.app.FragmentPagerAdapter
import android.support.v4.view.ViewPager
import com.github.salomonbrys.kotson.fromJson
import com.google.gson.Gson
import org.jetbrains.anko.*

class MainActivity : AppCompatActivity() {
    //首先创建一个测试用的json字符串,但是要注意放在列表中
    private val dataJson = """[{"date":"2017年五月","obj":[{"title":"外卖","value":30},{"title":"娱乐","value":30},{"title":"其他","value":40}]},{"date":"2017年五月","obj":[{"title":"外卖","value":15},{"title":"娱乐","value":40},{"title":"其他","value":135}]},{"date":"2017年五月","obj":[{"title":"外卖","value":50},{"title":"娱乐","value":25},{"title":"其他","value":25}]}]"""
    //延迟初始化一个mData,用来存放解析出来的MonthBean的集合,这里有三个
    lateinit var mData: ArrayList<MonthBean>
    lateinit var vpMain:ViewPager
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        vpMain=find(R.id.vpMain)
        //在里面解析json数据
        initData()
        //在里面初始化Fragment
        initView()
    }

    private fun initData() {
        val gson = Gson()
        //将json数据解析为MonthBean的列表
        mData = gson.fromJson(dataJson)
    }

    private fun initView() {
        vpMain.adapter = object : FragmentPagerAdapter(supportFragmentManager) {
            //设置有多少个Fragment 
            override fun getCount(): Int {
                return mData.size
            }
            //设定每个Fragment的实例
            override fun getItem(position: Int): android.support.v4.app.Fragment {
                return newInstance(mData[position].toString)
            }
        }
    }
}

因为缺乏Gson库使用经验,在解析JSON时没有将MonthBean与PieBean内的数据参数名对应,导致解析抛异常
即:data class MonthBean(val date: String, val obj: ArrayList<PieBean>)中date对应dataJson 中的”date”

/*PieFigPieFragment.kt*/
import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import org.jetbrains.anko.*

const val dataKey = "pie_fragment_data_key"

class PieFragment : Fragment() {
    private lateinit var mData: String
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //接收消息,提取消息里的字符串数据
        mData = arguments?.getString(dataKey) ?: "isNull"
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        //创建一个TextView用来展示消息
        val textView=TextView(context)
        textView.text=mData
        return textView
    }
//顶层函数代替JAVA里的静态方法,将消息发送给实例化的PieFragment
fun newInstance(data: String): PieFragment {
    val args = Bundle()
    args.putString(dataKey, data)
    val fragment = PieFragment()
    fragment.arguments = args
    return fragment
}
/*BeanData.kt*/
data class MonthBean(val date: String, val obj: ArrayList<PieBean>)
data class PieBean(val title: String, val value: Int)

到第二步这里问题不是太大,只是在解析json时出了点小意外,快速解决.

猜你喜欢

转载自blog.csdn.net/qq_37258787/article/details/79275550
今日推荐