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

Android:我可以将参数传递给膨胀视图吗?,android,android-layout,layout-inflater,Android,Android Layout,Layout Inflater,我正在为Android编写一个日历应用程序。此应用程序具有日视图、周视图和月视图,与标准日历应用程序非常相似 在调用onMeasure、onLayout和onDraw之前,这三个视图都需要知道它们显示的日期 现在,我一直在考虑是否应该创建完全自定义的视图类,或者尽可能多地使用XML布局,并仅在需要时在布局中嵌入自定义视图,但我遇到了第二个选项:同样,由于所有布局都至少有一个子视图,这取决于所选日期,我知道向视图传递参数的唯一方法是调用自定义构造函数(而不是在根本无法传递参数的地方进行膨胀)——基

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

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

现在,我一直在考虑是否应该创建完全自定义的视图类,或者尽可能多地使用XML布局,并仅在需要时在布局中嵌入自定义视图,但我遇到了第二个选项:同样,由于所有布局都至少有一个子视图,这取决于所选日期,我知道向视图传递参数的唯一方法是调用自定义构造函数(而不是在根本无法传递参数的地方进行膨胀)——基本上,我必须使用完全自定义的视图


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

您可以创建一个containerView来添加dayView、weekView和monthView,当dayView打开时会有一个回调,单击或滚动来通知weekView和monthView膨胀差异视图或刷新适配器

您可以创建一个containerView来添加dayView、weekView和monthView,单击或滚动dayView以通知weekview和monthview充气差异视图或刷新适配器时的回调

方法充气()用于将layout.xml转换为视图实例。您可以这样做,但还需要做更多的工作,而且传递动态数据似乎是不可能的

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

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

我认为您需要在视图显示之前设置数据,以便:

    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}是您想要添加日期视图的地方。

方法inflate()用于将layout.XML转换为视图实例。您可以这样做,但还需要做更多的工作,而且传递动态数据似乎是不可能的

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

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

我认为您需要在视图显示之前设置数据,以便:

    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}是您想要添加日期视图的地方。

这是一个很好的实践:将视图与函数代码分离可以使其更具可读性。您可以将自定义类从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>

xmlns:android=”http://schemas.android.com/apk/res/android"
android:id=“@+id/my_视图”
如果您的自定义视图类构造函数接受额外的参数,那么您还需要,您可以在其中设置这些参数。为了使这种方法在不同情况下通用,您可以始终传递一个MyParameters类实例,该实例将接受不同类型的参数值,并在目标构造函数中返回它们


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

这是一个很好的实践:将视图与函数代码分离使其更具可读性。您可以将自定义类从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>

xmlns:android=”http://schemas.android.com/apk/res/android"
android:id=“@+id/my_视图”
如果您的自定义视图类构造函数接受额外的参数,那么您还需要,您可以在其中设置这些参数。为了使这种方法在不同情况下通用,您可以始终传递一个MyParameters类实例,该实例将接受不同类型的参数值,并在目标构造函数中返回它们


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

对不起,我不明白。为什么我要从day view调用weekview?它们是完全分开的。而且,没有涉及适配器。对不起,我不明白。为什么我要从day view调用weekview?它们是完全独立的。此外,不涉及适配器。您可以通过使用XML中的属性或调用视图实例上的方法来更改视图。根据您的场景,您可能希望创建一个具有新XML属性的自定义视图,您可以在构造函数中读取该属性。您正在查找吗?@Schrieveslaach-否,因为据我所知,自定义属性与我所查找的相反:它们允许您在XML中定义属性,而不是从代码中获取它们。Xavier.S的回答很好,请参见下文。您可以通过使用XML中的属性或调用视图实例上的方法来更改视图。根据您的场景,您可能希望创建一个具有新XML属性的自定义视图,您可以在构造函数中读取该属性。您正在查找吗?@Schrieveslaach-否,因为据我所知,自定义属性与我所查找的相反:它们允许您在XML中定义属性,而不是从代码中获取它们。泽维尔的回答很好,见下文。如此简单而准确的回答。非常感谢。我觉得自己有点傻,因为我没有意识到,在通货膨胀之后,观点不会立即被画出来。您可以膨胀自定义布局类-没问题:在my_layout_component.xml标记名中声明它,如@Zon我修改了答案以更准确地表达。谢谢。这么简单准确的回答。非常感谢。我觉得自己有点傻,因为我没有意识到,在通货膨胀之后,观点不会立即被画出来。您可以膨胀自定义布局类-没问题:在my_layout_component.xml标记名中声明它,就像@Zon我已经修改了我的ans