سؤال

كيف يمكنني تحديد تحتها خط نص في تخطيط Android xml ملف؟

هل كانت مفيدة؟

المحلول

يمكن تحقيقه إذا كنت تستخدم المورد سلسلة ملف XML ، الذي يدعم علامات HTML مثل <b></b>, <i></i> و <u></u>.

<resources>
    <string name="your_string_here">This is an <u>underline</u>.</string>
</resources>

إذا كنت ترغب في التأكيد على شيء ما من استخدام الكود:

TextView textView = (TextView) view.findViewById(R.id.textview);
SpannableString content = new SpannableString("Content");
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
textView.setText(content);

نصائح أخرى

يمكنك المحاولة

textview.setPaintFlags(textview.getPaintFlags() |   Paint.UNDERLINE_TEXT_FLAG);

الجواب "المقبول" أعلاه ليس العمل (عندما تحاول استخدام السلسلة مثل textView.setText(Html.fromHtml(String.format(getString(...), ...))).

كما ذكر في الوثائق يجب الهروب من (HTML Entity المشفر) الفتحة الفتحة من العلامات الداخلية مع &lt;, ، على سبيل المثال ، يجب أن تبدو النتيجة:

<resource>
    <string name="your_string_here">This is an &lt;u>underline&lt;/u>.</string>
</resources>

ثم في الكود الخاص بك يمكنك تعيين النص مع:

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(String.format(getString(R.string.my_string), ...)));

محتوى ملف STRINGS.XML:

<resource>
     <string name="my_text">This is an <u>underline</u>.</string> 
</resources> 

Skyout XML File Shold استخدم مورد السلسلة أعلاه مع خصائص TextView أدناه ، كما هو موضح أدناه:

<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:text="@string/my_text"

    android:selectAllOnFocus="false"
    android:linksClickable="false"
    android:autoLink="all"
    />

بالنسبة للزر و TextView ، هذه هي أسهل طريقة:

زر:

Button button = (Button) findViewById(R.id.btton1);
button.setPaintFlags(button.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

عرض النص:

TextView textView = (TextView) findViewById(R.id.textview1);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

حل سطر واحد

myTextView.setText(Html.fromHtml("<p><u>I am Underlined text</u></p>"));

لقد تأخرت قليلاً ولكن قد يكون مفيدًا لشخص ما.

يصف رومان جاي أحدث نهج للرسم. متوسط مع رمز المصدر المتاح على جيثب. هذا التطبيق يعرض تطبيقين محتملين:

  • التنفيذ القائم على المسار يتطلب مستوى API 19
  • التنفيذ القائم على المنطقة يتطلب مستوى API 1

enter image description here

في كوتلين وظيفة التمديد يمكن استعماله. لا يمكن استخدام هذا إلا من الكود ، وليس XML.

fun TextView.underline() {
    paintFlags = paintFlags or Paint.UNDERLINE_TEXT_FLAG
}

الاستخدام:

 tv_change_number.underline()
 tv_resend_otp.underline()

أعلم أن هذا إجابة متأخرة ، لكنني توصلت إلى حل يعمل بشكل جيد ... لقد أخذت الإجابة من أنتوني فورلوني لتأكيد النص في الكود وأنشأت فئة فرعية من TextView التي تتعامل مع ذلك من أجلك. ثم يمكنك فقط استخدام الفئة الفرعية في XML كلما أردت أن يكون لديك نص محدد.

ها هو الفصل الذي أنشأته:

import android.content.Context;
import android.text.Editable;
import android.text.SpannableString;
import android.text.TextWatcher;
import android.text.style.UnderlineSpan;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * Created with IntelliJ IDEA.
 * User: Justin
 * Date: 9/11/13
 * Time: 1:10 AM
 */
public class UnderlineTextView extends TextView
{
    private boolean m_modifyingText = false;

    public UnderlineTextView(Context context)
    {
        super(context);
        init();
    }

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

    public UnderlineTextView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        init();
    }

    private void init()
    {
        addTextChangedListener(new TextWatcher()
        {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after)
            {
                //Do nothing here... we don't care
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count)
            {
                //Do nothing here... we don't care
            }

            @Override
            public void afterTextChanged(Editable s)
            {
                if (m_modifyingText)
                    return;

                underlineText();
            }
        });

        underlineText();
    }

    private void underlineText()
    {
        if (m_modifyingText)
            return;

        m_modifyingText = true;

        SpannableString content = new SpannableString(getText());
        content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
        setText(content);

        m_modifyingText = false;
    }
}

الآن ... كلما أردت إنشاء TextView تحت خط في XML ، يمكنك فقط القيام بما يلي:

<com.your.package.name.UnderlineTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:gravity="center"
    android:text="This text is underlined"
    android:textColor="@color/blue_light"
    android:textSize="12sp"
    android:textStyle="italic"/>

لقد أضفت خيارات إضافية في مقتطف XML هذا لإظهار أن المثال الخاص بي يعمل مع تغيير لون النص وحجمه وأسلوبه ...

أتمنى أن يساعدك هذا!

تحقق من نمط زر النقر فوق النقر:

<TextView
    android:id="@+id/btn_some_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/btn_add_contact"
    android:textAllCaps="false"
    android:textColor="#57a0d4"
    style="@style/Widget.AppCompat.Button.Borderless.Colored" />

strings.xml:

<string name="btn_add_contact"><u>Add new contact</u></string>

نتيجة:

enter image description here

طريقة أنظف بدلا من
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);الطريقة هي الاستخدامtextView.getPaint().setUnderlineText(true);

وإذا كنت بحاجة إلى إيقاف تشغيل هذا العرض لاحقًا ، كما هو الحال في عرض إعادة استخدام في عرض Recyclerview ، textView.getPaint().setUnderlineText(false);

فقط استخدم السمة في ملف المورد السلسلة على سبيل المثال

<string name="example"><u>Example</u></string>

لقد استخدمت هذا XML Drawable لإنشاء الحدود السفلية وتطبيق السحب كخلفية على TextView

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle" >
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>

    <item android:top="-5dp" android:right="-5dp" android:left="-5dp">
        <shape>
            <solid android:color="@android:color/transparent" />
            <stroke
                    android:width="1.5dp"
                    android:color="@color/pure_white" />
        </shape>
    </item>
</layer-list>

حل بسيط ومرن في XML:

<View
  android:layout_width="match_parent"
  android:layout_height="3sp"
  android:layout_alignLeft="@+id/your_text_view_need_underline"
  android:layout_alignRight="@+id/your_text_view_need_underline"
  android:layout_below="@+id/your_text_view_need_underline"
  android:background="@color/your_color" />

لعنة ، من السهل الاستخدام

TextView tv = findViewById(R.id.tv);
tv.setText("some text");

تسطير TextView بأكمله

setUnderLineText(tv, tv.getText().toString());

يؤكد جزءًا من TextView

setUnderLineText(tv, "some");

أيضا دعم TextView Childs مثل EditText ، زر ، مربع الاختيار

public void setUnderLineText(TextView tv, String textToUnderLine) {
        String tvt = tv.getText().toString();
        int ofe = tvt.indexOf(textToUnderLine, 0);

        UnderlineSpan underlineSpan = new UnderlineSpan();
        SpannableString wordToSpan = new SpannableString(tv.getText());
        for (int ofs = 0; ofs < tvt.length() && ofe != -1; ofs = ofe + 1) {
            ofe = tvt.indexOf(textToUnderLine, ofs);
            if (ofe == -1)
                break;
            else {
                wordToSpan.setSpan(underlineSpan, ofe, ofe + textToUnderLine.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                tv.setText(wordToSpan, TextView.BufferType.SPANNABLE);
            }
        }
    }

تحقق من إجابتي هنا لتقديم نص مستحيل للنقر أو تسطير أجزاء متعددة من TextView

حل آخر هو إنشاء طريقة عرض مخصصة تمديد TextView كما هو موضح أدناه

public class UnderLineTextView extends TextView {

    public UnderLineTextView(Context context) {
        super(context);
        this.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
    }

    public UnderLineTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
    }

}

وأضف فقط إلى XML كما هو موضح أدناه

<yourpackage.UnderLineTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="underline text"
 />

جرب هذا الرمز

في XML

<resource>
 <string name="my_text"><![CDATA[This is an <u>underline</u>]]></string> 
</resources> 

في الكود

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(getString(R.string.my_text)));

حظا طيبا وفقك الله!

أنا أبسط صموئيلإجابة:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--https://stackoverflow.com/a/40706098/4726718-->
    <item
        android:left="-5dp"
        android:right="-5dp"
        android:top="-5dp">
        <shape>
            <stroke
                android:width="1.5dp"
                android:color="@color/colorAccent" />
        </shape>
    </item>
</layer-list>
  1. انتقل إلى ملف موارد strings.xml
  2. أضف سلسلة في ملف المورد مع علامة HTML تسطير عند الضرورة.

STRINGS.XML HTML عينة

  1. اتصل بمعرف مورد السلسلة في رمز Java الخاص بك على النحو التالي:
sampleTextView.setText(R.string.sample_string);
  1. يجب أن يكون للإخراج كلمة "stackoverflow".

علاوة على ذلك ، لن يقوم الرمز التالي بطباعة السطحي:

String sampleString = getString(R.string.sample_string);
sampleTextView.setText(sampleString);

بدلاً من ذلك ، استخدم الكود التالي للاحتفاظ بتنسيق النص الغني:

CharSequence sampleString = getText(R.string.sample_string);
sampleTextView.setText(sampleString);

"يمكنك استخدام إما GetString (int) أو getText (int) لاسترداد سلسلة. يحتفظ GetText (int) بأي تصميم نص غني مطبق على السلسلة." وثائق Android.

الرجوع إلى الوثائق: https://developer.android.com/guide/topics/resources/string-resource.html

آمل أن يساعد هذا.

الجواب الذي تم التصويت عليه هو صحيح وأبسط. ومع ذلك ، في بعض الأحيان قد تجد أنه لا يعمل مع بعض الخطوط ، ولكن العمل لصالح الآخرين. (ما المشكلة التي صادفتها للتو عند التعامل مع الصينية.)

الحل هو لا تستخدم "WRAP_CONTENT" فقط لمشاهدة TextView الخاصة بك ، لأن لا توجد مساحة إضافية لرسم الخط. يمكنك ضبط ارتفاع ثابت على TextView الخاص بك ، أو استخدام Android: Paddingvertical مع wrap_content.

HtmlCompat.fromHtml(
                    String.format(context.getString(R.string.set_target_with_underline)),
                    HtmlCompat.FROM_HTML_MODE_LEGACY)
<string name="set_target_with_underline">&lt;u>Set Target&lt;u> </string>

لاحظ رمز الهروب في ملف XML

لقد واجهت مشكلة حيث أستخدم خطًا مخصصًا والتطويع الذي تم إنشاؤه باستخدام خدعة ملف الموارد (<u>Underlined text</u>) هل نجحت لكن Android تمكن من تحويل السطحي إلى نوع من الإضراب.

لقد استخدمت هذه الإجابة لرسم حدود أسفل TextView بنفسي: https://stackoverflow.com/a/10732993/664449. من الواضح أن هذا لا يعمل للنص الجزئي الذي تم تسطيره أو نصًا متعدد الطبقات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top