1

20 個のテキストビューを追加し、onclick を動的に追加されたテキストビューに割り当てようとしています。問題は、動的テキストビューのいずれかをクリックしようとするたびです。最後に追加されたテキストビューのクリックイベントを常に発生させます。

これが私のコードです:

EditText s;
EditText t;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    RelativeLayout containerLayout = (RelativeLayout) findViewById(R.id.container);

    for (int i = 0; i < 20; i++) {
        TextView dynaText = new TextView(this);

        dynaText.setText("Some text " + i);
        dynaText.setTextSize(30);
        dynaText.setTag("" + i);

        dynaText.setOnClickListener(btnClickListener);
        // Set the location of your textView.

        dynaText.setPadding(0, (i * 30), 0, 0);

        containerLayout.addView(dynaText);
    }

}

OnClickListener btnClickListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        RelativeLayout ll = (RelativeLayout) v.getParent();
        TextView tv = (TextView) ll.getChildAt(2);
        // Integer pos = (Integer) tv.getTag();
        Toast.makeText(v.getContext(), "Toast " + v.getTag(),
                Toast.LENGTH_SHORT).show();
    }

};

}

4

4 に答える 4

3

TextViews 1)最初にクリック可能にする必要があります:

for (int i = 0; i < 20; i++) {
        TextView dynaText = new TextView(this);

        dynaText.setText("Some text " + i);
        dynaText.setTextSize(30);
        dynaText.setTag("" + i);
        dynaText.setClickable(true);//make your TextView Clickable
        dynaText.setOnClickListener(btnClickListener);
        // Set the location of your textView.

        dynaText.setPadding(0, (i * 30), 0, 0);

        containerLayout.addView(dynaText);
    }

2)あなたのonClickListener

OnClickListener btnClickListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
          Log.d("btnClickListener", ""-----TextView Clicked : "+v.getTag());
          Toast.makeText(YourActivity.this, "TextView Clicked : "+v.getTag(),
                Toast.LENGTH_SHORT).show();
    }

};

編集:あなたはあなたのTextViews1つを1つ追加しています。そのため、最後に追加されたイベントでクリック イベントが発生します。LinearLayoutwithを使用するandroid:orientation="vertical"か、前のものの下に新しい TextView をそれぞれ追加してみてください。

for (int i = 0; i < 20; i++) {
        TextView dynaText = new TextView(this);

        dynaText.setText("Some text " + i);
        dynaText.setId(i+1);
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        if(i!=0)
         params.addRule(RelativeLayout.BELOW, i);
         dynaText.setLayoutParams(params);
        dynaText.setTextSize(30);
        dynaText.setTag("" + i);

        dynaText.setOnClickListener(btnClickListener);

        containerLayout.addView(dynaText);
    }
于 2012-12-20T10:26:07.627 に答える
2

これを試して:

OnClickListener btnClickListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
          Toast.makeText(v.getContext(), "Toast " + v.getTag(),
                Toast.LENGTH_SHORT).show();
    }

};

アップデート:

最後をクリックしている理由TextViewは、それが非常に大きいためです。ループごとにパディングを増やしており、どこかをクリックするとView、他のものをオーバーレイしているため、常に最後にヒットします。a を試して、LinearLayout次のようにパディングを削除します。

public class MainActivity extends Activity implements OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        LinearLayout containerLayout = (LinearLayout) findViewById(R.id.container);

        for (int i = 0; i < 20; i++) {
            TextView dynaText = new TextView(this);

            dynaText.setText("Some text " + i);
            dynaText.setTextSize(30);
            dynaText.setTag("" + i);
            dynaText.setOnClickListener(this);

            containerLayout.addView(dynaText);
        }
    }

    public void onClick(View v) {
        // do stuff
    }

}

しかし、あなたの問題を解決する..ListViewあなたの目的に合っていると思います:)

于 2012-12-20T10:21:19.260 に答える
1

クリックされたデータを取得するには、次のようにします

変数を宣言する

int sCount = 0;
for (int i = 0; i < 20; i++) {
        TextView dynaText = new TextView(this);
        dynaText.setId(1000+sCount);
        dynaText.setText("Some text " + i);
        dynaText.setTextSize(30);
        dynaText.setTag("" + i);

        dynaText.setOnClickListener(btnClickListener);
        // Set the location of your textView.

        dynaText.setPadding(0, (i * 30), 0, 0);

        containerLayout.addView(dynaText);
    }
OnClickListener btnClickListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        RelativeLayout ll = (RelativeLayout) v.getParent();
        TextView tv = (TextView) ll.getChildAt(2);
        tv.addFocusables(null, v.getId(), 0);
        Toast.makeText(v.getContext(), "Toast " + tv.getText(),
                Toast.LENGTH_SHORT).show();
    }

};

これはうまくいきます。

于 2012-12-20T11:08:11.367 に答える
0

OnClickListenerビューごとに匿名インスタンスを使用して、リスナーの異なるインスタンスを作成することができます。このようなもの:

dynaText.setPadding(0, (i * 30), 0, 0);
dynaText.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
    ((TextView) v).getText();

}
});
containerLayout.addView(dynaText);
于 2012-12-20T10:41:53.140 に答える