2011-10-31 1 views
18

私は、他の多くのビューの他に各行にTextViewを含むListViewを持っています。 TextViewは、リンクを含む可能性のあるhtmlコンテンツをレンダリングします。Android - リストビューは、クリック可能なリンクを含むテキストビューのOnItemClickを受け取りません

以下のコードがリストアダプターに表示されます。 m_textview.setMovementMethod(LinkMovementMethod.getInstance()); m_textview.setText(Html.fromHtml(myhtmlcontent));

これにより、リストビューはクリックイベントで受信しなくなります。私は代わりにアダプタによって返されているビューにリストをクリックすることにしました。これは望み通りにはうまくいきません。これで、テキストビュー以外の行のどこかをクリックすると別のアクティビティを起動できます。ユーザーがテキストビューの非リンク部分をクリックして別のアクティビティを開始できるようにします。

親ビューではなくテキストビューに移動すると、リンク上をクリックすると2つのイベントが発生します.1つはリンクのクリック、もう1つはテキストビュー(望ましくない)です。

私は、アンドロイドのgoogle +と覗き見が気に入っています。私はそれがどのように達成されるのか分かりません。

答えて

1

ListViewアイテム内のフォーカス可能なビューは、ListViewアイテムを選択する機能を無効にします。 TextViewにandroid:focusable="false"を適用すると、OnItemClickが再び機能するようになります。また、ListViewのフォーカス可能な要素の上でトラックボールをクリックすると、リンクとListView項目の両方をクリックできるので、トラックボールがリンクを無視するようにするには、android:focusableInTouchMode="false"を適用する必要があります。

21

これは実際にはBUGです。これを解決するには、ListView's行レイアウトxmlのandroid:descendantFocusability="blocksDescendants"を追加することができます。例えば

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:descendantFocusability="blocksDescendants" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/lblStatusMessage" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:autoLink="web" 
    android:focusable="false" 
    android:textSize="15sp" /> 
</LinearLayout> 

ソース用:thisthis

グッドラック:)

+0

に基づいて、それは遅すぎるかもしれ..しかし、私は同じ問題を有し、かつ、この未回答の投稿を見つけました。 :) –

0

あなたはsetOnItemClickListenerを表示するには、リストの上に取り付けることができます。

0

私は同じ問題を抱えていて、これらの答えのどれも私のために働いていませんでした。結局、私はその属性を削除することによって問題を解決することができたandroid:inputType="textMultiLine"

0

リンクのタッチイベントにのみ応答するTextView。 https://stackoverflow.com/a/7327332/1768722

 public class AutoLinkTextView extends TextView { 

      public AutoLinkTextView(Context context, AttributeSet attrs, int defStyle) { 
       super(context, attrs, defStyle); 
       init(); 
      } 

      public AutoLinkTextView(Context context, AttributeSet attrs) { 
       super(context, attrs); 
       init(); 
      } 

      public AutoLinkTextView(Context context) { 
       super(context); 
       init(); 
      } 

      private void init() { 
       this.setAutoLinkMask(Linkify.ALL); 
      } 

      /** 
      * @Linkify applies to a movementMethod to the textView @LinkMovementMethod. 
      *   That movement method thought it implements a scrolling 
      *   vertically method it overrides any other scrolling method the 
      *   parent has. 
      * 
      *   Although touchEvent can be dispached to the parent, the specific 
      *   parent ScrollView needed the whole sequence ACTION_DOWN , 
      *   ACTION_MOVE, ACTION_UP to perform (sweep detection). So the 
      *   solution to this problem is after applying @Linkify we need to 
      *   remove the textView's scrolling method and handle the @LinkMovementMethod 
      *   link detection action in onTouchEvent of the textView. 
      */ 
      @Override 
      public boolean onTouchEvent(MotionEvent event) { 
       final TextView widget = (TextView) this; 
       final Object text = widget.getText(); 
       if (text instanceof Spannable) { 
        final Spannable buffer = (Spannable) text; 
        final 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(); 

         final Layout layout = widget.getLayout(); 
         final int line = layout.getLineForVertical(y); 
         final int off = layout.getOffsetForHorizontal(line, x); 

         final 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])); 
          } 
          return true; 
         } 
        } 

       } 
       return false; 
      } 

      @Override 
      public void setText(CharSequence text, BufferType type) { 
       super.setText(text, type); 
       this.setMovementMethod(null); 
      } 
     } 
関連する問題