- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 Android 项目正在加载带有 Twitter 提要项的 ListView。我遇到的问题是,如果用户单击嵌入式超链接外部的 ListView 项目,则仍允许选择 ListView 项目的嵌入式超链接起作用。
假设 Twitter 提要项的文本是:
This is a sample tweet with an embedded link (https://t.co/eMnVvBEo7W). And this is some random text.
这部分有效。该链接是彩色的(显示它是一个超链接),当我单击 TextView 的链接部分时,它会正确启动浏览器和页面。
问题是 TextView 上的所有其他点击都没有通过。我需要能够获得 ListView 项目上的点击事件,以便我可以使用推文执行其他功能(如分享等)。但是,正如我所说,没有点击事件通过。我想要的是,当用户选择推文的非超链接部分时,该项目将被选中。
下面是一些代码 fragment
ListView 项目布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="1256dp"
android:layout_width="1256dp"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants">
<ImageView
android:id="@+id/imageViewTwitterFeed"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:paddingLeft="5dp"
android:paddingRight="5dp" />
<TextView
android:id="@+id/textViewTwitterFeed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="18dp"
android:layout_marginStart="18dp"
android:layout_toRightOf="@+id/imageViewTwitterFeed"
android:layout_toEndOf="@+id/imageViewTwitterFeed"
android:textAppearance="?android:attr/textAppearanceMedium"
android:ellipsize="end"
android:singleLine="false"
android:autoLink="web"
android:focusable="false"
android:paddingTop="5dp"
android:paddingBottom="5dp"/>
</RelativeLayout>
fragment 布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/tweetList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:choiceMode="singleChoice"
android:listSelector="#d3d3d3"/>
</LinearLayout>
fragment 代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// Inflate view
pageView = inflater.inflate(R.layout.page_twitter_feed_view_fragment, container, false);
tweetsListView = (ListView) pageView.findViewById(R.id.tweetList);
tweetsListView.setBackgroundColor(Color.WHITE);
if(pageDefinition == null)
{
// Get page definition associated with this fragment
if (getArguments().containsKey(MINPageDefinition.ARG_ITEM_ID))
{
pageDefinition = MINAppConfiguration.getSharedInstance().currentMarket.pageArray.get(Integer.valueOf(getArguments().getString(MINPageDefinition.ARG_ITEM_ID)));
}
// Provide a weak reference to this fragment for optimization purposes
pageDefinition.weakFragment = new WeakReference<Fragment>(this);
}
// Set up specific controls/views
initializePage();
// Set up adapter & click listener
adapter = new TwitterFeedAdapter(this, tweetStatusList);
tweetsListView.setAdapter(adapter);
tweetsListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
twitter4j.Status tweetStatus = (twitter4j.Status)tweetStatusList.get(position);
setTwitterShareIntent(tweetStatus);
}
});
// Report to Flurry
WeakHashMap<String, String> map = new WeakHashMap<String, String>();
map.put(MINFlurryDefines.kFlurryKey_PageName, pageDefinition.pageName);
FlurryAgent.logEvent(MINFlurryDefines.kFlurryEvent_PageView + " - " + pageDefinition.pageName, map, true);
return pageView;
}
编辑:
// Set up adapter & click listener
adapter = new TwitterFeedAdapter(this, tweetStatusList);
tweetsListView.setAdapter(adapter);
tweetsListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
tweetsListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, final int position, long id)
{
twitter4j.Status tweetStatus = (twitter4j.Status)tweetStatusList.get(position);
setTwitterShareIntent(tweetStatus);
// Show the item as selected
/*
parent.requestFocusFromTouch();
parent.setSelection(position);
parent.requestFocus();
*/
}
});
final TextView tweetTextView = (TextView)V.findViewById(R.id.textViewTwitterFeed);
tweetTextView.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
//tweetsListView.setSelection(position);
//tweetsListView.smoothScrollToPosition(position);
tweetsListView.performItemClick(v, position, 0);
}
});
tweetTextView.setMovementMethod(new CustomLinkMovementMethod());
tweetTextView.setFocusable(false);
tweetTextView.setClickable(false);
tweetTextView.setLongClickable(false);
最佳答案
textView.setMovementMethod(new CustomLinkMovementMethod());
textView.setFocusable(false);
textView.setClickable(false);
textView.setLongClickable(false);
public class CustomLinkMovementMethod extends LinkMovementMethod {
@Override
public boolean onTouchEvent(TextView textView, 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 -= textView.getTotalPaddingLeft();
y -= textView.getTotalPaddingTop();
x += textView.getScrollX();
y += textView.getScrollY();
Layout layout = textView.getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
if (!(textView.getText() instanceof Spannable)) {
return false;
}
Spannable spannable = ((Spannable) textView.getText());
ClickableSpan[] link = spannable.getSpans(off, off, ClickableSpan.class);
if (link.length != 0) {
if (action == MotionEvent.ACTION_UP) {
link[0].onClick(textView);
} else {
Selection.setSelection(spannable,
spannable.getSpanStart(link[0]),
spannable.getSpanEnd(link[0]));
}
return true;
} else {
Selection.removeSelection(spannable);
}
}
return false;
}
}
关于android - 带有 autoLink 的 TextView 不允许在 TextView 的非超链接部分捕获点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32592381/
我在使用 TextView 的 autoLink="phone"选项时遇到了一些问题。我的用户界面: 当我切换到图形布局(在 ADT 中)时,我收到以下错误: 渲染期间引发的异
具有 SDK 20+ 的手机认为任何两个中间有点的单词都是链接。如何制作自己的链接检测器? android:autoLink="web" 认为 abra.kadabra 是一个 url。 setAut
我有一段代码可以识别电子邮件,但没有。我认为这是因为电子邮件地址的“开头”部分(@ 符号之前的部分)只有两个字符。有谁知道如何解决这一问题?我尝试使用 android:autoLink="all" 但
我有一个简单的 TextView,本地电话号码是 852112222 或 (8 5) 211 2222。 我需要它是可点击的,所以我自然而然地使用了 android:autoLink="all"。 但
我正在实现电话演示,在我的演示中,我使用 autoLink = phone 生成了到 textview 的链接,但只有当我将此号码保存在我的联系人列表中时它才有效,我无法生成随机数链接.. 我也尝试过
我有一个带有 TextView 的应用小部件。我将其 android:autoLink 属性设置为“web”,以便可以单击链接以在浏览器中启动它们。这些链接可以正常点击,但是当我点击它们时,在打开浏览
我有一个 ScrollView ,我有属性 android:clickable="true" 和 android:autoLink="all"。 我有一个用于 ScrollView 的字符串,电子邮件
假设我在 TextView 中有以下文本: Hey there, visit www.example.com 如果我设置 TextView 的属性 autoLink="all"www.example.
我正在使用 Autolinker.js链接从表单输入的文本,但我想将 example.com 排除在链接之外。 var formInput = "Don't link example.com but
我有以下 TextView: 和字符串: Foo bar. 这给出了我的黑色下划线文本。如果我想要链接的蓝色、无下划线文本(“bar”部分),但我希望其余部分(“foo”部分)为黑色怎么办?我怎样才
我在 ListView 中显示了一个网址列表。 ListView 的每个项目都有一个 TextView 和一个 ImageView。 TextView 具有属性 autolink="web"。 我在这
我想从代码创建这个 TextView,但是我遇到了无数问题。 首先,我在创建 TextView 的中途添加了这个: tw_phone.setAutoLinkMask(0x04); 这导致了一个可点
这是我的布局 xml 文件。 ... ... ... ... ... 这是我的 onFling() : SimpleOnGest
我有一个 TextView,我将其设置为: android:autoLink="web" 但是当我添加以下文本时: TextView text = (TextView) findViewById(R.
我正在尝试使页面上的文本链接成为事件超链接。每次通过表单将新文本链接添加到页面时,我都需要重新运行 atolink 脚本,以便新添加的文本链接也会成为事件超链接,而无需重新加载整个页面。 这是表格 最
我正在使用 TextView 的 autoLink="All"功能来链接 TextView 中的所有 url 和电话号码。 我面临的问题是,在模拟器上,某些号码被识别为电话号码并且可以点击。在真实设备
我是 Android 编程的新手,我遇到了这个奇怪的问题,我想让列表中的电话号码可以点击,他们会在其中向您发送拨号器,现在这在我的 Android 手机上有效,但它似乎只在 10 个字符的数字上工作,
我正在设计一个 React Native 应用程序,我想创建一个 Apk 来测试该应用程序。 但是,当我在 Android Studio 上单击“使用 Gradle 文件同步项目”时,出现以下错误:
我有一个 Activity ,其中有两个使用 SlidingTabLayout 和 ViewPager 创建的选项卡。每个选项卡都是具有不同布局的 fragment 。然而,这两种布局都包含类似的 T
我使用以下样式来布局按钮: wrap_content wrap_content true web 按钮本身嵌套在一些 LinearLayouts 中,这些 Line
我是一名优秀的程序员,十分优秀!