如何在Android Studio设计师中获得碎片活动



我尝试按照Google教程进行查看模型。我创建了一个拥有视图模型的自定义视图类,并且想在Android Studio Designer中应用此视图类。

在通过工厂方法获得视图模型时,它希望FragmentFragmentActivity作为方法 ViewModelProviders.of(Fragment activity) 的参数。在教程中,示例thisAppCompatActivity,它扩展了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() 

最新更新