[英]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.