มีวิธีกำหนด TextView ให้เป็นตัวพิมพ์ใหญ่ทั้งหมดหรือไม่?


239

ฉันต้องการที่จะสามารถกำหนดแอตทริบิวต์ xml หรือสไตล์ให้กับสิ่งTextViewที่จะทำให้ข้อความใด ๆ ที่มีอยู่ในตัวพิมพ์ใหญ่ทั้งหมด

คุณลักษณะandroid:inputType="textCapCharacters"และทำอะไรและมีลักษณะเหมือนพวกเขาเป็นผู้ใช้ข้อความที่ข้าพเจ้าได้ป้อนไม่android:capitalize="characters"TextView

ฉันต้องการทำสิ่งนี้เพื่อให้ฉันสามารถแยกสไตล์จากเนื้อหา ฉันรู้ว่าฉันสามารถทำสิ่งนี้ได้โดยทางโปรแกรม แต่อีกครั้งฉันต้องการที่จะรักษาสไตล์และเนื้อหา


1
ไม่ใช่ inputType = "textCapCharacters", textAllCaps = "true" ใช้ได้กับ smasung famili ^^ ฉันได้เพิ่ม TextWatcher ไปที่ EditText ของฉันซึ่งปิดทุกคำ
— เมื่อ

คำตอบ:


359

ฉันว่ามันเป็นคำขอที่สมเหตุสมผล แต่ดูเหมือนว่าคุณไม่สามารถทำได้ในเวลานี้ อะไรคือความล้มเหลวทั้งหมด ฮ่า ๆ

ปรับปรุง

ตอนนี้คุณสามารถใช้ textAllCaps เพื่อบังคับให้พิมพ์ใหญ่ทั้งหมด


14
แอตทริบิวต์ textview ขาดหายไปอย่างแน่นอน จะดีที่จะกำหนด ttf จากโฟลเดอร์คุณลักษณะเช่นกัน!
— Nathan Schwermann

8
หนึ่งในคำตอบของคำถามที่เชื่อมโยงแนะนำ 'android: textAllCaps = "true"' สิ่งนี้ใช้ได้สำหรับฉัน
— blaffie

@blaffie ขอบคุณสำหรับการอัปเดต ฉันจะตรวจสอบดูว่า Android: textAllCaps = "true" ทำงานถูกต้องหรือไม่
— Terrance

1
คุณสามารถทำได้โดยใช้แอตทริบิวต์ "textAllCaps" ดังนั้น downvote
— JaydeepW

1
ดูเหมือนว่าtextAllCapsสาเหตุ app ที่จะผิดพลาดถ้าคุณระบุไว้ในandroid:fontFamily themes.xml
— Alaa M.

142

สิ่งที่เกี่ยวกับหุ่นยนต์: textAllCaps ?


8
@ larham1 เป็นแอตทริบิวต์ xml ดังนั้นฉันจึงไม่เห็นว่าจะสามารถใช้งานได้อีก ถ้าไม่รายงานให้ Google ทราบ ฉันคิดว่ามัน จำกัด ระดับ API 14 เช่น setAllCaps (บูลีน)
— เมอร์ฟี

1
ฉันเพิ่งทดสอบและใช้งานได้ ฉันมีไฟล์สไตล์ภายนอก
— 7heViking

1
@Murphy ใช่นี่เป็นปัญหาเกี่ยวกับเวอร์ชัน SDK 14 ขึ้นไปสำหรับ setAllCaps (); ไม่ชัดเจนเมื่อเพิ่ม xml แต่ฉันคิดว่า SDK 14 ด้วย
— larham1

สิ่งนี้แปลก textAllCaps ทำงานในโครงการทดสอบอย่างง่าย แต่เมื่อมุมมองถูกสร้างขึ้นภายใน ArrayAdapter.getView () มันจะไม่ทำงาน ทุกอย่างใช้งานได้: พื้นหลังข้อความสไตล์ ฯลฯ แต่ textAllCaps ไม่ได้ :(
— Y2i

1
@JawadLeWywadi คุณไม่สามารถใช้คุณลักษณะ xml นี้ก่อน API 14 คุณต้องทำด้วยตนเองในรหัส Java
— เมอร์ฟี

63

โดยใช้AppCompat textAllCapsใน Android Apps ที่รองรับ API เก่ากว่า (น้อยกว่า 14)

มีวิดเจ็ต UI หนึ่งรายการที่มาพร้อมกับ AppCompat ชื่อ CompatTextView เป็นส่วนขยาย TextView แบบกำหนดเองที่เพิ่มการสนับสนุนสำหรับ textAllCaps

สำหรับ Android API ที่ใหม่กว่า> 14 คุณสามารถใช้:

android:textAllCaps="true"

ตัวอย่างง่ายๆ:

<android.support.v7.internal.widget.CompatTextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:textAllCaps="true"/>

ที่มา: developer.android

ปรับปรุง:

เมื่อมันเกิดขึ้น CompatTextView ถูกแทนที่ด้วย AppCompatTextView ในappcompat-v7 library ล่าสุด ~ Eugen Pechanec


คุณสังเกตเห็นภายในใน android.support.v7.internal หรือไม่? Internal in in อาจไม่มีเพิ่มเติมในไลบรารีการสนับสนุนรุ่นถัดไปหรือไม่
— Emanuel Moecklin

1
นี่มันเจ๋งมาก! @EmanuelMoecklin เมื่อคุณมีมันในโปรเจ็กต์ของคุณมันจะไม่วิ่งไปอย่างน่าอัศจรรย์
— Eugen Pechanec

@eugen แน่นอนว่าคุณไม่เคยอัปเดตไลบรารีสนับสนุนเป็นเวอร์ชันล่าสุดเนื่องจาก Google ไม่เคยเพิ่มสิ่งที่มีประโยชน์ใช่มั้ย
— Emanuel Moecklin

@EmanuelMoecklin จริง ๆ แล้วฉันมักจะอัปเดตอย่างรวดเร็วมันทำลายรหัสของฉัน: DI เห็นด้วยอย่างยิ่งว่าคุณควรระวังการใช้ทรัพยากรภายในแต่ฉันเพิ่งเหลียวมองไปที่แหล่ง appcompat-v7 และCompatTextViewใช้ในScrollingTabCointainerViewที่ToolbarWidgetWrapperซึ่งค่อนข้างใหม่และ ตราบใดที่ชื่อยังคงเป็น "v7" ในชื่อของมันนี่เป็นการรับประกันที่ดีพอสำหรับฉันว่าCompatTextViewจะยังคงอยู่ที่เดิม
— Eugen Pechanec

2
@EmanuelMoecklin มันเกิดขึ้นCompatTextViewได้ถูกแทนที่ด้วยAppCompatTextViewใน appcompat-v7 ไลบรารี่ล่าสุด คุณค่อนข้างถูกต้อง
— Eugen Pechanec

30

เป็นเรื่องที่น่าผิดหวังอย่างยิ่งที่คุณไม่สามารถทำได้ด้วยสไตล์ ( <item name="android:textAllCaps">true</item>) หรือในแต่ละไฟล์เลย์เอาต์ XML ที่มี แอตทริบิวต์textAllCapsและวิธีเดียวที่จะทำได้คือการใช้จริงString.toUpperCase () ในแต่ละสตริงเมื่อคุณทำ textViewXXX.setText (theString)

ในกรณีของฉันฉันไม่ต้องการให้ theString.toUpperCase () ทุกที่ในรหัสของฉัน แต่จะมีสถานที่รวมศูนย์ที่จะทำเพราะฉันมีกิจกรรมบางอย่างและรายการรูปแบบรายการที่มี TextViews ที่ควรจะเป็นตัวพิมพ์ใหญ่ตลอดเวลา ( ชื่อเรื่อง) และอื่น ๆ ที่ไม่ได้ ... ดังนั้น ... บางคนอาจคิดว่าเป็น overkill แต่ฉันสร้างคลาส CapitalizedTextView ของฉันเองที่ขยายandroid.widget.TextViewและขยายวิธี setText ให้เป็นตัวพิมพ์ใหญ่

อย่างน้อยถ้าการออกแบบเปลี่ยนแปลงหรือฉันต้องการลบข้อความที่เป็นตัวพิมพ์ใหญ่ในเวอร์ชันอนาคตฉันแค่ต้องเปลี่ยนเป็น TextView ปกติในไฟล์เลย์เอาต์

ตอนนี้ให้พิจารณาด้วยว่าฉันทำสิ่งนี้เพราะผู้ออกแบบแอปต้องการข้อความนี้ (ชื่อเรื่อง) ใน CAPS ทั่วแอพไม่ว่าจะใช้ตัวพิมพ์ใหญ่ในเนื้อหาต้นฉบับและฉันก็มี TextViews ปกติอื่น ๆ ที่การใช้อักษรตัวพิมพ์ใหญ่มาพร้อมกับเนื้อหาจริง .

นี่คือคลาส:

package com.realactionsoft.android.widget;

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.ViewTreeObserver; 
import android.widget.TextView;


public class CapitalizedTextView extends TextView implements ViewTreeObserver.OnPreDrawListener {

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

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

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

    @Override
    public void setText(CharSequence text, BufferType type) {
        super.setText(text.toString().toUpperCase(), type);
    }

}

และเมื่อใดก็ตามที่คุณต้องการใช้งานเพียงแค่ประกาศด้วยแพ็คเกจทั้งหมดในโครงร่าง XML:

<com.realactionsoft.android.widget.CapitalizedTextView 
        android:id="@+id/text_view_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

บางคนจะโต้แย้งว่าวิธีที่ถูกต้องในการจัดสไตล์ข้อความบน TextView คือการใช้SpannableStringแต่ฉันคิดว่ามันจะยิ่งเกินความเป็นจริงไม่พูดถึงการใช้ทรัพยากรมากขึ้นเพราะคุณจะทำให้คลาสอื่นเร็วกว่า TextView


9

ฉันคิดวิธีแก้ปัญหาที่คล้ายกับ RacZo ในความจริงที่ว่าฉันได้สร้างคลาสย่อยTextViewที่จัดการทำข้อความตัวพิมพ์ใหญ่

ความแตกต่างคือแทนที่จะเอาชนะsetText()วิธีใดวิธีหนึ่งฉันได้ใช้วิธีที่คล้ายกันกับสิ่งที่TextViewจริง ๆ ทำบน API 14+ (ซึ่งอยู่ในมุมมองของฉันในการแก้ปัญหาที่ดูสะอาดกว่า)

หากคุณค้นหาแหล่งที่มาคุณจะเห็นการใช้งานของsetAllCaps():

public void setAllCaps(boolean allCaps) {
    if (allCaps) {
        setTransformationMethod(new AllCapsTransformationMethod(getContext()));
    } else {
        setTransformationMethod(null);
    }
}

AllCapsTransformationMethodชั้นไม่ได้ (ในปัจจุบัน) ที่สาธารณะ แต่ยังแหล่งที่มานอกจากนี้ยังสามารถใช้ได้ ฉันทำให้คลาสนั้นง่ายขึ้นเล็กน้อย (ลบsetLengthChangesAllowed()เมธอด) ดังนั้นวิธีแก้ปัญหาที่สมบูรณ์คือ:

public class UpperCaseTextView extends TextView {

    public UpperCaseTextView(Context context) {
        super(context);
        setTransformationMethod(upperCaseTransformation);
    }

    public UpperCaseTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setTransformationMethod(upperCaseTransformation);
    }

    public UpperCaseTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setTransformationMethod(upperCaseTransformation);
    }

    private final TransformationMethod upperCaseTransformation =
            new TransformationMethod() {

        private final Locale locale = getResources().getConfiguration().locale;

        @Override
        public CharSequence getTransformation(CharSequence source, View view) {
            return source != null ? source.toString().toUpperCase(locale) : null;
        }

        @Override
        public void onFocusChanged(View view, CharSequence sourceText,
                boolean focused, int direction, Rect previouslyFocusedRect) {}
    };
}

2

ดูเหมือนว่ามีการอนุญาตในการตั้งค่าปุ่มกดมือถือดังนั้นวิธีที่ง่ายที่สุดคือ:

editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});

หวังว่ามันจะใช้ได้


1

PixlUIโครงการช่วยให้คุณใช้ textAllCaps ใน textview หรือ subclass ของ textview ใด ๆ รวมถึง: ปุ่ม, EditText AutoCompleteEditText ช่องทำเครื่องหมาย RadioButton และอื่น ๆ อีกมากมาย

คุณจะต้องสร้างตัวอย่างข้อความของคุณโดยใช้เวอร์ชัน pixlui แทนที่จะเป็นข้อความจากแหล่ง android ซึ่งหมายความว่าคุณต้องทำสิ่งนี้:

<com.neopixl.pixlui.components.textview.TextView

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        pixlui:textAllCaps="true" />

PixlUI ยังให้คุณตั้งค่าแบบอักษร / แบบอักษรที่กำหนดเองซึ่งคุณใส่ไว้ในโฟลเดอร์ทรัพย์สิน

ฉันกำลังทำงานบน Gradle fork ของกรอบ PixlUIที่ใช้การไล่ระดับสีและอนุญาตให้หนึ่งเพื่อระบุ textAllCaps เช่นเดียวกับตัวอักษรจากรูปแบบมากกว่าที่พวกเขาต้องการแบบอินไลน์เช่นโครงการเดิมไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.