如何在Android Studio Designer中获取片段活动?

时间:2018-02-24 20:17:31

标签: android android-layout android-studio android-fragments

我尝试按照view models的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())条件,这可能是解决方案,可能是错误的方法。

1 个答案:

答案 0 :(得分:0)

Context的{​​{1}}已被View“包裹”以更改主题。您可以使用ContextThemeWrapper查找“真实”ContextWrapper.getBaseContext()对象:

Context