如何将XML作为自定义视图膨胀而不需要父级

3

我有一个简单的xml文件,想将其作为Java视图对象填充。 我知道如何填充一个视图:

view = LayoutInflater.from(context).inflate(R.layout.alarm_handling, this);

但是我有一个作为父视图的子视图(this)的观点。然后,通过设置布局参数并拥有不需要的额外布局,问题开始变得混乱。在xml中,这些要容易得多。

对于Activity,可以直接调用setContentView(),但对于一个View则不可能。

最终,我想要一个Java类(扩展自ViewSomething),以便我可以在另一个xml文件中引用它。我已经查看了ViewStub,它几乎是答案,但它是final的 :(

public class AlarmView extends ViewStub{ //could work if ViewStub wasn't final

public AlarmView (Context context, AttributeSet attrs) {
    super(context);

    //using methods from ViewStub:
    setLayoutResource(R.layout.alarm_handling);
    inflate();
}
}

那么如何实现呢?要做什么才能够调用setContentView()或setLayoutResource()方法呢?
我查看了很多Stack Overflow的回答,但是都不能解决我的问题。

我有点困惑。我相信你可以用空父视图来填充一个视图(例如,inflate(R.layout.alarm_handling, null)或其他变体),但这听起来很像你想要使用来自XML的自定义视图,这也是完全可能的。你的问题是你想要一个自定义的XML解析器吗? - C B J
我不确定是否需要自定义XML解析器。我想创建一个自定义组件,它可以处理自己的布局(从XML中膨胀),而不需要额外的(父)布局,我认为这是不必要的。 - bluevoid
1个回答

6
据我理解,您想要应用的技巧与您尝试的有所不同。
不,ViewStub并不是解决方案,因为ViewStub处理方式完全不同。
举个例子,假设您的XML布局如下(不完整,仅用于说明思路):
<FrameLayout match_parent, match_parent>
     <ImageView src="Myimage", wrap_content, Gravity.LEFT/>
     <TextView text="hello world", wrap_content, Gravity.CENTER_HORIZONTAL/>
</FrameLayout>

如果您不想扩展FrameLayout并在其中填充此XML,因为那样会有两个FrameLayout(一个在另一个内部),这只是一种愚蠢的浪费内存和处理时间。我同意,确实如此。

但是关键是在您的XML上使用merge

<merge match_parent, match_parent>
     <ImageView src="Myimage", wrap_content, Gravity.LEFT/>
     <TextView text="hello world", wrap_content, Gravity.CENTER_HORIZONTAL/>
</merge>

在扩展FrameLayout的小部件上正常进行膨胀。

public class MyWidget extends FrameLayout
   // and then on your initialisation / construction
   LayoutInflater.from(context).inflate(R.layout.alarm_handling, this);

你在屏幕上的最终布局只会有一个帧布局。

愉快编码!


很酷,这听起来就是我正在寻找的!我会尝试一下看看它是否适用于我。 - bluevoid
它工作得很好,这将从我的项目中删除许多代码,在那里我一直在使用Java类设置LayoutParams来使事情正确。谢谢! - bluevoid
这个很好用。唯一的问题是,Android Studio中的UI预览不知道如何显示布局的内容,因为它不知道原始标记是FrameLayout、LinearLayout还是RelativeLayout。 - gardenofwine
@gardenofwine 我同意你的看法。这真的很烦人,我之前也看到过有一个“错误票”针对Android Studio来正确处理“合并”标签的预览。在那之前,我们只能忍受它。 - Budius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接