3

我有一个简单的 xml,我想将其扩展为 java 视图对象。我知道如何膨胀视图:

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

但后来我有一个观点,它是父母的孩子(这个)。然后混乱的问题开始于设置布局参数并有一个我不需要的额外布局。这些在 xml 中更容易实现。

使用 Activity 可以调用: setContentView() 但使用 View 是不可能的。

最后,我想要一个可以在其他 xml 中引用的 Java 类(扩展 ViewSomething)。我看过 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 答案,但没有一个适合我的问题。

4

1 回答 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(一个在另一个内部),这只是对内存和处理时间的愚蠢浪费。我同意,是的。

但是诀窍是merge在您的 XML 上使用。

<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。

快乐编码!

于 2013-07-09T08:34:40.377 回答