gpt4 book ai didi

android - 扩展 LinearLayout 空引用

转载 作者:行者123 更新时间:2023-11-29 16:13:28 25 4
gpt4 key购买 nike

我希望能够根据在 xml 中定义的布局实例化一个新的自定义 LinearLayout 类。无论我做什么,在运行时,LinearLayout 和我所有的 TextView 都会抛出空引用异常。

transferListRow.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:padding="5dp">
<TextView
android:id="@+id/transferSerial"
android:layout_width="0dp"
android:layout_weight=".30"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:padding="5dp"
android:gravity="center" />
<TextView
android:id="@+id/transferModel"
android:layout_width="0dp"
android:layout_weight=".30"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:padding="5dp"
android:gravity="center" />
<TextView
android:id="@+id/transferSite"
android:layout_width="0dp"
android:layout_weight=".30"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:padding="5dp"
android:gravity="center" />
<Button
android:id="@+id/transferDelete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:padding="5dp"
android:gravity="center"
android:src="@drawable/delete" />

TransferListRow.cs 尝试 1:

 sealed class TransferListRow : LinearLayout
{
private readonly Context _context;

public TransferListRow(Context context, string serial, string model, string site)
:base(context)
{
_context = context;

LayoutInflator inflator = (LayoutInflator) _context.GetSystemService(Context.LayoutInflaterService);
inflator.Inflate(Resource.Layout.transferListRow, null);

TextView s = (TextView) FindViewById(Resource.Id.transferSerial);
s.Text = serial;

TextView m = (TextView) FindViewById(Resource.Id.transferModel);
m.Text = model;

TextView st = (TextView) FindViewById(Resource.Id.transferSite);
st.Text = site;
}
}

TransferListRow.cs 尝试 2:

sealed class TransferListRow : LinearLayout
{
private readonly Context _context;

public TransferListRow(Context context, string serial, string model, string site)
:base(context)
{
_context = context;

LinearLayout layout = (LinearLayout) FindViewById(Resource.Layout.transferListRow);

TextView s = (TextView) layout.FindViewById(Resource.Id.transferSerial);
s.Text = serial;

TextView m = (TextView) layout.FindViewById(Resource.Id.transferModel);
m.Text = model;

TextView st = (TextView) layout.FindViewById(Resource.Id.transferSite);
st.Text = site;

AddView(s);
AddView(m);
AddView(st);
}
}

最终目标是我的主要 Activity 能够在按钮点击事件中做这样的事情:

 mainLayout.AddView(new TransferListRow(this, "serial", "model", "site"));

最佳答案

1) 因为您正在扩展 LinearLayout,所以您在 XML 中定义的布局不需要具有 LinearLayout 包装器。而是只使用 <merge> ... </merge> .

2) 在你的构造函数中你必须调用 inflator.Inflate(Resource.Layout.transferListRow, this); .请注意this参数。这会将您的 XML 中定义的所有元素作为子元素扩展到 LinearLayout 中。

3) 框架会在onFinishInflate()中通知您充气完成后,可以通过 findViewById() 找到 View 。 .所以,在 onFinishInflate()您可以将您的 TextView 分配给您的成员变量。

就是这样:)

关于android - 扩展 LinearLayout 空引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11296647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com