【问题标题】:Linkify, ListView & ActionMode. Regular Text no longer clickableLinkify、ListView 和 ActionMode。常规文本不再可点击
【发布时间】:2012-12-17 14:21:11
【问题描述】:

所以我有一个显示随机文本的列表视图。 textview 有时可能是常规文本,但也可以是 URL 等。我在 BaseAdapter 的代码中添加了以下行:

Linkify.addLinks(mHolder.content, Linkify.WEB_URLS);

其中 mHolder 是 ViewHolder 的一个实例,用于加快 listView 的速度,内容是该 viewHolder 内的 TextView,我只愿意突出显示 Web Urls。

第一个问题,

由于添加了该行代码,一些只有常规文本(如“asdfg”)的项目现在在单击时不再突出显示。澄清一下,当我的意思是“突出显示”时,我只是指单击 listView 项目时发生的常规突出显示,无论是否提供了处理 onClick 事件的代码。

我知道这里的问题是那行代码,因为删除它会使 listView 上的所有项目在单击时突出显示。我试图通过screenshot 来描述这一点

第二个问题,

我在listView中添加了一个MultiChoiceModeListener来处理ActionMode;但是,鉴于 textViews 中的链接现在是可点击的并且将启动浏览器,它们在 ActionMode 下不再正常运行,因为它们不关心我们是否处于 ActionMode 并仍然启动浏览器而不是按照里面的代码onItemCheckedStateChanged 方法。

例如,在 ActionMode 中,用户单击的每个项目都会添加到名为 itemsChecked 的 ArrayList 中,该列表稍后会通过 onActionItemClicked 使用。但是,当使用 linkify 时,这不再可行,因为当用户单击具有 Web Url 作为文本的 ListView 项时,应用程序将被发送到后台,因为调用浏览器来处理链接。

我的问题是我可以做些什么来潜在地解决我的代码中的这些问题?

我希望链接突出显示和可点击,但不以这个成本为代价。我应该使用 Linkify 以外的其他东西来突出显示链接并使其可点击吗?还是“可点击性”总是会干扰 ListView 项的常规行为。

仅供参考,我为 ActionMode 和 ListView 运行的代码如下:(请记住,在不使用 Linkify 时代码可以正常工作

private MultiChoiceModeListener modeListener = new MultiChoiceModeListener() {

     @SuppressLint("NewApi")
    @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position,
                                              long id, boolean checked) {   
            String text =  listItems.get(position);
            if (checked) {
                itemsChecked.add(text);
            }
            else {
                int index = itemsChecked.indexOf(text);
                itemsChecked.remove(index);
            }               
        }

        @SuppressLint("NewApi")
        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            switch (item.getItemId()) {
                case 0:
                    mode.finish();
                    return true;
                case R.id.menu_merge:
                    mergeStrings();
                    mode.finish();
                    return true;                 
                case R.id.menu_star:
                    return false;                
                default:
                    return false;
            }
        }

        @SuppressLint("NewApi")
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            inActionMode = true;
            itemsChecked = new ArrayList<String>();
            MenuInflater inflater = mode.getMenuInflater();
            inflater.inflate(R.menu.context_menu, menu);
            return true;
        }

        @SuppressLint("NewApi")
        @Override
        public void onDestroyActionMode(ActionMode mode) {
            inActionMode = false;
        }

        @SuppressLint("NewApi")
        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }
};

@SuppressLint("NewApi")
private void initViews () {

    listView = (ListView) findViewById(R.id.home_list_view);
    if (isOldAPI) {
        registerForContextMenu(listView);
    }
    else {
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
        listView.setMultiChoiceModeListener(modeListener);          
    }
    mAdapter = new MyAdapter(this, listItems, isOldAPI);                
    listView.setAdapter(mAdapter);
}

【问题讨论】:

    标签: android android-listview linkify actionmode


    【解决方案1】:

    好的,所以在潜伏了一段时间后,我终于得到了答案,感谢AOSP MMS code. 感谢 Rascarlo 在 github 上发帖,尽管我认为我也可以通过 CM 和其他项目获得。

    所以,问题是我在适配器中使用了这行代码:

    Linkify.addLinks(mHolder.content, Linkify.WEB_URLS);
    

    通过使用预建属性android:autoLink 可以更好地解决文本视图的 XML 上的所有问题,必须将其设置为您喜欢的任何方案 - 在我的情况下为 web;和 android:linksClickable,如果您希望点击突出显示订单项,则必须设置为 FALSE。将其设置为 true 也可以,通过 longclick 的上下文菜单可以工作,但它只是没有突出显示。请注意,通过将其设置为 false,您将不得不通过代码而不是通过点击来处理此类链接的打开。

    这是我的 ListView 项的 XML 代码:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"    
    android:orientation="horizontal" >
    
    <TextView
        android:id="@+id/clip_list_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_margin="4dp"
        android:autoLink="web"
        android:linksClickable="false"
        android:textAppearance="?android:attr/textAppearanceMedium" />
    

    希望对那些想不通的人有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多