我正在努力将Twitter集成到一个应用程序中,而且当setOnItemClickListener()
ListView
中有一个链接时,item
无法触发我的所有工作。当item
中没有链接(URL)时,它可以正常工作。
点击URL本身可在浏览器中打开网页。
请参阅帖子末尾添加的参考截图。
这是一个使用ListView
的自定义BaseAdapter
。我不确定要放入哪一段代码,但是当指向这里的人可能需要的代码块时,我会立即添加它。
需要忽略项目中的链接(URL)背后的想法是提供一种功能,当用户点击其中时,显示推文详细信息。类似于Twitter Android应用程序的东西。
那么如何让setOnItemClickListener()
忽略项目中的链接?
更新:
好。所以我不确定它是否与这个问题相关,但是,从SO的一些解决方案的组合导致我进入TweetLanes开源项目,我已经成功地完成了一些工作。但不幸的是,它并没有解决我的主要问题。
如何让setOnItemClickListener()
忽略项目中的链接,以便我可以单击它并在另一个活动中显示详细信息,但是,当我点击链接时,不会触发setOnItemClickListener()
?我每次尝试都会不断获得部分解决方案。但有时,当我点击link
时,setOnItemClickListener()
也会触发。
这就是目前的流程:
在前两个屏幕截图中,它可以正常工作。毕竟不是点击链接。
但在最后两位,当我点击 @ibnlive 链接时,它会显示用户的个人资料( @ibnlive )。这部分源自TweetLanes来源。问题是,还会触发点击侦听器。这是我正在尝试的解决方案之一。在这种情况下,我已注释掉了setOnItemClickListener()
并在OnClickListener()
上使用了TextView
。到目前为止,这是一种部分成功的方法。
答案 0 :(得分:2)
为了支持listItem的点击事件和支持记录内的链接,你应该在列表记录的xml的顶层布局中设置android:descendantFocusability="blocksDescendants"
。
答案 1 :(得分:1)
这是因为链接是可点击的,listItem也是可点击的,所以这里链接获取焦点,因此无法单击listItem。
你只需要设置:
设置所有项目android:focusable="false"
和android:focusableInTouchMode="false"
。
答案 2 :(得分:1)
您是否尝试过下一段代码(基于this link):
textView.setMovementMethod(null);
编辑:这是一个有效的解决方案:
textView.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(final View v, final MotionEvent event)
{
if (event.getAction() == MotionEvent.ACTION_UP)
{
// <=handle clicking here
}
return true;
}
});
答案 3 :(得分:1)
您可能想看看babay's answer on ListView: TextView with LinkMovementMethod makes list item unclickable?
他提出了一个TextView,它基本上通过引入不同的LinkMovementMethod
:
public static class LocalLinkMovementMethod extends LinkMovementMethod{
static LocalLinkMovementMethod sInstance;
public static LocalLinkMovementMethod getInstance() {
if (sInstance == null)
sInstance = new LocalLinkMovementMethod();
return sInstance;
}
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_DOWN) {
int x = (int) event.getX();
int y = (int) event.getY();
x -= widget.getTotalPaddingLeft();
y -= widget.getTotalPaddingTop();
x += widget.getScrollX();
y += widget.getScrollY();
Layout layout = widget.getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
if (link.length != 0) {
if (action == MotionEvent.ACTION_UP) {
link[0].onClick(widget);
} else if (action == MotionEvent.ACTION_DOWN) {
Selection.setSelection(buffer,
buffer.getSpanStart(link[0]),
buffer.getSpanEnd(link[0]));
}
if (widget instanceof TextViewFixTouchConsume){
((TextViewFixTouchConsume) widget).linkHit = true;
}
return true;
} else {
Selection.removeSelection(buffer);
Touch.onTouchEvent(widget, buffer, event);
return false;
}
}
return Touch.onTouchEvent(widget, buffer, event);
}
}
解决方案 NOT TESTED
基于它,我建议你修复文件TwitterLinkify.java
(设置链接移动的功能),如下所示:
private static final void addLinkMovementMethod(TextView t) {
MovementMethod m = t.getMovementMethod();
if ((m == null) || !(m instanceof LocalLinkMovementMethod)) {
if (t.getLinksClickable()) {
t.setMovementMethod(LocalLinkMovementMethod.getInstance());
}
}
}
由于
答案 4 :(得分:0)
请看一下。
text_url.setText(Html.fromHtml(url.toString().trim()));
Linkify.addLinks(text_url, Linkify.ALL);
这是我用来在列表视图中显示网址的行。如果你在你的getview中执行上面的行,链接将变为蓝色,并自动显示下划线。如果你点击它,它将自动打开浏览器。
希望这会对你有所帮助。
修改强>
您好看看这个编辑过的答案。我已经验证了。它会打开正确的网址。希望这会帮助你。
String url="www.google.com";
String name="@sampleuser";
textview1.setText(Html.fromHtml("<a href='http://"+url+"'>http://"+name+"</a>"));
textview1.setMovementMethod(LinkMovementMethod.getInstance());
编辑2 嗨,看看这个样本。希望这会帮助你 。
package com.example.listwithclick;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
ListView listView1;
Activity activity;
ArrayList<String>urls=new ArrayList<String>();
ArrayList<String>name=new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activity=this;
urls.add("www.google.com");
name.add("@googleuser");
urls.add("www.yahoo.com");
name.add("@yahoouser");
urls.add("www.facebook.com");
name.add("@facebookuser");
urls.add("www.linkedin.com");
name.add("@linkedinuser");
listView1=(ListView)findViewById(R.id.listView1);
listView1.setAdapter(new MyAddapter(MainActivity.this));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
class MyAddapter extends BaseAdapter {
Context rContext;
private LayoutInflater rInflater;
public MyAddapter(Context c) {
rInflater = LayoutInflater.from(c);
rContext = c;
}
public MyAddapter(Activity imagebinding) {
// TODO Auto-generated constructor stub
activity = imagebinding;
rContext = imagebinding;
rInflater = LayoutInflater.from(imagebinding);
rContext = imagebinding;
rInflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return urls.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
// TODO Auto-generated method stub
convertView = rInflater.inflate(R.layout.child, null);
final MyDat mydat = new MyDat();
mydat.textview = (TextView) convertView.findViewById(R.id.textview_name);
mydat.textview.setText(Html.fromHtml("<a href='http://"+urls.get(position).toString()+"'>"+name.get(position).toString()+"</a>"));
mydat.textview.setMovementMethod(LinkMovementMethod.getInstance());
return convertView;
}
class MyDat {
TextView textview;
}
}
}