Xamarin通过动态创建的按钮将数据传递给活动

时间:2016-10-03 16:04:06

标签: c# xamarin xamarin.android

在我的活动中,我基于sqlite数据动态创建控件。每个项目都有一个按钮,其中包含需要将行ID发送到新活动的点击事件。

我查看了以下页面,并且可以使用我的布局中已存在的按钮。但是,当动态创建按钮时,它似乎不起作用。我需要做一些额外的工作吗? https://developer.xamarin.com/recipes/android/fundamentals/activity/pass_data_between_activity/

以下是动态创建按钮的代码:

foreach (Tasks item in table)
{
    TableRow row = new TableRow(this);
    TextView txtTask = new TextView(this);
    txtTask.Text = item.Name;
    row.AddView(txtTask);
    tableLayout.AddView(row);
    row = new TableRow(this);
    Button btnEdit = new Button(this);
    btnEdit.Text = "Edit Record";
    btnEdit.SetWidth(300);
    btnEdit.Click += delegate 
    {
        Intent viewTask = new Intent(this, typeof(UpdateTaskActivity));
        viewTask.PutExtra("TaskId", item.Id);
        StartActivity(viewTask);
    };
    row.AddView(btnEdit);

    tableLayout.AddView(row);
}

在UpdateTaskActivity的OnCreate方法中,我有:

string test = Intent.GetStringExtra("TaskId") ?? "error";
if (test != "error")
{
    //Do Stuff
}

但是当我放下一个断点时,我的字符串总是为空。我确实设置了一个断点来确保正确的ID被拉出。

为什么这可以使用内置按钮但不适用于我的动态按钮?

为了避免混淆,在我的启动画面中我有一个测试按钮,我的主要活动有以下代码用于该按钮。此代码工作正常,因为按钮不是动态创建的:

//Test button
Button btnTest = FindViewById<Button>(Resource.Id.btnTest);
btnTest.Click += delegate 
{
    var activity2 = new Intent(this, typeof(UpdateTaskActivity));
    activity2.PutExtra("TaskId", "1");
    StartActivity(activity2);
};

1 个答案:

答案 0 :(得分:1)

主要问题是您要在附加内容中添加 int

// item.Id is an int type
viewTask.PutExtra("TaskId", item.Id);

然后你试图将其作为 string

var test = Intent.GetStringExtra("TaskId");

有两种方法可以获取值,而无需将值添加为字符串。获得一个int值:

var test = Intent.GetIntExtra("TaskId", 0);
if (test != 0)
{
    // Do Stuff
}

或者,如果您不想依赖默认值,您可以先检查额外的内容:

if (Intent.HasExtra("TaskId"))
{
    var test = Intent.GetIntExtra("TaskId", 0);
    // Do Stuff
}