当前位置: 首页 > 知识库问答 >
问题:

activity安卓中的数据绑定?

谭琛
2023-03-14

我正在从用户的上一个位置获取天气信息

这是我的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>

这是我的viewmodel

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()
}
}

这是我的activity

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 {

    })
}
}

我无法将viewmodel绑定到XML。 它显示错误ActivityMainBinding的智能强制转换是不可能的

我错过了什么?

共有1个答案

鱼渝
2023-03-14

使用此选项:

private lateinit var binding: ActivityMainBinding

而不是:

var binding: ActivityMainBinding? = null

当您将绑定设置为可空时,您将得到该错误。 这是因为当您执行绑定时,它可能是空的。viewModel=WeatherViewModel

 类似资料:
  • 我有一个做片段交易的activity 很管用。现在,我知道在我的activity中有一个动态字符串,我需要在NewFragment中的布局中替换。我想我可以在transaction.commit()之后调用类似于 在newFragment.java中 关键是getActivity()返回null。如何获得查找布局元素所需的上下文? 编辑: 我试图遵循使用捆绑的路线,因为这似乎是最干净的方式。所以我

  • 我是Android开发的新手,在创建一个新的时遇到了一些问题。我想在单击但应用程序崩溃时启动一个新的。以下是控制台和logcat中的内容: logcat null

  • 本文向大家介绍分享一个安卓的内置多种工具类的Activity,包括了分享一个安卓的内置多种工具类的Activity的使用技巧和注意事项,需要的朋友参考一下 一个安卓的Activity,内置了多种工具类。要用的话,让自己的Activity继承这个Activity,各种方便,便于理解我在每个方法上都写了详细的注释,添加了网络部分,添加了表单文件一键上传 演示图 代码 以上所述就是本文的全部内容了,希望

  • AngularJS中的数据绑定就是模型与视图间的自动同步。这种实现方式让你能专心地处理你的模型。视图总是模型的投影。当模型改变,视图就会反映这种改变,反之亦然。 传统的模板系统数据绑定 大部分模板系统都是这种绑定方式。 方向:如图所示,它们将模型和模板结合生成视图。这个结合过程产生的视图不是动态更新的。更糟的是,任何用户和视图的交互都不会反映到模型。这意味着开发者要自动写视图和模型双向的同步代码。

  • 本文向大家介绍Android Activity 怎么和Service 绑定?相关面试题,主要包含被问及Android Activity 怎么和Service 绑定?时的应答技巧和注意事项,需要的朋友参考一下 这需要实现service中的onBind()函数以返回service实例给activity 1、创建service类和activity类。 2、在service类中定义一个内部类继承自Bind

  • 数据绑定 JXML 中的动态数据来自于该 Page 的 data字段。 简单绑定 数据绑定使用 Mustache 语法(双大括号)将变量包起来,可以作用于以下: 页面内容 <view> hello {{ name }} </view> Page({ data: { name: 'cortana' } }) 组件属性(需要在双引号之内) <view id="{{id}}"> </

  • 我一直在努力弄清楚为什么会出现错误:java.lang.NullPointerException:试图对空对象引用调用虚拟方法“java.lang.String java.lang.object.ToString()” 以下是错误的完整描述: 2021-03-15 14:15:49.906 244 47-24447/com.goldencrestit.Quicky2 D/AndroidRuntim

  • 本文向大家介绍activity和service的绑定方式以及怎么在Activity 中启动自己对应的Service?相关面试题,主要包含被问及activity和service的绑定方式以及怎么在Activity 中启动自己对应的Service?时的应答技巧和注意事项,需要的朋友参考一下 1、activity能进行绑定得益于Serviece的接口。为了支持Service的绑定,实现onBind方法。