2016-10-03 1 views
0

私の活動では、sqliteデータに基づいてコントロールを動的に作成しています。各アイテムには、その行IDを新しいアクティビティに送信する必要のあるクリックイベントのボタンがあります。Xamarinは動的に作成されたボタンからデータをアクティビティに渡します

私は次のページを見てきましたが、これは私のレイアウトに既に存在するボタンで動作するようになっています。しかし、ボタンが動的に作成されても機能しないようです。これが機能するためにボタンで何か追加する必要がありますか?ここで https://developer.xamarin.com/recipes/android/fundamentals/activity/pass_data_between_activity/

動的にボタンを作成するコードです:私が持っているUpdateTaskActivityのOnCreateの方法で

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); 
} 

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

しかし、私がダウンしてブレークポイントを置くとき、私の文字列があります常にnullです。私は正しいIDが引かれていることを確認するためにブレークポイントを設定しました。

なぜ組み込みボタンで動作しますが、私の動的なボタンでは機能しませんか?

ちょうど混乱を避けるために、スタートアップ画面にはテストボタンがあり、メインアクティビティにはそのボタンの次のコードがあります。ボタンがdymaically作成されていないので、このコードは、正常に動作します:

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

は 'Tasks''上Id'ですint型の値を取得するのいずれか'string'型? – pnavk

+0

現在intです。 – jpaugh78

+1

あなたの問題はうまいです。あなたの "実用的な"例は、あなたのユースケースと一致しません。 'activity2.PutExtra(" TaskId "、" 1 ");'を 'activity2.PutExtra(" TaskId "、1);'に変更してみてください - 同じ問題が表示されます – pnavk

答えて

1

主な問題は、あなたが余分にintを追加しているということです。

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

そして、あなたがしようとしていますstringとしてそれを得る:

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

2つの方法があります。値を文字列として追加することなく値を取得することができます。

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

それとも、あなたはデフォルト値に依存したくない場合は、あなたが最初に、余分に確認することができます:

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

C#ではこれもコンパイルされませんでした。私はそれがアンドロイドがその行に着くとただ静かに失敗するのは奇妙だと思う。助けてくれてありがとう! – jpaugh78

関連する問題