2011-07-17 77 views
0

如何從分配給例如ImageView的onClick方法訪問例如TextView? TextView和ImageView組成了ListView項目。從另一個onClick方法控件訪問ListView控件

在我item.xml我:

<?xml version="1.0" encoding="UTF-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<ImageView 
    android:id="@+id/img" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:onClick="onImgClick" 
    />  
<TextView android:id="@+id/text" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    /> 
</LinearLayout> 

在我ListActivity我有onImgClick方法:

public void onImgClick(View v) { 
    TextView tv = (TextView) v.findViewById(R.id.text); 
tv.setText("Hello world!"); 
} 

但視圖V - 這是ImageView的,所以在這個方法我有致命例外:

java.lang.NullPointerException 

就行:

tv.setText("Hello world!"); 

我知道這是不正確的方式來訪問TextView。而且我知道我可以根據整個ListView使用onListItemClick(ListView l,View v,int position,long id)。但我想從ImageView onClick方法實現這一點。

+0

如果的ImageView和TextView中形成ListView項,那麼他們在列表視圖的項目子視圖,所以你正在獲得與父母的孩子...你可以實現(我猜是這樣),但onclick方法將只分配在列表視圖的頂部而不是所有項目... –

+0

是的,我可以做那樣的事情。或者根據整個ListView使用onListItemClick(ListView l,View v,int position,long id)方法。但我想從ImageView onClick方法中找到解決方案。 – woyaru

回答

5

我解決了我的問題。我只需要設置ID對我的LinearLayout:

android:id="@+id/main_layout" 

而接下來做這樣的事情:

public void onImgClick(View v) { 
    LinearLayout linearLayout = (LinearLayout) v.getParent();  
    TextView textView = (TextView) linearLayout.findViewById(R.id.text);   
    textView.setText("Hello world!"); 
} 
0

好了,訪問的TextView你的最簡單的方法是通過處理程序和使用的sendMessage:

http://developer.android.com/reference/android/os/Handler.html

或者,這取決於你是如何實現它,你可能要考慮的getParent() ,如在v.getParent().findViewById(r.id.text);

我不確定這是否適用於您的情況。

+0

第二種方法:'v.getParent()。' - 這裏沒有findViewById()方法。順便說一下,當我做這樣的事情︰'Toast.makeText(getApplicationContext(),v.getParent()。toString(),0).show();'我可以看到作爲父視圖android.widget.LinearLayout。 – woyaru

+0

如果我想使用Handler和sendMessage,我必須在我的類中聲明我的TextView(如果我理解它的話)。但我有ListView的項目計數,並且當我單擊ImageView時,我無法訪問ImageView onClick方法中的TextView。 – woyaru

0

在onclick監聽器上設置listview的getView方法中的listview。

+0

你能給我更多的細節嗎?你的意思是像mbarnes向我推薦的東西? – woyaru

0

我建議您重寫ListAdapter,並在getView()中將偵聽器設置爲父視圖。使用setTag()使標識更容易。

LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

... 

getView (int position, View convertView, ViewGroup parent){ 
LinearLayout thisview = null; 
if(convertView == null){ 
    convertView = inflater.inflate(R.layout.item, parent); 
} 

TextView tv = convertView.findViewById(R.id.text); 

ImageView img = convertView.findViewById(R.id.img); 
img.setTag("uniqueid_"+position); 

//this will put a reference to the TextView in the ImageView 
img.setKey("TEXT_VIEW", tv); 

img.setOnClickListener(this); 
... 
return convertView; 
} 

然後你可以在onclick()與v.getKey TextView的(「TEXT_VIEW」)...但它似乎是內存泄漏很好的潛力。

+0

但我如何在我的onImgClick方法中使用getView(int position,View convertView,ViewGroup parent)方法?在onImgClick我只有一個參數 - 視圖。 – woyaru

相關問題