簡體   English   中英

活動 android 中的數據綁定?

[英]Data binding in activity android?

我正在從用戶的最后一個位置獲取天氣信息

這是我的 xml 布局

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

<data>

    <variable
        name="viewmodel"
        type="com.mountmeru.viewmodel.WeatherViewModel" />

</data>

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="20dp"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/location"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{ viewmodel.apiResponse.cityName}"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/minTemp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="@{`Min Temp:  ` + viewmodel.apiResponse.details.minTemp}"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/location" />

    <TextView
        android:id="@+id/maxTemp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="@{`Max Temp:  ` + viewmodel.apiResponse.details.maxTemp}"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/minTemp" />

    <TextView
        android:id="@+id/pressure"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="@{`Pressure:  ` + viewmodel.apiResponse.details.pressure}"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/maxTemp" />

    <TextView
        android:id="@+id/humidity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="@{`Humidity:  ` + viewmodel.apiResponse.details.humidity}"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/pressure" />

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

這是我的視圖模型

class WeatherViewModel(networkCall: NetworkCall) : ViewModel(),
Callback<Weather> {
var progressDialog: SingleLiveEvent<Boolean>? = null
var apiResponse: MutableLiveData<Weather>? = null
var networkCall: NetworkCall;

init {
    progressDialog = SingleLiveEvent<Boolean>()
    apiResponse = MutableLiveData<Weather>()
    this.networkCall = networkCall
}

fun fetchWeather(latitude: Double, longitude: Double) {
    progressDialog?.value = true
    networkCall.weatherCall(latitude, longitude).enqueue(this)

}

override fun onFailure(call: Call<Weather>, t: Throwable) {
    progressDialog?.value = false
}

override fun onResponse(call: Call<Weather>, response: Response<Weather>) {
    progressDialog?.value = false
    apiResponse?.value = response?.body()
}
}

這是我的活動

class MainActivity : AppCompatActivity() {
var binding: ActivityMainBinding? = null
private lateinit var fusedLocationClient: FusedLocationProviderClient
private val LOCATION_REQUEST_CODE = 1000
val weatherViewModel: WeatherViewModel by viewModel()
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
    binding.viewmodel=weatherViewModel

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)


    if (ActivityCompat.checkSelfPermission(
            this,
            Manifest.permission.ACCESS_FINE_LOCATION
        ) != PackageManager.PERMISSION_GRANTED
        && ActivityCompat.checkSelfPermission(
            this,
            Manifest.permission.ACCESS_COARSE_LOCATION
        ) != PackageManager.PERMISSION_GRANTED
    ) {
        ActivityCompat.requestPermissions(
            this,
            arrayOf(
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.ACCESS_COARSE_LOCATION
            ),
            LOCATION_REQUEST_CODE
        )
    } else {
        fetchLocation();
    }
    initObservables()
}

fun fetchLocation() {
    fusedLocationClient.lastLocation
        .addOnSuccessListener { location: Location? ->
            Log.e("lat", "" + location?.latitude);
            Log.e("long", "" + location?.longitude);
            location?.let { weatherViewModel.fetchWeather(it.latitude, it.longitude) }
        }
}

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<String?>,
    grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    when (requestCode) {
        LOCATION_REQUEST_CODE -> {

            // If request is cancelled, the result arrays are empty.
            if (grantResults.size > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED
            ) {
                fetchLocation();
            } else {
                Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

private fun initObservables() {
    weatherViewModel.apiResponse?.observe(this, Observer {

    })
}
}

我無法將我的視圖模型綁定到 xml。 它向我顯示錯誤smart cast of ActivityMainBinding is impossible

我在這里想念什么?

用這個:

private lateinit var binding: ActivityMainBinding

代替:

var binding: ActivityMainBinding? = null

當您將綁定設置為可為空時,您會收到該錯誤。 這是因為當您執行binding.viewmodel = weatherViewModel

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM