访问AlertDialog的自定义视图中的EditText

时间:2013-02-26 10:45:11

标签: xamarin.android android-alertdialog android-custom-view

如何获取EditText的文本,它是警报对话框布局的一部分?

这里的代码:

LayoutInflater li = LayoutInflater.From(this);
View view = li.Inflate(Resource.Layout.AlertDView1ET1TVhori, null);
AlertDialog.Builder adb = new AlertDialog.Builder(this);
adb.SetTitle(GetString(Resource.String.EMPSPSAlertTitleMany));
adb.SetView(view);
EditText adbText = FindViewById<EditText>(Resource.Id.txtADV11Left);

和布局:

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout android:layout_height="wrap_content"
              xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:id="@+id/widget28">
  <EditText android:layout_height="wrap_content"
            android:layout_width="0dp"
            android:text="test"
            android:id="@+id/txtADV11Left"
            android:layout_weight="5"
            android:gravity="center"/>
  <TextView android:layout_height="wrap_content"
            android:layout_width="0dp"
            android:id="@+id/lbADV11Right"
            android:text="Test"
            android:layout_weight="1"
            android:gravity="center"/>
</LinearLayout>

我的问题是,我甚至不知道如何在此布局中访问EditText或TextView。最后一行代码将找不到任何东西,稍后我会得到一个“System.NullReferenceException:对象引用未设置为对象的实例” 因为adbText为空。

请不要抱怨我的奇怪名称布局。

2 个答案:

答案 0 :(得分:1)

在创建/链接到活动之前,您无法访问它。

相反,你可以试试这个:

EditText adbText = view.FindViewById<EditText>(Resource.Id.txtADV11Left);

答案 1 :(得分:1)

我做了blog post about Dialogs on Mono for Android,你可能会感兴趣。正如Softlion回答的那样,一种方法是从你的虚增视图中找到它:

var customView = LayoutInflater.Inflate (Resource.Layout.AlertDView1ET1TVhori, null);

var builder = new AlertDialog.Builder(this);
builder.SetView(customView);
builder.SetPositiveButton(Resource.String.dialog_ok, OkClicked);
builder.SetNegativeButton(Resource.String.dialog_cancel, CancelClicked);

//You should be able to access your EditText either here with:
var editText = customView.FindViewById<EditText>(Resource.Id.txtADV11left);

你也可以访问EventHandlers中的EditText,如下所示:

private void OkClicked(object sender, DialogClickEventArgs args)
{
    var dialog = (AlertDialog) sender;
    var editText = (EditText)dialog.FindViewById(Resource.Id.txtADV11left);
}