1

我有以下 Kotlin / Anko / Android 活动。

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.widget.TextView
import com.fasterxml.jackson.module.kotlin.readValue
import com.github.kittinunf.fuel.Fuel
import eu.gwapi.laaketilaus.util.JSON
import eu.gwapi.laaketilaus.util.Order
import org.jetbrains.anko.find
import org.jetbrains.anko.textView
import org.jetbrains.anko.toast
import org.jetbrains.anko.verticalLayout

class OrderDetailsActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val order_id: Long = intent.extras.getLong("order_id")
        verticalLayout {
            textView {
                id = R.id.order_detail_customer
            }
            textView {
                id = R.id.order_detail_address
            }
            textView {
                id = R.id.order_detail_postal_code
            }
            textView {
                id = R.id.order_detail_phone
            }
        }
        getOrder(order_id)
    }

    fun getOrder(order_id: Long) {
        Fuel.get("https://my.api.endpoint/" + order_id.toString()).responseString { request, response, result ->
            val (json, err) = result
            if (err != null) {
                toast(err.toString())
            } else {
                val order: Order = JSON.readValue(json!!)
                find<TextView>(R.id.order_detail_customer).text = order.customer
                find<TextView>(R.id.order_detail_address).text = order.address
                find<TextView>(R.id.order_detail_postal_code).text = order.postal_code
                find<TextView>(R.id.order_detail_phone).text = order.phone
            }
        }
    }
}

对于像我这样顽固的 pythonista 来说,这似乎是一种非常静态和冗长的方式。

有没有更好的办法?

4

2 回答 2

1

由于只有TextViews 并且您只需要更改它们的文本,因此您可以通过以下方式简化代码:

  • Order为存储 ID 的属性添加映射:

    private val orderPropertyToTextViewId = mapOf(
            Order::customer to R.id.order_detail_customer,
            Order::address to R.id.order_detail_address,
            Order::postalCode to R.id.order_detail_postal_code,
            Order::phone to R.id.order_detail_phone
    )
    
  • 创建遍历地图的视图:

    verticalLayout {
        for ((property, textViewId) in orderPropertyToTextViewId) {
            textView { id = textViewId }
        }
    }
    
  • 更新遍历地图的文本:

    for ((property, textViewId) in orderPropertyToTextViewId) {
        findViewById<TextView>(textViewId).text = property.get(order)
    }
    

findViewById<TextView>(...)如果您将调用TextView返回的 s而不是映射中的 ID 存储在地图中,您可以更进一步摆脱 ID textView { ... },但这需要进一步试验。

于 2017-02-15T10:49:58.913 回答
1

如果您不需要经常刷新新数据,则无需保留对TextView. 我不使用 Anko,但它可能看起来像:

val order: Order = JSON.readValue(json!!)
verticalLayout {
    arrayOf(order.customer, order.address, order.postal_code, order.phone)
            .map {
                textView {
                    text = it
                }
            }
}
于 2017-02-15T12:41:14.697 回答