繁体   English   中英

如何在没有父级的情况下将xml膨胀为自定义视图

[英]How to inflate xml as Custom View without a parent

我有一个简单的xml,我想将其作为Java视图对象进行充气。 我知道如何扩大视图:

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

但是然后我有一个观点,认为这是父母的孩子(这个)。 然后,麻烦的问题开始于设置layoutparameters并具有我不需要的额外布局。 这些在xml中更容易实现。

使用Activity可以只调用:setContentView(),但不能使用View。

最后,我希望有一个Java类(扩展ViewSomething),可以在其他xml中引用它。 我看过ViewStub,这几乎是答案,除了它是最终的:(

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()?

我看了很多SO答案,但没有一个适合我的问题。

据我了解,您想应用的技巧与您尝试的技巧有所不同。

没有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);

并且屏幕上的最终布局将只有1个FrameLayout。

祝您编码愉快!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM