W jaki sposób chciałbym dodać dodające klikalne linki do ListView?Android: Jak mogę dodać linki HTML wewnątrz ListView?
Odpowiedz
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 ...
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
Dziękuję, świetnie się spisałeś. –
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. –
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
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);
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
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.) –
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));
trudna część listview jest niczym w obrębie (na przykład TextView z przycisku) jest klikalny!
Zasadniczo trzeba dwie tablice ciąg znaków:
- nazw, które użytkownicy widzą na list_view;
- 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();
- 1. Jak mogę mieć ListView wewnątrz NestedScrollView
- 2. Jak mogę powiedzieć Scrapy, aby indeksował tylko linki wewnątrz Xpath?
- 3. ViewPager wewnątrz ListView
- 4. Wszystkie linki na stronie html?
- 5. Linki wewnątrz bogatego pola tekstowego?
- 6. Android ListView w Fragment
- 7. Jak dodać dodać linki zewnętrzne w yuidoc (grunt-contrib-yuidoc)
- 8. Umieszczenie ListView wewnątrz Galerii
- 9. Jak mogę dodać obramowanie do ListViewItem, ListView w trybie GridView
- 10. HtmlAgilityPack Uzyskaj wszystkie linki wewnątrz DIV
- 11. Zagnieżdżanie widoku Android ViewPager, przesuwanie elementów listy wewnątrz listView poziomo
- 12. ListView wewnątrz ScrollView z DrawerLayout
- 13. Linki wewnątrz większych obszarów klikalne (CSS Only)
- 14. Android: stopka w ListView
- 15. match_parent nie działa dla ListView, jeśli ListView jest wewnątrz NestedScrollView
- 16. Wyściółka Android ListView dla zawartości bez przenoszenia wysokości ListView?
- 17. Jak dodać separatory/separatory sekcji do ListView?
- 18. Jak uzyskać wszystkie linki z listy wewnątrz elementu div?
- 19. Android: jak ukryć element ListView?
- 20. Android Linki Jak ustawić niestandardowy kolor łącza?
- 21. Android ListView lazy loading
- 22. styl elementu Android listview?
- 23. Jak dodać wiele widoków nagłówka w ListView
- 24. Umieść znaczniki html wewnątrz html
- 25. Custom ListView Adapter Android
- 26. Firebase Android: Stosować głębokie linki
- 27. Android, SlidingPaneLayout i listView
- 28. Android ListView onItemClick
- 29. Programowo Fling ListView Android
- 30. Jak mogę wyświetlić formatowanie HTML wewnątrz obszaru tekstowego?
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. –
Wielkie dzięki, pomógł mi z moim ListView. – rwarner