Android DataBinding setVariable() 后跟 getVariable() 调用 returns null
Android DataBinding setVariable() followed by getVariable() call returns null
我在以下布局中使用 DataBinding。我在绑定对象上调用 setViewModel() 方法。如果我立即调用 binding.getViewModel(),它 returns 为空。请参阅下面的代码:
布局:
<layout>
<data>
<variable
name="viewModel"
type="reyes.r.christopher.spenderbender.viewmodel.TransactionViewModel"/>
</data>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/viewExpenseListTable"
android:shrinkColumns="*"
android:stretchColumns="*"
>
</TableLayout>
</ScrollView>
</layout>
Activity:
public class ViewExpenseListActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityViewExpenseListBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_view_expense_list);
LocalDatabaseHandler dbh = new LocalDatabaseHandler(this);
TransactionViewModel viewModel = new TransactionViewModel(dbh);
binding.setViewModel(viewModel);
if ( BuildConfig.DEBUG ) {
if (viewModel == null) {
throw new AssertionError("Somehow viewModel is null...");
}
if(binding.getViewModel() == null) {
// This Assertion is always thrown
throw new AssertionError("viewModel is not null, but wasn't set in the binding");
}
}
// Throws NullPointerException
binding.getViewModel().loadAllExpenses();
}
...
}
您可能会注意到我没有在布局中的任何位置使用该变量。每当将新行添加到数据库时,我都试图以编程方式用数据库中的值替换 table 中的行。这就是为什么我需要从绑定中获取 viewModel。
PS:我发现了这个类似的问题:。此人在调用 set 方法而不是 get 方法时遇到空指针异常。我可以很好地调用 set 方法,但是 get returns 是一个空对象。
事实证明,如果布局中未引用变量,则不会实现生成的 setter 和 getter。
我决定 post 以防将来其他人有类似的问题,但我在调查生成的文件时发现了这一点。下面是生成的 ActivityViewExpenseListBinding 中的 getViewModel() 和 setViewModel() 方法 class:
public void setViewModel(reyes.r.christopher.spenderbender.viewmodel.TransactionViewModel viewModel) {
// not used, ignore
}
public reyes.r.christopher.spenderbender.viewmodel.TransactionViewModel getViewModel() {
return null;
}
我需要从布局中引用 viewModel 变量,或者使用不同的模式来观察变化。
我在以下布局中使用 DataBinding。我在绑定对象上调用 setViewModel() 方法。如果我立即调用 binding.getViewModel(),它 returns 为空。请参阅下面的代码:
布局:
<layout>
<data>
<variable
name="viewModel"
type="reyes.r.christopher.spenderbender.viewmodel.TransactionViewModel"/>
</data>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/viewExpenseListTable"
android:shrinkColumns="*"
android:stretchColumns="*"
>
</TableLayout>
</ScrollView>
</layout>
Activity:
public class ViewExpenseListActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityViewExpenseListBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_view_expense_list);
LocalDatabaseHandler dbh = new LocalDatabaseHandler(this);
TransactionViewModel viewModel = new TransactionViewModel(dbh);
binding.setViewModel(viewModel);
if ( BuildConfig.DEBUG ) {
if (viewModel == null) {
throw new AssertionError("Somehow viewModel is null...");
}
if(binding.getViewModel() == null) {
// This Assertion is always thrown
throw new AssertionError("viewModel is not null, but wasn't set in the binding");
}
}
// Throws NullPointerException
binding.getViewModel().loadAllExpenses();
}
...
}
您可能会注意到我没有在布局中的任何位置使用该变量。每当将新行添加到数据库时,我都试图以编程方式用数据库中的值替换 table 中的行。这就是为什么我需要从绑定中获取 viewModel。
PS:我发现了这个类似的问题:
事实证明,如果布局中未引用变量,则不会实现生成的 setter 和 getter。
我决定 post 以防将来其他人有类似的问题,但我在调查生成的文件时发现了这一点。下面是生成的 ActivityViewExpenseListBinding 中的 getViewModel() 和 setViewModel() 方法 class:
public void setViewModel(reyes.r.christopher.spenderbender.viewmodel.TransactionViewModel viewModel) {
// not used, ignore
}
public reyes.r.christopher.spenderbender.viewmodel.TransactionViewModel getViewModel() {
return null;
}
我需要从布局中引用 viewModel 变量,或者使用不同的模式来观察变化。