2017-07-26 4 views
-1

J'ai du texte affiché avec FragmentPagerAdapter. Ce texte contient des liens que je dois avoir cliquables. Il existe une solution utilisant OnTouchEvent avec une vue, mais comment puis-je obtenir les coordonnées? Ou y at-il une meilleure solution pour PagerAdapter?Liens cliquables avec PagerAdapter

EDIT: le code est:

private void setupPager() { 
    if (pagerAdapter == null) { 
     pagerAdapter = new TextFragmentPagerAdapter(getSupportFragmentManager()); 
    } 
    pager.setAdapter(pagerAdapter); 
    findViewById(R.id.progressBar1).setVisibility(View.GONE); 
    pager.setCurrentItem(current_page); 
    pager.setVisibility(View.VISIBLE); 
} 

private class TextFragmentPagerAdapter extends FragmentStatePagerAdapter { 

    public TextFragmentPagerAdapter(FragmentManager fragmentManager) { 
     super(fragmentManager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     spannable_page = null; 
     Fragment fragment = new Fragment(); 
     new PageForm(position, line_array, spannable_main).start(); 
     while (true) { 
      if (spannable_page != null) { 
       fragment = PageFragment.newInstance(spannable_page.get()); 
       break; 
      } 
     } 
     return fragment; 
    } 

    @Override 
    public int getCount() { 
     return total_pages; 
    } 
} 

PageForm classe interne construit chaque page comme ceci:

... 
    Object[] spans_test = spannable.getSpans(start_range, end_range - 1, Object.class); 
      CharSequence sequence_test = spannable.subSequence(start_range, end_range); 
      SpannableStringBuilder builder_test = new SpannableStringBuilder(); 
      builder_test.insert(0, sequence_test); 
      int sp_start, sp_end, flags, sp_s_fin, sp_e_fin; 

      for (int i = 0; i < spans_test.length; i++) { 
       sp_start = spannable.getSpanStart(spans_test[i]); 
       sp_end = spannable.getSpanEnd(spans_test[i]); 
       flags = spannable.getSpanFlags(spans_test[i]); 
       sp_s_fin = sp_start - start_range; 
       sp_e_fin = sp_end - start_range; 
       if (sp_s_fin < 0) sp_s_fin = 0; 
       if (sp_e_fin > builder_test.length() - 1) sp_e_fin = builder_test.length() - 1; 
       builder_test.setSpan(spans_test[i], sp_s_fin, sp_e_fin, flags); 
      } 

      synchronized (this) { 
       spannable_page = new WeakReference<Spannable>(builder_test); 
      } 

, j'ai besoin en quelque sorte des liens de piste à l'intérieur de chaque page.

+0

Montrez d'abord votre code =) – DEADMC

+0

Ajout de code, merci. – Bord81

Répondre

0

J'ai trouvé la solution et c'était plus facile que je ne le pensais. La clé pour rendre les liens cliquables avec PagerAdapter est de placer l'écouteur dans la classe Fragment de la page.

public class PageFragment extends Fragment { 
... 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
... 


URLSpan[] links = spannable.getSpans(0, spannable.length(), URLSpan.class); 
     for (URLSpan span : links) { 
      textLinks(spannable, span); 
     } 
     textView.setText(spannable); 
      textView.setMovementMethod(LinkMovementMethod.getInstance()); 
     return view; 
    } 


private void textLinks(Spannable text, final URLSpan span) { 
     int start = text.getSpanStart(span); 
     int end = text.getSpanEnd(span); 
     int flags = text.getSpanFlags(span); 
     ClickableSpan clickable = new ClickableSpan() { 
      @Override 
      public void onClick(View view) { 
       System.out.println("LINK CHECK: " + span.getURL()); 
      } 
     }; 
     text.setSpan(clickable, start, end, flags); 
     text.removeSpan(span); 
    }