当前位置: 首页 > 面试题库 >

如何在LinearLayout类中为Android View充气?

谭京
2023-03-14
问题内容

我有一小段xml,将在我的应用程序中的许多地方使用它。因此,我想将其存储在单独的文件中。因此,我创建了mywidget.xml,其中包含我的xml。然后,我尝试在mywidget.java中对此进行充气,然后将其包含在另一个xml文件中,如下所示:

<com.mycom.android.ui.widget.AmountWidget android:layout_width="fill_parent" android:layout_height="wrap_content"></com.mycom.android.ui.widget.AmountWidget>

在我的java文件中,我尝试像这样膨胀初始xml:

public class AmountWidget extends LinearLayout {
    public AmountWidget(Context context) {
        super(context);
        LinearLayout ll = (LinearLayout) findViewById(R.layout.amount_widget);
        addView(ll);
    }
}

但是,使用上面的代码,我得到一个错误,指出存在一个错误,导致类com.mycom.android.ui.widget.AmountWiget膨胀。

我的问题:是否有人知道如何为布局充气,以便可以将其用作另一个xml布局文件中的类?

小部件中的xml如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:layout_margin="10dp"
    android:padding="10dp"
    android:background="@layout/border"
    >
    <EditText
        android:id="@+id/payment_amount_major"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:textSize="35sp"
        android:textStyle="bold"
        android:inputType="number"
        android:digits="0,1,2,3,4,5,6,7,8,9"
        android:maxLength="9"  
        android:gravity="right"
        />
</LinearLayout>

问题答案:

View类有一个充气方法,其包装LayoutInflater.inflate。您应该可以使用:

LinearLayout ll = (LinearLayout) inflate(context, R.layout.amount_widget, this);

从xml扩展您的小部件。addView()不需要调用,因为inflate会为您添加新膨胀的视图!

编辑:仅需注意,因为此视图已经是LinearLayout,所以不需要夸大xml的根也成为LinearLayout。如果仅对EditText进行充气,然后仅将其添加到父级中,而不是在父级中嵌套第二个LinearLayout,则可以提高性能。您可以直接AmountWidget在xml中添加的任何地方设置LinearLayout属性(例如背景和填充)。在这种特定情况下,这无关紧要,但是如果您的情况有很多嵌套视图,最好知道如何继续。

Edit2:View该类具有三个构造函数:View(Context),View(Context,AttributeSet)和View(Context,AttributeSet,int)。当系统从xml扩展视图时,它将使用后两个视图之一。任何自定义View都需要实现所有这三个构造函数。重用代码时,一个简单的方法是这样的:

public AmountWidget(Context context) {
    super(context);
    LinearLayout ll = (LinearLayout) inflate(context, R.layout.amount_widget, this);
}

public AmountWidget(Context context, AttributeSet attrs) {
    this(context);
}

public AmountWidget(Context context, AttributeSet attrs, int defStyle) {
    this(context);
}

如果您不在乎属性或样式参数是什么,并且只希望AmountWidget在每次膨胀时都以相同的方式创建,这将起作用。



 类似资料:
  • 我有一个页眉和页脚(),中间有一个。

  • 问题内容: 我试图在代码中添加到xml定义的布局中。我有一个xml工作表,其中定义了很多。但是我必须在代码中添加一些视图,因此在中创建一个: 在这种布局中,我想添加我的: 但是我只收到以下错误消息: 我该怎么做? 问题答案: 尝试使用 还请确保你正在创建的布局参数是LinearLayout.LayoutParams …

  • 我正在使用Spring框架构建一个REST完整服务。 我需要添加自定义Cookie到响应,在控制器中处理请求后,根据响应类型 但是当它到达我的拦截器时 ModelAndView为空,我只能处理请求 所以我有两个问题: 有没有一种方法可以让Spring使用数据填充ModelAndView,而不显式使用HttpServletResponse、HttpEntity或ModelAndView,从而保持控制

  • 我正在尝试获取我的控件,以便显示一个控件,该控件的按钮和图像占用了剩余空间。我一直在考虑使用权重,我可以让它在宽度上工作,但一旦我在高度上使用权重,就不会显示任何内容,我的代码如下:

  • 我无法在线性布局中精确定位零部件。LinearLayout是水平的(ImageButton文本查看ImageButton)。下图显示了问题。相对于ImageButtons,数字(文本视图)没有垂直或水平居中。(红线表示中心)。正如您在代码中所看到的,我将TextView组件布局设置为center | center。数字始终在0到99之间。