Android 从另一个onClick方法控件访问ListView控件
如何从分配给例如ImageView的onClick方法访问例如TextView?TextView和ImageView组成ListView项 在my item.xml中,我有:Android 从另一个onClick方法控件访问ListView控件,android,onclick,listactivity,Android,Onclick,Listactivity,如何从分配给例如ImageView的onClick方法访问例如TextView?TextView和ImageView组成ListView项 在my item.xml中,我有: <?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:
<?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>
但是视图v-这是ImageView,所以在这个方法中我有一个致命的例外:
java.lang.NullPointerException
在线:
tv.setText("Hello world!");
我知道这不是访问TextView的正确方法。我知道我可以根据整个ListView使用onListItemClick(ListView l,View v,int position,long id)。但是我想通过ImageView onClick方法实现这一点。那么,访问TextView的最简单方法是通过处理程序并使用sendMessage: 或者,根据您实现它的方式,您可能希望查看getParent(),如
v.getParent().findViewById(r.id.text)代码>
不过,我不确定这是否适用于您的情况。好吧,访问TextView的最简单方法是通过处理程序并使用sendMessage:
或者,根据您实现它的方式,您可能希望查看getParent(),如v.getParent().findViewById(r.id.text)代码>
但我不确定这是否适用于您的情况。在onclick侦听器上设置listview的getView方法中的listview。在onclick侦听器上设置listview的getView方法中的listview。我建议您覆盖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(“TEXT_VIEW”)获取TextView。。。但这似乎很有可能导致内存泄漏。我建议您重写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(“TEXT_VIEW”)获取TextView。。。但这似乎很有可能导致内存泄漏。我已经解决了我的问题。我只需在我的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!");
}
我已经解决了我的问题。我只需在我的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!");
}
如果ImageView和TextView构成一个listview项目,那么它们是listview中项目的子视图,因此您可以通过父视图访问子视图…您可以实现(我想是的),但onclick方法将仅分配给listview的顶部,而不是所有项目…是的,我可以这样做。或者根据整个ListView使用onListItemClick(ListView l、View v、int-position、long-id)方法。但是我想从ImageView onClick方法中找到解决方案。如果ImageView和TextView形成一个listview项,那么它们是listview中项的子视图,因此您可以通过父视图访问子视图…您可以实现(我想是的),但是onClick方法将仅分配给listview的顶部,而不是所有项…是的,我可以做那样的事。或者根据整个ListView使用onListItemClick(ListView l、View v、int-position、long-id)方法。但是我想从ImageView onClick方法中找到解决方案。到第二个方法:v.getParent()。
-我这里没有findViewById()方法。顺便说一下,当我这样做时:Toast.makeText(getApplicationContext(),v.getParent().toString(),0.show()代码>我可以将android.widget.LinearLayout视为父视图。如果我想使用处理程序和sendMessage,我必须在类中声明我的TextView(如果我理解的话)。但是我的ListView中有很多项,当我单击ImageView时,我无法访问ImageView onClick方法中的TextView。对于第二个方法:v.getParent()。
-我这里没有findViewById()方法。顺便说一下,当我这样做时:Toast.makeText(getApplicationContext(),v.getParent().toString(),0.show()代码>我可以将android.widget.LinearLayout视为父视图。如果我想使用处理程序和sendMessage,我必须在类中声明我的TextView(如果我理解的话)。但是我有一个列表视图,其中有很多项目,当我单击ImageView时,我无法访问ImageView onClick方法中的TextView。你能给我更多详细信息吗?你是说姆巴恩斯推荐给我的东西吗?你能告诉我更多的细节吗?你是说mbarnes推荐给我的东西吗?但是我如何在我的onImgClick方法中使用getView(int-position,View-convertView,ViewGroup-parent)方法呢?在onImgClick中,我只有一个参数-View。但是在我的onImgClick方法中如何使用getView(int-position,View-convertView,ViewGroup-parent)方法呢?在onImgClick中,我只有一个参数-视图。