Apakah ada cara untuk mendesain TextView untuk huruf besar semua hurufnya?

239

Saya ingin dapat menetapkan atribut atau gaya xml ke TextViewyang akan membuat teks apa pun di SEMUA SURAT MODAL.

Atribut android:inputType="textCapCharacters"dan android:capitalize="characters"tidak melakukan apa pun dan terlihat seperti itu untuk teks yang dimasukkan pengguna, bukan a TextView.

Saya ingin melakukan ini sehingga saya dapat memisahkan gaya dari konten. Saya tahu saya bisa melakukan ini secara pemrograman tetapi sekali lagi saya ingin menjaga gaya dari konten dan kode.

cottonBallPaws
sumber
1
inputType = "textCapCharacters", textAllCaps = "true" tidak berfungsi di smasung famili ^^. Saya telah menambahkan TextWatcher ke EditText saya yang Caps all all words
murt

Jawaban:

359

Saya pikir itu permintaan yang cukup masuk akal tapi sepertinya Anda tidak bisa melakukannya saat ini. Kegagalan Total. lol

Memperbarui

Anda sekarang dapat menggunakan textAllCaps untuk memaksa semua huruf besar.

Terrance
sumber
14
Atribut textview jelas kurang. akan lebih baik untuk menetapkan ttf dari folder atribut juga!
Nathan Schwermann
8
Salah satu jawaban pada pertanyaan terkait menyarankan 'android: textAllCaps = "true"' Ini bekerja untuk saya.
blaffie
@blaffie Terima kasih atas pembaruannya. Saya akan memeriksa untuk melihat apakah android: textAllCaps = "true" berfungsi dengan baik.
Terrance
1
Anda dapat melakukannya menggunakan atribut "textAllCaps", maka downvote.
JaydeepW
1
Sepertinya textAllCapsmenyebabkan aplikasi mogok jika Anda tentukan android:fontFamilydi themes.xml.
Alaa M.
142

Bagaimana dengan android: textAllCaps ?

Murphy
sumber
8
@ larham1 Ini adalah atribut xml jadi saya tidak melihat bagaimana lagi itu bisa digunakan. Jika tidak berfungsi laporkan ke Google. Saya kira itu terbatas pada API level 14 seperti setAllCaps (boolean).
Murphy
1
Saya baru saja menguji ini dan itu berfungsi. Saya punya file gaya eksternal
7heViking
1
@ Murphy ya, ini adalah masalah versi. SDK 14 ke atas untuk setAllCaps (); tidak jelas kapan xml ditambahkan, tapi saya menganggap SDK 14 juga.
larham1
Ini aneh, textAllCaps bekerja dalam proyek pengujian sederhana, tetapi ketika tampilan dibuat di dalam ArrayAdapter.getView (), itu tidak. Semuanya berfungsi: latar belakang, textStyle, dll. Tetapi textAllCaps tidak :(
Y2i
1
@JawadLeWywadi Anda tidak dapat menggunakan atribut xml ini sebelum API 14. Anda harus melakukannya secara manual dalam kode Java.
Murphy
63

Dengan menggunakan AppCompat textAllCaps di Aplikasi Android yang mendukung API lama (kurang dari 14)

Ada satu widget UI yang dikirimkan dengan AppCompat bernama CompatTextView adalah ekstensi Custom TextView yang menambahkan dukungan untuk textAllCaps

Untuk API Android yang lebih baru> 14 Anda dapat menggunakan:

android:textAllCaps="true"

Contoh sederhana:

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

Sumber: developer.android

Memperbarui:

Seperti yang terjadi CompatTextView digantikan oleh AppCompatTextView di perpustakaan appcompat-v7 terbaru ~ Eugen Pechanec

LOG_TAG
sumber
Apakah Anda memperhatikan internal di android.support.v7.internal? Internal seperti di mungkin tidak ada lagi di versi berikutnya dari perpustakaan dukungan?
Emanuel Moecklin
1
Ini luar biasa! @ EmanuelMoecklin Setelah Anda memilikinya di proyek Anda itu tidak akan berjalan secara ajaib.
Eugen Pechanec
@ Eugen tentu saja Anda tidak pernah memperbarui perpustakaan dukungan ke versi terbaru karena Google tidak pernah menambahkan sesuatu yang berguna, bukan?
Emanuel Moecklin
@ EmanuelMoecklin Sebenarnya saya sering memperbarui begitu cepat sehingga memecahkan kode saya: DI saya sepenuhnya setuju bahwa Anda harus waspada menggunakan sumber daya internal TETAPI saya hanya melihat sekilas sumber appcompat-v7 dan CompatTextViewdigunakan di ScrollingTabCointainerViewmana digunakan ToolbarWidgetWrapper, yang terdengar cukup baru dan selama namanya tetap "v7" dalam namanya, ini adalah jaminan yang cukup baik bagi saya yang CompatTextViewakan tetap di tempatnya.
Eugen Pechanec
2
@EmanuelMoecklin Seperti yang terjadi CompatTextViewdigantikan oleh AppCompatTextViewdi perpustakaan appcompat-v7 terbaru. Anda benar sekali.
Eugen Pechanec
30

Sangat mengecewakan bahwa Anda tidak dapat melakukannya dengan styles ( <item name="android:textAllCaps">true</item>) atau pada setiap file layout XML dengan atribut textAllCaps , dan satu-satunya cara untuk melakukannya adalah dengan menggunakan Strtr.toUpperCase () pada setiap string ketika Anda melakukannya. sebuah textViewXXX.setText (theString).

Dalam kasus saya, saya tidak ingin memiliki Strtr.toUpperCase () di mana-mana dalam kode saya tetapi untuk memiliki tempat yang terpusat untuk melakukannya karena saya memiliki beberapa Kegiatan dan daftar tata letak item dengan TextViews bahwa di mana seharusnya dikapitalisasi sepanjang waktu (a judul) dan lainnya yang tidak ... jadi ... beberapa orang mungkin menganggapnya berlebihan, tapi saya membuat kelas CapitalizedTextView saya sendiri memperluas android.widget.TextView dan mengesampingkan metode setText dengan huruf besar teks dengan cepat.

Paling tidak, jika desain berubah atau saya perlu menghapus teks dengan huruf besar di versi mendatang, saya hanya perlu mengubah ke TextView normal di file tata letak.

Sekarang, pertimbangkan bahwa saya melakukan ini karena Perancang Aplikasi benar-benar menginginkan teks ini (judul) di CAPS di seluruh App, tidak peduli kapitalisasi konten asli, dan juga saya memiliki TextViews normal lainnya di mana kapitalisasi datang dengan konten aktual .

Ini kelasnya:

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);
    }

}

Dan setiap kali Anda perlu menggunakannya, cukup deklarasikan dengan semua paket di tata letak XML:

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

Beberapa orang akan berargumen bahwa cara yang benar untuk mendesain teks pada TextView adalah dengan menggunakan SpannableString , tapi saya pikir itu akan menjadi kerja keras yang lebih besar, belum lagi memakan banyak sumber daya karena Anda akan membuat kelas lain daripada TextView.

Oscar Salguero
sumber
9

Saya telah datang dengan solusi yang mirip dengan RacZo dalam kenyataan bahwa saya juga telah membuat subkelas TextViewyang menangani pembuatan teks huruf besar.

Perbedaannya adalah bahwa alih-alih mengganti salah satu setText()metode, saya telah menggunakan pendekatan serupa dengan apa yang TextViewsebenarnya dilakukan pada API 14+ (yang menurut saya merupakan solusi yang lebih bersih).

Jika Anda melihat ke sumbernya , Anda akan melihat penerapan setAllCaps():

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

The AllCapsTransformationMethodkelas tidak (saat ini) publik, tapi masih, sumber juga tersedia . Saya telah menyederhanakan kelas itu sedikit (menghapus setLengthChangesAllowed()metode), jadi solusi lengkapnya adalah ini:

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) {}
    };
}
Natix
sumber
2

Sepertinya ada izin untuk pengaturan keypad ponsel, jadi cara termudah untuk melakukannya adalah:

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

semoga ini berhasil

Dhiren Hamal
sumber
1

Proyek PixlUI memungkinkan Anda untuk menggunakan textAllCaps di semua tampilan teks atau subkelas tampilan teks termasuk: Tombol, EditText AutoCompleteEditText Checkbox RadioButton dan beberapa lainnya.

Anda perlu membuat tampilan teks menggunakan versi pixlui daripada yang dari sumber android, artinya Anda harus melakukan ini:

<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 juga memungkinkan Anda untuk mengatur jenis huruf / font khusus yang Anda masukkan ke folder aset Anda.

Saya sedang mengerjakan garpu Gradle dari kerangka PixlUI yang menggunakan gradle dan memungkinkan seseorang untuk menentukan textAllCaps serta jenis huruf dari gaya daripada membutuhkannya sesuai dengan proyek aslinya.

Matt Wolfe
sumber