Android: 我可以将参数传递给膨胀视图吗?

Android: can I pass parameters to inflated views?

我正在为 Android 编写一个日历应用程序。此应用程序具有日视图、周视图和月视图,与标准日历应用程序非常相似。

在调用 onMeasure、onLayout、onDraw 之前,所有三个视图都需要知道它们显示的日期。

现在,我一直在考虑是应该创建完全自定义的视图 类,还是尽可能使用 XML 布局,并且仅在需要时才在布局中嵌入自定义视图, 但我用第二个选项碰壁了:同样,因为所有布局都将至少有一个子视图取决于所选日期,我知道将参数传递给视图的唯一方法是调用自定义构造函数(而不是在我根本无法传递参数的地方膨胀)——基本上,我将不得不使用完全自定义的视图……

我说得对吗?有没有办法将参数传递给膨胀的视图?

你可以写一个containerView来添加dayView,weekView和monthView,当dayView被点击或滚动时回调通知weekview和monthview膨胀差异视图或刷新适配器

方法 inflate() 用于将 layout.xml 转换为 View 实例。您可以做到这一点,但需要做更多的工作,并且传递动态数据似乎是不可能的。

但我认为你的砖墙不是真正的砖墙:

since all layouts will have at least one sub-view that depends on the selected dates.

我想你想在视图显示之前设置数据,所以你可以:

    View view = LayoutInflater.from({context}).inflate(R.layout.{XML_name}, null);
    TextView tv_year = (TextView)view.findViewById(R.id.tv_year);
    tv_year.setText("2015");
    ...
    {root_view}.addView(view);

{context} 可以是您的 Activity,{XML_name} 是您想要使用的,{root_view} 是您想要添加日期视图的地方。

这是一个很好的做法:将视图与功能代码分开可以使其更具可读性。您 可以明确地将 custom_layout.xml 中的自定义 classes 扩展到您的代码中。为此,将您的自定义 class(从某些视图扩展)设置为标签的名称:

<com.my_site.MyView>
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/my_view"
</com.my_site.MyView>

如果您的自定义视图 class 构造函数接受额外参数,您还需要 custom LayoutInflator factory,您可以在其中设置这些参数。为了使这种方法在不同情况下通用,您始终可以 传递单个 MyParameters class 实例,该实例将接受不同类型的参数值并将它们返回到目标构造函数中。

在我的例子中,我发现将所有自定义从构造函数传递到单独的方法以便在实例化 MyView 后调用它们更容易。