android - форматирование - ссылка в textview




Как создать ссылки в текстовом клиенте? (20)

Вам нужно только это:

android:autoLink="web"

Вставьте эту строку в TextView, которую можно кликать по ссылке в Интернете. URL-адрес, заданный как текст этого TextView.

Пример:

 <TextView
    android:id="@+id/textViewWikiURL"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="20sp"
    android:textStyle="bold"
    android:text="http://www.wikipedia.org/"
    android:autoLink="web" />

У меня есть следующий TextView:

<TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:text="@string/txtCredits"
    android:autoLink="web" android:id="@+id/infoTxtCredits"
    android:layout_centerInParent="true"
    android:linksClickable="true"></TextView>

где @string/txtCredits - это строковый ресурс, содержащий <a href="some site">Link text</a> .

Android выделяет ссылки в TextView, но они не реагируют на клики. Может ли кто-нибудь сказать мне, что я делаю неправильно? Должен ли я устанавливать onClickListener для TextView в своей деятельности для чего-то простого?

Похоже, это связано с тем, как я определяю свой строковый ресурс. Это не работает:

<string name="txtCredits"><a href="http://www.google.com">Google</a></string>

Но это делает:

<string name="txtCredits">www.google.com</string>

Это облом, потому что я бы скорее показал текстовую ссылку, чем полный URL.


Вышеупомянутые решения не сработали для меня, но следующее (и кажется немного чище).
Во-первых, в строковом ресурсе определите свой шедевр открытия тегов, используя кодировку объекта HTML, то есть:

&lt;a href="http://www.google.com">Google&lt;/a>

и не:

<a href="http://www.google.com">Google</a>

В общем, кодируйте все шевроны в такой строке. BTW, ссылка должна начинаться с http://

Затем (как предлагается here ) установите этот параметр в TextView:

 android:linksClickable="true"

Наконец, в коде выполните:

((TextView) findViewById(R.id.your_text_view)).setMovementMethod(LinkMovementMethod.getInstance());
((TextView) findViewById(R.id.your_text_view)).setText(Html.fromHtml(getResources().getString(R.string.string_with_links)));

Вот и все, никаких регулярных выражений или других ручных хаков.


Если вы используете XML TextView для вашего требования, вам нужно сделать всего две вещи:

  1. Определите свою ссылку в строке, например «это мой веб-сайт». Вы можете добавить его в xml или в код.

  2. В xml, который имеет TextView, добавьте следующее:


android:linksClickable="true"

android:autoLink="web"

Если вы хотите добавить ссылку на HTML-код, все, что вам нужно сделать, это:

  • добавить ресурс HTML-подобной строки:

     <string name="link"><a href="https://www.google.pl/">Google</a></string>
    
  • добавьте свой вид в макет с отсутствием конфигурации, специфичной для конкретной ссылки:

     <TextView
        android:id="@+id/link"
        android:text="@string/link" />`
    
  • добавьте соответствующий MovementMethod программно в TextView:

     mLink = (TextView) findViewById(R.id.link);
     if (mLink != null) {
       mLink.setMovementMethod(LinkMovementMethod.getInstance());
     }
    

Это оно! И да, наличие таких параметров, как «autoLink» и «linksClickable», работающие только с явными ссылками (не обернутые в теги html), слишком вводят меня в заблуждение ...


Именно так я решил использовать интерактивные и видимые ссылки в TextView (по коду)

private void setAsLink(TextView view, String url){
        Pattern pattern = Pattern.compile(url);
        Linkify.addLinks(view, pattern, "http://");
        view.setText(Html.fromHtml("<a href='http://"+url+"'>http://"+url+"</a>"));
    }

Использовать этот...

TextView.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        Intent in=new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.twitter.com/"));
                        startActivity(in);
                    }

                });

и добавить разрешение в файл манифеста

<uses-permission android:name="android.permission.INTERNET"/>

Мой код был таким:

<TextView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/link"
    android:text="@string/forgot"
    android:layout_marginTop="16dp"
    android:gravity="center"
    android:linksClickable="true"/>

Мой код Java был следующим:

/*TextView action*/
        TextView textView = (TextView) findViewById(R.id.link);
        textView.setMovementMethod(LinkMovementMethod.getInstance());
        textView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(LoginActivity.this,forgot.class));
            }
        });  

Это просто указывает на ссылку на другую деятельность. Но эта ссылка доступна клиенту и работает плавно. Протестировано в Android Studio 1.5 (Preview)


Не знаю, стоит ли добавить еще один ответ, но на всякий случай ...

Я должен был выследить это в нескольких местах, но, наконец, получил эту версию кода для работы.

strings.xml:

<string name="name1">&lt;a href="http://www.google.com">link text1&lt;/a></string>
<string name="name2">&lt;a href="http://www.google.com">link text2&lt;/a></string>

myactivity.xml:

<TextView 
    android:id="@+id/textview1"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_marginTop="5dp" />

<TextView 
    android:id="@+id/textview2"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_marginTop="5dp" />

myactivty.java (in onCreate ()):

TextView tv1 = (TextView)findViewById(R.id.textview1);
TextView tv2 = (TextView)findViewById(R.id.textview2);

tv1.setText(Html.fromHtml(getResources().getString(R.string.name1)));
tv2.setText(Html.fromHtml(getResources().getString(R.string.name2)));
tv1.setMovementMethod(LinkMovementMethod.getInstance());
tv2.setMovementMethod(LinkMovementMethod.getInstance());

Это создаст две интерактивные гиперссылки с текстовой link text1 и link text2 которые перенаправляют пользователя на Google.


Похороненный в демонстрациях API, я нашел решение своей проблемы:

Link.java:

    // text2 has links specified by putting <a> tags in the string
    // resource.  By default these links will appear but not
    // respond to user input.  To make them active, you need to
    // call setMovementMethod() on the TextView object.

    TextView t2 = (TextView) findViewById(R.id.text2);
    t2.setMovementMethod(LinkMovementMethod.getInstance());

Я удалил большинство атрибутов в своем TextView, чтобы соответствовать тому, что было в демо.

<TextView
    android:id="@+id/text2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/txtCredits"/>

Это решило. Довольно трудно раскрыть и исправить.

Важно : Не забудьте удалить autoLink="web" если вы вызываете setMovementMethod() .


Принятый ответ правильный, НО это будет означать, что номера телефонов, карты, адреса электронной почты и регулярные ссылки, например http://google.com без тэгов href, НЕ ДОЛЖНЫ быть кликабельными, поскольку вы не можете иметь автолинк в xml.

Единственное полное решение для ВСЕХ щелчков, которые я нашел, это следующее:

Spanned text = Html.fromHtml(myString);
URLSpan[] currentSpans = text.getSpans(0, text.length(), URLSpan.class);
SpannableString buffer = new SpannableString(text);
Linkify.addLinks(buffer, Linkify.ALL);
for (URLSpan span : currentSpans) {
    int end = text.getSpanEnd(span);
    int start = text.getSpanStart(span);
    buffer.setSpan(span, start, end, 0);
}
textView.setText(buffer);
textView.setMovementMethod(LinkMovementMethod.getInstance());

И TextView НЕ должен иметь android:autolink . android:linksClickable="true" не нужен android:linksClickable="true" ; это по умолчанию.


Проведя некоторое время с этим, я обнаружил, что:

  • android:autoLink="web" работает, если у вас есть полные ссылки в вашем HTML. Следующее будет выделено синим цветом и можно щелкнуть мышью:
  • Некоторый текст <a href="http://www.google.com">http://www.google.com</a>
  • Некоторые тексты http://www.google.com
  • view.setMovementMethod(LinkMovementMethod.getInstance()); будет работать со следующими (будет выделено и доступно для кликов):
  • Некоторый текст <a href="http://www.google.com">http://www.google.com</a>
  • Некоторые тексты http://www.google.com
  • Некоторый текст <a href="http://www.google.com">Go to Google</a>

Обратите внимание, что третий вариант имеет гиперссылку, но описание ссылки (сама часть между тегами) не является ссылкой. android:autoLink="web" НЕ работает с такими ссылками.

  • android:autoLink="web" если задано в XML, будет переопределять view.setMovementMethod(LinkMovementMethod.getInstance()); (т. е. ссылки третьего рода будут выделены, но не будут доступны).

view.setMovementMethod(LinkMovementMethod.getInstance()); рассказа является использование view.setMovementMethod(LinkMovementMethod.getInstance()); в вашем коде и убедитесь, что у вас нет android:autoLink="web" в вашем XML-макете, если вы хотите, чтобы все ссылки были android:autoLink="web" .


Просто потратил столько времени, чтобы понять, что вам нужно использовать getText (R.string.whatever) вместо getString (R.string.whatever) ...

В любом случае, вот как я получил свою работу. С несколькими гиперссылками в том же текстовом представлении тоже.

    TextView termsTextView = (TextView) getActivity().findViewById(R.id.termsTextView);
    termsTextView.append("By registering your account, you agree to our ");
    termsTextView.append(getText(R.string.terms_of_service));
    termsTextView.append(", ");
    termsTextView.append(getText(R.string.fees));
    termsTextView.append(", and the ");
    termsTextView.append(getText(R.string.stripe_connected_account_agreement));

    termsTextView.setMovementMethod(LinkMovementMethod.getInstance());



            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/termsTextView"/>

пример строки

    <string name="stripe_connected_account_agreement"><a href="https://stripe.com/connect/account-terms">Stripe Connected Account Agreement</a></string>

Самое легкое, что сработало для меня, - использовать here

TextView txt_Message = (TextView) view.findViewById(R.id.txt_message);
txt_Message.setText("This is link https://www.google.co.in/");
Linkify.addLinks(txt_Message, Linkify.WEB_URLS);

и он автоматически обнаружит URL-адреса веб-сайта в текстовом виде.


Следующее должно работать для всех, кто ищет комбинацию текста и гиперссылки в приложении для Android.

В string.xml :

<string name="applink">Looking for the regular Zesteve App? 
<a href="https://play.google.com/store/apps/details?id=zesteve.com.myapplication">Get it here</a>
</string>

Теперь вы можете использовать эту string в любом представлении View следующим образом:

<TextView
    android:id="@+id/getapp"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:gravity="center"
    android:textColor="@color/main_color_grey_600"
    android:textSize="15sp"
    android:text="@string/applink"/>

Теперь, в вашей деятельности или фрагменте, сделайте следующее:

TextView getapp =(TextView) findViewById(R.id.getapp);
getapp.setMovementMethod(LinkMovementMethod.getInstance());

К настоящему моменту вам не нужно устанавливать android:autoLink="web" или android:linksClickable="true" используя этот подход.

Надеюсь, вы найдете это полезным.


Только то, что вам нужно добавить в текстовое представление в xml

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:autoLink="web"/>

Я добавил эту строку в TextView : android:autoLink="web"
Ниже приведен пример использования в файле макета.

layout.xml

    <TextView
        android:id="@+id/txtLostpassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:autoLink="email"
        android:gravity="center"
        android:padding="20px"
        android:text="@string/lostpassword"
        android:textAppearance="?android:attr/textAppearanceSmall" />

    <TextView
        android:id="@+id/txtDefaultpassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:autoLink="web"
        android:gravity="center"
        android:padding="20px"
        android:text="@string/defaultpassword"
        android:textAppearance="?android:attr/textAppearanceSmall" />

string.xml

<string name="lostpassword">If you lost your password please contact <a href="mailto:[email protected]?Subject=Lost%20Password" target="_top">[email protected]</a></string>

<string name="defaultpassword">User Guide <a href="http://www.cleverfinger.com.au/user-guide/">http://www.cleverfinger.com.au/user-guide/</a></string>

Я использую автолинк для «авто подчеркивания» текста, но просто сделал «onClick», который управляет им. (Я сам столкнулся с этой проблемой)

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:textSize="18dp"
            android:autoLink="all"
            android:text="@string/twitter"
            android:onClick="twitter"/>

public void twitter (View view)
    {
        try
        {
            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://twitter.com/onaclovtech"));
            startActivity(browserIntent);

        }
        finally
        {
        }
    }

Не требует никаких разрешений, поскольку вы передаете намерение приложениям, которые управляют этими ресурсами (браузер IE).

Это и помогло мне. Удачи.


Я использую только android:autoLink="web" и он отлично работает. Щелчок по ссылке открывает браузер и показывает правильную страницу.

Одна вещь, которую я мог догадаться, - это то, что другой вид выше ссылки. Что-то прозрачное заполняет весь родитель, но не отображает ничего выше ссылки. В этом случае клик переходит к этому представлению вместо ссылки.


[Tested in Pre-lollipop as well as in Lollipop and above]

Вы можете получить свою строку HTML из бэкэнд или из ваших файлов ресурсов. Если вы поместите свой текст в строку ресурса, обязательно добавьте тег CDATA :

<string name="your_text">![CDATA[...<a href="your_link">Link Title</a>  ...]]</string>

Затем в коде вам нужно получить строку и назначить ее как HTML и установить способ перемещения ссылок:

String yourText = getString(R.string.your_text);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
   textView.setText(Html.fromHtml(yourText, Html.FROM_HTML_MODE_COMPACT));
} else {
   textView.setText(Html.fromHtml(yourText));
}

try {
   subtext.setMovementMethod(LinkMovementMethod.getInstance());
} catch (Exception e) {
   //This code seems to crash in some Samsung devices.
   //You can handle this edge case base on your needs.
}

Я надеюсь, что это поможет вам;

String value = "<html>Visit my blog <a href=\"http://www.maxartists.com\">mysite</a> View <a href=\"sherif-activity://myactivity?author=sherif&nick=king\">myactivity</a> callback</html>";
    TextView text = (TextView) findViewById(R.id.text);


    text.setText(Html.fromHtml(value));
    text.setMovementMethod(LinkMovementMethod.getInstance());






clickable