2011-04-05 13 views
0

我正在編寫一個android應用程序,該程序以包含TextViews的多個視圖以編程方式填充LinearLayout。另外,我將OnClickListeners添加到上面的每個視圖中,以便我可以在單擊時將TextView包含的字符串進行檢索。 ClickListeners正在工作,因爲我在通過調試器運行時遇到了該方法,但是我不確定如何訪問它所調用的特定視圖的數據。這裏有一個代碼段clarfy:從編程創建的OnClickListener獲取源信息

LinearLayout list = (LinearLayout)findViewById(R.id.whatever); 

for(int i = 0; i < sourceArrayList.size(); i++) 
{ 
    View customTextView = View.inflate(this, R.layout.custom_text_view.xml, null); 
    TextView tv1 = (TextView)customTextView.findViewById(R.id.tv1); 
    tv1.setText("This is the value I would like to retrieve"); 
    TextView tv2 = (TextView)customTextView.findViewById(R.id.tv2);  
    tv2.setText("I would also like to get this value"); 

    customTextView.setOnClickListener(new OnClickListener() 
    { 
     public void onClick(View arg0) 
     { 
      Toast.makeText(getBaseContext(), "You clicked: x", Toast.LENGTH_SHORT).show(); 
     } 

    }); 

    list.addView(customTextView); 
} 

那麼,如何搶的onClick()方法中的那些textViews的值的任何指導,將不勝感激。

+0

您想獲得什麼數據? – MByD 2011-04-05 00:29:03

回答

1

在匿名內部類中,您可以訪問外部範圍內可用的最終變量。因此,爲了能夠在您的OnClickListener中訪問tv1tv2,您只需要聲明它們是最終的。

final TextView tv1 = (TextView)customTextView.findViewById(R.id.tv1); 
tv1.setText("This is the value I would like to retrieve"); 
final TextView tv2 = (TextView)customTextView.findViewById(R.id.tv2);  
tv2.setText("I would also like to get this value"); 

customTextView.setOnClickListener(new OnClickListener() 
{ 
    public void onClick(View arg0) 
    { 
     Toast.makeText(getBaseContext(), "You clicked: " + tv1.getText(), Toast.LENGTH_SHORT).show(); 
    } 

}); 

不知道你想什麼來完成,但你可能要考慮使用ListView代替。

+0

沒有意識到這是一個這樣簡單的解決方案,非常感謝。我無法得到我想要的listview的佈局效果,上面的代碼片段只是一個簡單的信息Im試圖抓住的例子。再次感謝 :) – cmcowart 2011-04-05 00:58:59

0

如果我明白你說的話和你包含的代碼,這聽起來像父視圖內的任何點擊(不管在哪裏)需要訪問子視圖的狀態。是對的嗎?

如果是這樣,至少有兩種基本方式(多種變化)來做到這一點。

首先,如果有合理數量的視圖可以使用,您可以在外部類中設置一個變量來保存每個變量,並且可以將該變量聲明爲final。如Mayra所概述的那樣,您可以直接使用這些變量。

或者,onClick()方法的參數(在您的代碼中名爲arg0)始終包含生成該事件的視圖。用你的代碼,這是父(customTextView)。您可以使用該視圖獲取任何子視圖的引用,無論您是通過findViewById()執行此操作,如ViewHolder或其他任何方式。例如,您可以將其設置爲onClick():

public void onClick(View arg0) 
    { 
     TextView textView1 = (TextView) arg0.findViewById(R.id.tv1); 
     String text1 = textView1.getText().toString; 
     Toast.makeText(getBaseContext(), text1, Toast.LENGTH_SHORT).show(); 
    }