4

だから私はランダムなテキストを表示するリストビューを持っています。textviewは通常のテキストの場合もありますが、URLなどの場合もあります。BaseAdapterのコードに次の行を追加しました。

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

mHolderがlistViewを高速化するためのViewHolderのインスタンスである場合、コンテンツはそのviewHolder内のTextViewであり、私はWebURLのみを強調表示します。

最初の問題、

そのコード行を追加してから、「asdfg」のような通常のテキストしかないアイテムの一部は、クリックしても強調表示されなくなりました。明確にするために、「強調表示」とは、onClickイベントを処理するために提供されたコードがあるかどうかに関係なく、listViewアイテムがクリックされたときに発生する通常の強調表示のみを意味します。

ここでの問題はそのコード行であることがわかっています。これを削除すると、listView上のすべてのアイテムがクリックされたときに強調表示されるためです。このスクリーンショットでこれを説明しようとしました

2番目の問題、

ActionModeを処理するために、MultiChoiceModeListenerをlistViewに追加しました。ただし、textViews内のリンクはクリック可能になり、ブラウザーが起動するため、ActionMode内のコードに従う代わりに、ActionMode内にあることを気にせずにブラウザーを起動するため、ActionMode内のリンクは正しく機能しなくなります。onItemCheckedStateChangedメソッド。

たとえば、ActionModeの場合、ユーザーがクリックしたすべてのアイテムは、後でonActionItemClickedを介して使用されるitemsCheckedという名前のArrayListに追加ます。ただし、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);
}
4

1 に答える 1

0

了解しました。しばらくの間、答えを求めて影に潜んでいた後、 AOSPMMSコードのおかげでようやく理解できました。クレジットは、githubに投稿するためにRascarloに送られますが、CMや他のプロジェクトからも利用できる可能性があると思います。

したがって、問題は、アダプター内で次のコード行を使用していたことでした。

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

ビルド済みのプロパティandroid:autoLinkを使用して、テキストビューのXMLでこれらすべてをより適切にアドレス指定できる場合は、任意のスキーム(私の場合はweb)に設定する必要があります。android:linksClickable。クリックで広告申込情報を強調表示する場合は、 FALSEに設定する必要があります。trueに設定すると、ロングクリックによるコンテキストメニューも機能しますが、強調表示されません。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" />

それが理解できなかった人たちに役立つことを願っています。

于 2013-01-25T21:54:03.130 に答える