Android的Kotlin嘗試之旋轉餅圖1

簡介

大一開始憧憬寫安卓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時出了點小意外,快速解決.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章