2016-05-03 1 views
0

ボタン実行時間(in app)を生成しました。ボタンランタイムのイベントを処理することはできません。私のシナリオ私は2つのテキストボックス1の "名前"と別の "電話番号" 1ボタン「追加」をクリックします。 Addボタンをクリックすると、「Call」と「Remove」の2つのボタンで1つのテキストボックスが動的に生成されました。実行時に動的ボタンのボタンクリックイベントを発生させることはできません

enter image description here しかし、第1または第2の通話ボタンをクリックすると、常に最後に追加された番号が呼び出されます。

コードは以下の通りです:

public class MainActivity : Activity 
    { 
     int count = 1; 
     EditText textIn, txtPhoneNo; 
     Button buttonAdd; 
     LinearLayout container; 
     EditText textOut; 
     System.Collections.ArrayList arrList = new System.Collections.ArrayList(); 
     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 

      SetContentView(Resource.Layout.Main); 

      textIn = (EditText)FindViewById(Resource.Id.textin); 
      txtPhoneNo = (EditText)FindViewById(Resource.Id.txtPhoneNo); 
      buttonAdd = (Button)FindViewById(Resource.Id.add); 
      container = (LinearLayout)FindViewById(Resource.Id.container); 
     } 

     private void buttonAdd_Click(object sender, EventArgs e) 
     { 
      LayoutInflater layoutInflater = Application.Context.GetSystemService(Context.LayoutInflaterService) as LayoutInflater; 
      View addView = layoutInflater.Inflate(Resource.Layout.row, null); 
      textOut = (EditText)addView.FindViewById(Resource.Id.textout); 
      arrList.Add(txtPhoneNo.Text); 
      if (textIn.Text != "" && txtPhoneNo.Text != "") 
      { 
       textOut.SetText(textIn.Text + " : " + txtPhoneNo.Text, TextView.BufferType.Normal); 
       container.AddView(addView); 
       Button btnCall = (Button)addView.FindViewById(Resource.Id.btnCall); 
       btnCall.Click += BtnCall_Click; 
       Button buttonRemove = (Button)addView.FindViewById(Resource.Id.remove); 
       buttonRemove.Click += ButtonRemove_Click; 
      } 
      else 
      { 
       Toast.MakeText(this, "Field can not be blank.", ToastLength.Short).Show(); 
      } 
     } 

     private void BtnCall_Click(object sender, EventArgs e) 
     { 
      var callDialog = new AlertDialog.Builder(this); 
      string strNo = After(textOut.Text,":"); 
      callDialog.SetMessage("Call " + strNo + "?"); 
      callDialog.SetNeutralButton("Call", delegate 
      { 
       var callIntent = new Intent(Intent.ActionCall); 
       callIntent.SetData(Android.Net.Uri.Parse("tel:" + strNo)); 
       StartActivity(callIntent); 
      }); 
      callDialog.SetNegativeButton("Cancel", delegate { }); 

      // Show the alert dialog to the user and wait for response. 
      callDialog.Show(); 
     } 
} 
} 

Main.axml 


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:orientation="vertical" 
    tools:context=".MainActivity"> 
    <EditText 
     android:id="@+id/textin" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:hint="name" /> 
    <EditText 
     android:id="@+id/txtPhoneNo" 
     android:layout_width="345.0dp" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:hint="Phone No." /> 
    <Button 
     android:id="@+id/add" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:text="Add" /> 
    <LinearLayout 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" /> 
</LinearLayout> 
row.xml 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 
    <Button 
     android:id="@+id/remove" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:text="Remove"/> 
    <Button 
     android:id="@+id/btnCall" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toLeftOf="@id/remove" 
     android:text="Call"/> 
    <EditText 
     android:id="@+id/textout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_toLeftOf="@id/remove"/> 
</RelativeLayout> 

私の問題は、どのように、私は特定のnoに電話をかけることができるということです。この場合、最後に追加された番号だけを呼び出すことができます。

答えて

1

buttonAdd_Clickが呼び出されるたびに、textOutを上書きしています。したがって、新しいレイアウトが追加されると、textOutは常に最後に追加されますEditText。これは基本的には論理エラーです。ロジックごとに、1つのインスタンスではなく、ListEditTextである必要があります。

List<EditText> textOuts; // instead of EditText textOut; 
int layoutCount=0; 
protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     SetContentView(Resource.Layout.Main); 

     textIn = (EditText)FindViewById(Resource.Id.textin); 
     txtPhoneNo = (EditText)FindViewById(Resource.Id.txtPhoneNo); 
     buttonAdd = (Button)FindViewById(Resource.Id.add); 
     container = (LinearLayout)FindViewById(Resource.Id.container); 
     textOuts= new List<EditText>(); 
    } 
private void buttonAdd_Click(object sender, EventArgs e) 
    { 
     int i=layoutCount++; 
     LayoutInflater layoutInflater = Application.Context.GetSystemService(Context.LayoutInflaterService) as LayoutInflater; 
     View addView = layoutInflater.Inflate(Resource.Layout.row, null); 
     textOuts.Add((EditText)addView.FindViewById(Resource.Id.textout)); 
     arrList.Add(txtPhoneNo.Text); 
     if (textIn.Text != "" && txtPhoneNo.Text != "") 
     { 
      textOut.SetText(textIn.Text + " : " + txtPhoneNo.Text, TextView.BufferType.Normal); 
      container.AddView(addView); 
      Button btnCall = (Button)addView.FindViewById(Resource.Id.btnCall); 
      btnCall.Click +=delegate(object sender, EventArgs e) { 
      var callDialog = new AlertDialog.Builder(this); 
     string strNo = After(textOuts[i].Text,":"); 
     callDialog.SetMessage("Call " + strNo + "?"); 
     callDialog.SetNeutralButton("Call", delegate 
     { 
      var callIntent = new Intent(Intent.ActionCall); 
      callIntent.SetData(Android.Net.Uri.Parse("tel:" + strNo)); 
      StartActivity(callIntent); 
     }); 
     callDialog.SetNegativeButton("Cancel", delegate { }); 

     // Show the alert dialog to the user and wait for response. 
     callDialog.Show(); 
     }; 
      Button buttonRemove = (Button)addView.FindViewById(Resource.Id.remove); 
      buttonRemove.Click += ButtonRemove_Click; 
     } 
     else 
     { 
      Toast.MakeText(this, "Field can not be blank.", ToastLength.Short).Show(); 
     } 
    } 

上記のようなコードを変更すると修正される可能性があります。私は自分でコードをテストしていません。

+0

この行で参照例外が発生しています。textOuts [i] =(EditText)addView.FindViewById(Resource.Id.textout); – Pritish

+1

OnCreateにこの行を追加しましたか? textOuts = new List ();それ以降もnull参照例外がスローされた場合は、完全な例外スタックトレース – Sreeraj

+0

を返信いただきありがとうございます。申し訳ありませんが、追加することを忘れています。あなたの助けを本当にありがとう:) – Pritish

関連する問題