2012-12-20 17 views
1

我正在嘗試添加20個文字瀏覽器並指定一個onclick動態添加textviews。問題是每當我嘗試點擊任何動態textiview。它總是激發最後添加的文本視圖的點擊事件。在Android中動態添加TextViews的單擊事件

這裏是我的代碼:

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

}; 

}

回答

1

試試這個:

OnClickListener btnClickListener = new OnClickListener() { 

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

}; 

更新:

爲什麼你點擊最後TextView的原因是因爲它是如此之大..你是增加每個循環的填充,當你點擊某處時,它總是會碰到最後的View,因爲它覆蓋了其他的。嘗試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會適合您的:)

+0

不工作Martijin –

+0

我已經更新了我的答案:) – DroidBender

+0

感謝Marijin,工作。太感謝了。我使用自定義列表視圖適配器,在那裏我想添加動態文本視圖列出行項目。 –

3

1)你應該讓你TextViews可點擊第一:

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

}; 

編輯:你正在添加你的TextViews一個。這就是爲什麼點擊事件觸發最後一個添加。 嘗試使用LinearLayoutandroid: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); 
    } 
+0

沒有任何優勢Houcine,仍然一樣 –

+0

更改v.getContext與:YourActivity.this – Houcine

+0

仍然是同樣的問題 –

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); 
+0

沒有Evos,那也沒有效果 –

+0

你怎麼知道它不是?我100%確定這是你正在尋找的東西。 – Evos

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

}; 

這工作得很好適合你。