มีวิธีกำหนด 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.