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

时间:2015-12-23 09:07:46

标签: android android-layout layout-inflater

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

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

现在,我一直在考虑是否应该创建完全自定义的视图类,或者尽可能使用XML布局,并且只在我需要的时候在布局中嵌入自定义视图,但是我打了一个砖墙第二个选项:再次,因为所有布局都至少有一个取决于所选日期的子视图,并且我知道将参数传递给视图的唯一方法是调用自定义构造函数(而不是在我可以的地方充气) #39; t传递params - 基本上,我必须使用完全自定义的视图......

我对此是否正确?有没有办法将参数传递给膨胀的视图?

3 个答案:

答案 0 :(得分:3)

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

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

  

因为所有布局都至少有一个取决于所选日期的子视图。

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

    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}可以是您的活动,{XML_name}是您想要使用的,而{root_view}是您想要添加日期视图的地方。

答案 1 :(得分:0)

你可以创建一个containerView来添加dayView,weekView和monthView,单击dayView时回调或滚动以通知weekview和monthview inflate diff视图或刷新适配器

答案 2 :(得分:0)

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

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

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

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