我尝试按照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())
条件,这可能是解决方案,也许是错误的方法。
您的View
的CC_11已被"包装"到ContextThemeWrapper
中以更改主题。您可以使用ContextWrapper.getBaseContext()
查找"真实" Context
对象:
(FragmentActivity) ((ContextWrapper) getContext()).getBaseContext()