2

//最初に私はこのメソッドを持っています、以下は私の質問です

public void addrows(){

     TableRow fila;
     tabla = (TableLayout)findViewById(R.id.tabla);
     TextView txtNombre;


     for(int i = 0;i<id;i++){

         String x[] = helper.leer(); 

         layoutFila = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT,
                 TableRow.LayoutParams.WRAP_CONTENT);
         caja= new CheckBox(this);

         fila = new TableRow(this);
         fila.setLayoutParams(layoutFila);


         txtNombre = new TextView(this);

         txtNombre.setId(i);


         txtNombre.setTextSize(17);
         txtNombre.setText(x[i]);
         txtNombre.setGravity(Gravity.LEFT);

       //  txtNombre.setLayoutParams(layoutTexto);
         caja.setText("");
         caja.setId(i);
         fila.addView(txtNombre);
         fila.addView(caja);
         tabla.addView(fila);
     }
    }   

oncreate() メソッドを開始すると、チェックボックス オブジェクトが作成され、0 から for cycle stop のどこにでも数値 ID を割り当てることがわかっていますが、プログラムの後半で、クリックされたチェックボックスを取得する必要があるため、最初に ID が必要です。しかし、Eclipseでは数値IDを入力できません。助けてください! 私の英語でごめんなさい、私はアンドロイドと英語の初心者です

this.CheckBox = (CheckBox)this.findViewById(R.id.?);

4

3 に答える 3

1

ビュークラスのドキュメントで読むことができるように、IDは検索するツリー内で一意である必要があります。

TextView と Checkbox に同じ ID を設定します。

作成後にそれらすべてに後でアクセスすることがわかっている場合は、findViewById を使用して後でそれらを取得しようとするのではなく、それらへの参照を配列に保持します。

しかし、より良い解決策は、それらに onClick イベントリスナーを設定し、それらのチェック/チェック解除を追跡することです。

@HalR の回答で、チェックボックスに onCheckedChanged イベントリスナーを設定する方法を読むことができます。彼のソリューションに従うと、チェックされたチェックボックスの ArrayList が表示されます。

次のステップでは、正しい TextView の値をインクリメントする必要があるため、CheckBox と TextView を結合する必要があります。

これには、TextView id の値で CheckBox の Tag を設定するのが最善だと思います。

したがって、ユーザーが送信した後、チェックボックスのリストを反復処理し、getTag を使用して findViewById で TextView を取得し、その値を更新します。

Id (IDentifier の略) は、要素を一意に識別するための整数です。これを findViewById で使用して、ビュー要素を取得できます。この回答でIDの詳細を読むことができます

タグは、 getTag ドキュメントで読むことができるように、ビュー要素をいくつかの追加データに関連付けるために使用されます。パラメータとして Object 型を取るので、数値だけでなく何でもタグとして設定します。あなたの場合、IDの代わりにTextViewをChechBoxのタグとして設定でき、それも機能します。

于 2013-04-27T22:45:19.617 に答える
0

このようにしたい場合は、適切な操作を行う必要があります。つまり、次のようにします。

for(int i = 0; i < n; ++i){
    ...
    ...(CheckBox))this.findViewById(i);
    ...
}

それはあなたのために働くはずです

ただし、ビュー ツリー内に同じ ID を持つビューが多数ある場合、findViewById(i)は、指定された ID を持つビュー ツリーの最初のビューを返すなど、予期しない結果を返す可能性があるので注意してください (CheckBox タイプではない可能性があります)。 ClassCAstException につながる可能性があります)

コメントに返信して更新

ある種の論理的な接続 CheckBox-TextView を作成する場合は、いくつかのオプションがあります。

  1. 次のような関数を作成できます (CheckBox と TextView の数に制限があると仮定します)。

コード:

private static int CHECK_BOX_MAX_NUMBER = 10000;

public void int getTextVieIdByCheckBoxId(int checkBoxId){
    if(checkBoxId >= CHECK_BOX_MAX_NUMBER){
        // you can throw an exception here for example
    }
    return CHECK_BOX_MAX_NUMBER  + checkBoxId;
}

そして、その関数を使用して ID を TextViews に設定する必要があります。

checkBox.setId(i);
textView.setId(getTextVieIdByCheckBoxId(i));
....
// add Views to your layout
....
(CheckBox)this.findViewById(i);
TextView)this.findViewById(getTextVieIdByCheckBoxId(i));

また

2. もう少し正確な方法があると思います。CheckBox インスタンスのsetTag()を使用して、適切な TextView を内部に設定し、相互接続を作成します。この場合、作成されたすべてのチェックボックスをリストまたは配列に保存する必要があります。

List<CheckBox> checkBoxList = new ArrayList<CheckBox>();

for(int i = 0; i < n; ++i){
    ...
    CheckBox checkBox = new CheckBox();
    TextView textView = new TextView();
    checkBox.setTag(textView);
    checkBoxList.add(checkBox);

}

次に、次のように目的を達成できます。

int textBoxListSize = checkBoxList.size();
for(int i = 0; i < textBoxListSize; ++i){
    CheckBox checkBox = checkBoxList.get(i);
    if(chechkBox.isChecked()){
        TextView textView = (TextView)checkBox.getTag();
        //do whatever with textView
    }
}

ここでは、ID を生成する必要はなく、発生する可能性のある衝突について心配する必要はありません。

于 2013-04-27T23:21:23.957 に答える
0

あなたは自分のIDを行のインデックスに手動で設定していますが、これは私がやろうとは思わないことです。私は通常setTag()、自分のオブジェクトを識別するために使用します。

チェックボックスがいつチェックされたかを検出するためにリスナーを使用する方が簡単で、チェックが発生したときに変更を追跡できると思います。

次のようなものを使用します。

アクティビティで、ArrayList を作成します

ArrayList<CheckBox> checkedBoxes = new ArrayList<CheckBox>();

次に、あなたの作成で:

caja= new CheckBox(this);

caja.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

   @Override
   public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
        int index = buttonView.getId();//pulling back the number you set originally, if that is what you like.  I would get the tag I had set, and maybe do something here.
        //do something in here!
        if (buttonView.isChecked()) {
            //including this checkbox in the list of checked boxes
            checkedBoxes.addObject(buttonView);
        } else {
            //take it out of the list of checked boxes
            checkedBoxes.removeObject(buttonView);
        }
   }
};

Id と Tag に関する情報

Id は、ビュー階層でビューを識別する数値です。あるビューを別のビューに揃えるなど、レイアウトで何かを使用している場合、それらは特定の ID を持つビューを探して期待します。したがって、レイアウトではandroid:id="@+id/bigBox"、bigBox に関連付けるいくつかの番号が作成されます。そのビューを見つけたら、findViewById()それが探している番号です。これらの数値を手動で設定すると、トラブルを求めているように見えます。ビューの id を 2 に設定すると、 で見つけることができるはずですmyView = findViewById(2)

Tag は、ビューと共に渡すことができる小さなオブジェクト ポインターです。多くの場合、行番号になります。

  Integer saveMe = new Integer(i);
  checkBox.setTag(saveMe);

または、その行を作成するために使用した元のデータ オブジェクトへのポインターである場合もあります。連絡先を使用して各行を作成した場合は、次を使用できます

myRow.setTag(contact)

後でその行をクリックすると、次のようになります

contact = (Contact)myRow.getTag()

元の連絡先が戻ってきます。行やチェックボックスなどの大きな配列を保持するよりもクリーンです。何かをしたときにそれを検出するリスナーを使用するだけです。これははるかに優れた方法です。

ああ、onClick(View view)チェックボックスによってトリガーされるビューがある場合、そのビューはチェックボックスです。

CheckBox theBoxIJustChecked = (CheckBox)view;

IDで検索する必要はありません。すぐそこです。

于 2013-04-27T22:46:18.713 に答える