2011-10-31 21 views
18

Diğer satırların yanı sıra her satırda bir TextView içeren bir ListView var. TextView, bağlantılar içerebilen html içeriğini oluşturur.Android - ListView OnItemClick tıklanabilir bağlantılar ile textview görmek için tıklayın

Aşağıdaki kod, liste bağdaştırıcısında görünür. m_textview.setMovementMethod (LinkMovementMethod.getInstance()); m_textview.setText (Html.fromHtml (myhtmlcontent));

Bu, liste görünümünün artık tıklama etkinliklerinde artık almamasına neden olur. Bunun yerine, bağdaştırıcı tarafından döndürülen görünümde liste onclick kodunu koymaya karar verdim. Bu oldukça istenen şekilde çalışmıyor. Artık metin görünümü dışında satırda herhangi bir yere tıkladığımda başka bir etkinlik başlatabilirim. Kullanıcıların, metin görünümünün bağlantı olmayan kısımlarını tıklayıp başka bir etkinlik başlatmasını istiyorum.

Onclick'i ana görünüm yerine metin görünümüne taşıyacak olursam işe yarar ancak bağlantıyı tıklattığınızda iki olay tetiklenir - biri bağlantıya tıklamak ve diğeri metin görünümü için (ki bu istenmiyor).

Android işletim sisteminde google + ve peep'in istediğim şekilde çalıştığını fark ettim. Bunun nasıl başarılacağından emin değilim.

cevap

1

ListView öğesinin içine odaklanan görünümler, ListView öğelerini seçme özelliğini devre dışı bırakır. TextView'a android:focusable="false" uygulanarak OnItemClick'in tekrar çalışması için izin verilecektir. Trackball'un linkleri görmezden gelmesi için android:focusableInTouchMode="false"'u da uygulamanız gerekebilir, çünkü ListView'de odaklanabilen bir öğe üzerindeki trackball'a tıklamak hem linki hem de ListView öğesini tıklatabilir.

21

Bu aslında bir BUG dur. Bu sorunu gidermek için android:descendantFocusability="blocksDescendants" numaranızı ListView's satır düzeninizi xml ekleyebilirsiniz. örneğin

<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> 

Kaynak için: this ve this

Good Luck :)

+0

dayanarak Çok geç olabilir .. AMA ben aynı sorunu olan ve bu cevapsız yazı bulunmuştur. :) –

0

Bir setOnItemClickListener görüntülemek listede ekleyebilir.

0

Aynı sorun vardı ve bu cevapların hiçbiri benim için işe yaramadı. Sonunda, android:inputType="textMultiLine" özniteliğini kaldırarak sorunu çözmeyi başardım. Sadece bağlantıların olayları dokunmaya tepki

0

TextView'un. 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); 
      } 
     } 
İlgili konular