我尝试按照view models的Google教程进行操作。我创建了一个包含视图模型的自定义视图类,我想在Android Studio Designer中将此视图类应用到布局中。
在通过工厂方法获取视图模型时,它需要Fragment
或FragmentActivity
作为 ViewModelProviders.of(Fragment activity)
方法的参数。在教程示例中,this
是AppCompatActivity
,其扩展为FragmentActivity
。
public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
MyViewModel model = ViewModelProviders
.of(this).get(MyViewModel.class);
[...]
}
}
现在我在自定义视图类中。我按getContext()
访问上下文并转换为FragmentActivity
。这在设计师中无法正常工作。它抱怨道:
java.lang.ClassCastException: android.view.ContextThemeWrapper cannot be cast to android.support.v4.app.FragmentActivity
我该如何处理?我是否被迫首先创建一个片段,只是为了能够使用视图模型,即使我根本不需要片段?
添加班级的相关部分:
public class MathKeyboardView extends ConstraintLayout {
// ------ snip ----------
private void init(AttributeSet attrs, int defStyle) {
// ------ snip ----------
if(!isInEditMode()) {
getDisplayViewModel().observe(
(FragmentActivity) getContext(), new Observer<String>() {
@Override
public void onChanged(@Nullable String number) {
display.setText(number);
}
});
reset();
}
}
private DisplayViewModel getDisplayViewModel() {
return ViewModelProviders.of((FragmentActivity) getContext()).get(DisplayViewModel.class);
}
这里我已经添加了if(!isInEditMode())
条件,这可能是解决方案,可能是错误的方法。
答案 0 :(得分:0)
Context
的{{1}}已被View
“包裹”以更改主题。您可以使用ContextThemeWrapper
查找“真实”ContextWrapper.getBaseContext()
对象:
Context