android - كيف أقوم بإنشاء روابط في TextView قابلة للنقر؟




hyperlink android-textview (20)

لدي 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 الكامل.


أستخدم كلمة "autolink" في "تسطير تلقائي" للنص ، ولكن قمت للتو بإنشاء "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).

هذا ما كان يعمل بالنسبة لي. حظا طيبا وفقك الله.


أسهل ما عمل بالنسبة لي هو استخدام 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);

وسوف يكشف تلقائيا عناوين المواقع على شبكة الإنترنت من النص في طريقة العرض النصية.


أنا أستخدم فقط 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());
     }
    

هذا هو! ونعم ، فإن وجود خيارات مثل "الرابط التلقائي" و "الروابط القابلة للنقر" تعمل على الروابط الواضحة فقط (غير ملفوفة في علامات html) مضللة للغاية بالنسبة لي أيضًا ...


إضافة CDATA إلى مورد السلسلة الخاصة بك

Strings.xml

<string name="txtCredits"><![CDATA[<a href=\"http://www.google.com\">Google</a>]]></string>

استخدم الرمز أدناه:

String html = "<a href=\"http://yourdomain.com\">Your Domain Name</a>"
TextView textview = (TextView) findViewById(R.id.your_textview_id);
textview.setMovementMethod(LinkMovementMethod.getInstance());
textview.setText(Html.fromHtml(html));

اعتدت هذا ببساطة

Linkify.addLinks(TextView, Linkify.ALL);

يجعل الروابط قابلة للنقر here


الإجابة المقبولة صحيحة ، ولكن سيعني ذلك أن أرقام الهواتف والخرائط وعناوين البريد الإلكتروني والروابط العادية مثل http://google.com بدون علامات href لن تكون قابلة للنقر بعد ذلك حيث لا يمكنك جعل autolink في 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());

وينبغي ألا يكون android:autolink . ليست هناك حاجة إلى 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()); في الرمز الخاص بك وتأكد من عدم وجود android:autoLink="web" في تخطيط XML إذا كنت تريد أن تكون كل الروابط قابلة للنقر.


تأكد من عدم استخدام setAutoLinkMask(Linkify.ALL) عند استخدام setMovementMethod(LinkMovementMethod.getInstance()) و Html.fromHTML() على ارتباطات HTML منسقة بشكل صحيح (على سبيل المثال ، <a href="http://www.google.com/">Google</a> ).


ريتشارد ، في المرة القادمة ، يجب عليك إضافة هذا الرمز تحت TextView في XML تخطيط بدلا من ذلك.

android:autoLink="all"

يجب أن يكون هذا مثل هذا.

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

لا تحتاج إلى استخدام هذا الرمز ( t2.setMovementMethod(LinkMovementMethod.getInstance()); ) لجعل الارتباط قابل للنقر.

أيضًا ، إليك الحقيقة: طالما أنشأت الرابط التلقائي والروابطانقر قابل للتطبيق ، لا تنس إضافة هذا في ملف String.xml حتى يعمل الرابط القابل للنقر.

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

سبب وجود المشكلة هو أنه يحاول فقط مطابقة العناوين "المجردة". أشياء مثل "www.google.com" أو " http://www.google.com ".

يجب أن يعمل النص الخاص بك من خلال Html.fromHtml() . عليك أن تفعل ذلك بشكل برمجي ، لكنه يعمل.


فقط ما تحتاجه لإضافة هذا في عرض النص في xml

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

كان شفرتي كالتالي:

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

كان رمز جافا الخاص بي مثل هذا:

/*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 (معاينة)


لقد لاحظت استخدام android:autoLink="web"

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

عملت "موافق" لعناوين URL ولكن بما أن لدي عنوان بريد إلكتروني ورقم هاتف أردت الارتباط به أيضًا ، فقد انتهى بي الأمر باستخدام هذا الخط android:autoLink="all" like this

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

بعد ذلك الوقت، سيتم إغلاق هذا السؤال.


لم يعمل الهاتف Autolink بالنسبة لي. عملت التالية مثل السحر ،

TextView tv = (TextView) findViewById(R.id.emergencynos);
String html2="<br><br>Fire - <b><a href=tel:997>997</a> </b></br></br>";        
tv.append(Html.fromHtml(html2));
tv.setMovementMethod(LinkMovementMethod.getInstance());

نظرًا لأن databinding أمر مرحب به ، فأنا أريد مشاركة الحل الخاص بي من أجل ربط TextViews الذي يدعم علامات html مع روابط قابلة للنقر.

لتجنب استرداد كل مشاهدة نصية ومنحها دعم html باستخدام From.html قمنا بتوسيع TextView ووضع المنطق في setText()

public class HtmlTextView extends TextView {

    public HtmlTextView(Context context) {
        super(context);
    }

    public HtmlTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public HtmlTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        super.setText(Html.fromHtml(text.toString()), type);
        this.setMovementMethod(LinkMovementMethod.getInstance());
    }
}

لقد صنعت gist الذي يُظهر أيضًا مثال للكيان وعرضًا لاستخدامه.


هذه هي الطريقة التي تمكنت من حل الروابط القابلة للنقر عليها والمرئية في 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>"));
    }

يجب أن يعمل ما يلي مع أي شخص يبحث عن مزيج من النص والارتباط التشعبي ضمن تطبيق 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" باستخدام هذا المنهج.

آمل أن تجد هذا مفيدًا.


آمل أن يكون هذا سيساعدك؛

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