2009-11-08 10 views

Odpowiedz

22

Dokonuje się tego za pomocą atrybutu autoLink w TextView. Zajęło mi trochę czasu na zapoznanie się z dokumentacją, więc umieszczam ją tutaj na przykładzie, na wypadek gdyby ktoś inny ją szukał:

Załóżmy, że wiążesz swój listview z niestandardową adapterem. W takim przypadku, po kawałek kodu przechodzi do rozmowy getView:

Kod:

textcontent.setText(Html.fromHtml(item.get_text())); 
textcontent.setAutoLinkMask(Linkify.WEB_URLS); 

Wystarczy umieścić link wewnątrz tekst jest przekazywany do wywołania setText i gotowe.

XML:

<TextView 
       android:id="@+id/txtview" 
       android:autoLink="web" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:text="put your link here"/> 

nadzieję, że pomoże ...

+1

To tak naprawdę nie działa dla mnie - poszczególne linki pozostały niemożliwe do skasowania w elementach znajdujących się w ListView, ale rozwiązanie emmby działało świetnie. –

+0

Wielkie dzięki, pomógł mi z moim ListView. – rwarner

17

Jeśli masz tekst, który jest już w formacie HTML, najlepszą rzeczą do zrobienia jest następujący:

TextView textcontent = (TextView) findViewById(...); 
textcontent.setMovementMethod(LinkMovementMethod.getInstance()); 

String text = "<a href="http://www.stackoverflow.com">stackoverflow.com</a>"; 
textcontent.setText(Html.fromHtml(text)); 

Spowoduje to kliknięcie dowolnych znaczników linków w widoku tekstowym. Alternatywnie, możesz użyć android:autoLink="web" zgodnie z sugestią Legend, ale ma to efekt uboczny: a) adresy URL linfying, które nie są zawijane w znaczniki kotwicy, oraz b) potencjalnie brakujące adresy URL lub linki, które nie są adresami URL. Jeśli chcesz inteligentnych funkcji autoLink, powinieneś go użyć, ale jeśli chcesz tylko przymocować tagi, które już tam są, lepiej jest użyć setMovementMethod().

Zobacz ten raport błędu Szczegółowe informacje: http://code.google.com/p/android/issues/detail?id=2219

+0

Dziękuję, świetnie się spisałeś. –

+3

Hmm, wydaje się, że dodanie textcontent.setMovementMethod (LinkMovementMethod.getInstance()); sprawia, że ​​kliknięcia części tekstowych tekstu tekstowego nie są już przekazywane do widoku listy poniżej. –

+0

To jest najbardziej poprawna odpowiedź na zadane pytanie. Odpowiedzi BeerMe rozwiązują problemy z tym, że element ListView staje się niemożliwy do skasowania. – juil

10

Hmm, wydaje się, że dodanie textcontent.setMovementMethod (LinkMovementMethod.getInstance()); sprawia, że ​​kliknięcia części tekstowych tekstu tekstowego nie są już przekazywane do widoku listy poniżej.

znalazłem proste obejście pod Issue 3414, Comment 27:

łatwy sposób, aby obejść ten problem jest wywołanie "setDescendantFocusability (FOCUS_BLOCK_DESCENDANTS);" na liście Wyświetl widoki podczas ich dodawania. Będziesz mógł wybierać wiersze, klikać wiersze i klikać pola i przyciski podrzędne.

To działało idealnie dla mnie, chociaż niektóre odlew był zobowiązany:

View v; 
((ViewGroup)v).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 
+0

Gdzie dodajesz wzorzec relatywności? Do ListView lub do ListItem? Podążyłem za twoim przykładem, aby dodać klikalne linki, ale po kliknięciu na nieliniowe części mojego widoku tekstowego, zdarzenie nie jest przekazywane do nadrzędnego widoku listitem lub do widoku listy ... – ffleandro

+0

Używam go w ten sposób: publiczny Zobacz getView (int position, View convertView, ViewGroup parent) { Zobacz v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate (itemLayout, null); } ... ((ViewGroup) v) .setDescendantFocusability (ViewGroup.FOCUS_BLOCK_DESCENDANTS); return v; } Nie zaznaczyłem, aby zobaczyć, co stanie się z wydarzeniem, jeśli kliknięto część niebędącą linkiem. (Nie wiem, dlaczego nie mogę uzyskać kodu do sformatowania ... przepraszam.) –

1

Musisz ustawić setOnItemClickListener function() i wewnątrz niego deklarują coś takiego:

Uri uri = Uri.parse("http://www.google.com"); 
startActivity(new Intent(Intent.ACTION_VIEW, uri)); 
0

trudna część listview jest niczym w obrębie (na przykład TextView z przycisku) jest klikalny!

Zasadniczo trzeba dwie tablice ciąg znaków:

  1. nazw, które użytkownicy widzą na list_view;
  2. hiperłącza, które chcesz skierować.

W array.xml:

<string-array name="search_provider_name_array"> 
    <item>Google</item> 
    <item>Yahoo</item> 
    <item>Bing</item> 
    <item>Baidu</item> 
</string-array> 
<string-array name="search_provider_link_array"> 
    <item>https://www.google.com</item> 
    <item>https://www.yahoo.com</item> 
    <item>https://www.bing.com</item> 
    <item>https://www.baidu.com</item> 
</string-array> 

W layout_search_provider.xml zawiera widok listy:

<ListView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/lv_search" 
    android:dividerHeight="1dp"/> 

W swojej działalności:

public class SearchProvider implements AdapterView.OnItemClickListener { 
    private ListView lv_search; 
    private String[] names = getResources().getStringArray(R.array.search_provider_name_array); 
    private String[] links = getResources().getStringArray(R.array.search_provider_link_array); 

    //.. 

    @Override 
    public View onCreateView(View v, String name, Context context, AttributeSet attrs) { 
     lv_search= (ListView) v.findViewById(R.id.lv_search); 

     ArrayAdapter sAdapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, names); 
     lv_search.setAdapter(sAdapter); 
     lv_search.setOnItemClickListener(this); 

     return v; 
    } 

    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
     if(i<links.length){ 
      Uri uri = Uri.parse(links[i]); 
      Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
      startActivity(intent); 
     } 
    } 

} 

Kiedy twój lista jest dynamiczna, możesz zastosować następujące metody, aby zaktualizować swój listview.

  • przenieść kod w onCreateView() na onResume().
  • sAdapter.notifyDataSetChanged();
Powiązane problemy