【问题标题】:Android: can I pass parameters to inflated views?Android:我可以将参数传递给膨胀的视图吗?
【发布时间】:2015-12-23 09:07:46
【问题描述】:

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

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

现在,我一直在考虑是否应该创建完全自定义的视图类,或者尽可能使用 XML 布局,并且仅在需要时将自定义视图嵌入到布局中,但我遇到了第二个问题选项:再次,因为所有布局都将具有至少一个取决于所选日期的子视图,并且我知道将参数传递给视图的唯一方法是调用自定义构造函数(而不是在我不能膨胀的地方完全通过参数) - 基本上,我必须使用完全自定义的视图......

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

【问题讨论】:

  • 您可以通过使用 XML 中的属性或调用视图实例上的方法来更改视图。根据您的场景,您可能希望使用新的 XML 属性创建自定义视图,您可以在构造函数中读取该属性。
  • 您在寻找custom attributes吗?
  • @Schrieveslaach - 不,因为据我了解,自定义属性与我正在寻找的相反:它们允许您在 XML 中定义属性,而不是从代码中获取它们。 Xavier.S 的回答很棒,见下文。

标签: android android-layout layout-inflater


【解决方案1】:

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

【讨论】:

  • 这样一个简单而准确的答案。谢谢你。没有意识到在膨胀后视图没有立即绘制,我觉得有点傻。
  • 不同意。您可以扩展自定义布局类 - 没问题:在 my_layout_component.xml 标记名称中声明它,例如 .
  • @Zon 我已经修改了我的答案以更准确地表达。谢谢。
【解决方案2】:

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

【讨论】:

  • 对不起,我不明白。为什么我要从日视图中调用weekview?它们是完全分开的。
  • 另外,不涉及适配器。
【解决方案3】:

这是一个很好的做法:将视图与功能代码分开可以使其更具可读性。您可以明确地将自定义类从您的 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 实例化后调用它们更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多