2011-07-17 7 views
0

예를 들어, ImageView에 지정된 onClick 메서드에서 TextView에 대한 액세스 권한을 얻으려면 어떻게해야합니까? TextView 및 ImageView는 ListView 항목을 구성합니다.다른 onClick 메서드 컨트롤에서 ListView 컨트롤에 액세스하기

<?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 방법이 있습니다 : 내 item.xml에서

내가 가진

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

그러나보기 절 -이 방법 나는 그래서이, 이미지 뷰입니다 치명적인 예외 : 라인에

java.lang.NullPointerException 

:

tv.setText("Hello world!"); 

나는 이것이 TextView에 액세스하는 올바른 방법이 아니라는 것을 알고 있습니다. 그리고 전체 ListView에 따라 onListItemClick (ListView l, View v, int position, long id)을 사용할 수 있다는 것을 알고 있습니다. 하지만 ImageView onClick 메서드에서이를 달성하고 싶습니다.

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

는 다른 방법으로, 당신이 그것을 구현 한 방법에 따라, 당신의 getParent 조사 할 수 있습니다() :

+0

됩니다 , 그래서 당신은 부모님과 자식에 대한 액세스 권한을 얻고 있습니다 ... 당신은 그것을 얻을 수 있습니다 (그렇습니다)하지만 onclick 메서드는 목록보기의 상단에만 모든 항목에 할당되지 않습니다 ... –

+0

예, 할 수 있습니다 그런 일을하십시오. 또는 전체 ListView에 따라 onListItemClick (ListView l, View v, int position, long id) 메서드를 사용하십시오. 하지만 ImageView onClick 메서드에서 솔루션을 찾고 싶습니다. – woyaru

답변

5

문제가 해결되었습니다. 내가있는 LinearLayout에 ID를 설정하기 만하면됩니다 :

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

음은 텍스트 뷰에 액세스 할 수있는 가장 쉬운 방법은 sendMessage 첨부 Handler를 통해 사용할 ,에서와 같이 v.getParent().findViewById(r.id.text);

나는 귀하의 경우에도 작동하는지 모르겠습니다.

+0

두번째 방법 :'v.getParent() .' - 여기 findViewById() 메소드가 없습니다. 그런 식으로 할 때 : Toast.makeText (getApplicationContext(), v.getParent(). toString(), 0) .show();'부모로 볼 수있다 android.widget.LinearLayout. – woyaru

+0

핸들러와 sendMessage를 사용하려면 클래스를 선언 한 상태에서 TextView를 선언해야합니다 (이해한다면).하지만 항목 수를 가진 ListView 있고 ImageView 클릭 할 때 ImageView onClick 메서드에서 TextView 액세스 할 수 없습니다. – woyaru

0

onclick 리스너에서 listview의 getView 메소드에있는 listview를 설정하십시오.

+0

자세한 내용을 알려 주실 수 있나요? 그 멍청이가 나 한테 추천 한 거니? – 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; 
} 

그런 다음 온 클릭()에 v.getKey와 텍스트 뷰 ("TEXT_VIEW")를 얻을 수 있습니다 ...하지만 메모리 누수에 대한 좋은 가능성처럼 보인다.

+0

그러나 어떻게 내 onImgClick 메서드에서 getView (int position, View convertView, ViewGroup parent) 메서드를 사용할 수 있습니까? onImgClick에는 하나의 매개 변수 -보기 만 있습니다. – woyaru

관련 문제