Bir TextView'i tüm harflerini büyük olacak şekilde biçimlendirmenin bir yolu var mı?


239

Ben TextViewTÜM SERMAYE HARFLERİNDE ne olursa olsun metin yapacak bir xml özniteliği veya stil atamak istiyorum .

Öznitelikler android:inputType="textCapCharacters"ve android:capitalize="characters"hiçbir şey yapmazlar ve kullanıcı tarafından girilen metinler için görünürler TextView.

Stili içerikten ayırabilmem için bunu yapmak istiyorum. Bunu programlı olarak yapabileceğimi biliyorum ama yine stil ve kod dışında stil tutmak istiyorum.


1
ne inputType = "textCapCharacters", textAllCaps = "true" tanıdık ^ ^ içinde çalışır. TextWatcher'ı EditText'e tüm kelimeleri yazdım
murt

Yanıtlar:


359

Bu oldukça makul bir istek olsa da, şu anda yapamam gibi görünüyor. Ne Toplam Başarısızlık. lol

Güncelleme

Artık tüm büyük harfleri zorlamak için textAllCaps kullanabilirsiniz .


14
textview özellikleri kesinlikle eksik. öznitelikler klasöründen de bir ttf atamak güzel olurdu!
Nathan Schwermann

8
Bağlantılı sorunun cevabından biri 'android: textAllCaps = "true" önerisini veriyor Bu benim için çalıştı.
blaffie

@blaffie Güncelleme için teşekkürler. Ben android: textAllCaps = "true" düzgün çalışıp çalışmadığını kontrol edeceğim.
Terrance

1
Bunu "textAllCaps" özniteliğini, dolayısıyla aşağı oyu kullanarak yapabilirsiniz.
JaydeepW

1
Görünüşe textAllCapsnedenleri belirttiğiniz takdirde çökmesine app android:fontFamilyiçinde themes.xml.
Alaa M.

142

Android: TextAllCaps hakkında ne ?


8
@ larham1 Bu bir xml özniteliğidir, bu yüzden başka nasıl kullanılabileceğini göremiyorum. Çalışmıyorsa Google'a bildirin. SetAllCaps (boolean) gibi API seviye 14 ile sınırlı olduğunu varsayalım.
Murphy

1
Bunu yeni test ettim ve çalışıyor. Dış stil
dosyam var

1
@Murphy evet, bu bir sürüm oluşturma sorunudur. SetAllCaps () için SDK 14 ve üstü; xml eklendiğinde net değil, ama SDK 14 de varsayalım.
larham1

Bu garip, textAllCaps basit bir test projesinde çalışır, ancak görünüm ArrayAdapter.getView () içinde oluşturulduğunda, çalışmaz. Her şey işe yarar: background, textStyle, vs., ancak textAllCaps çalışmaz :(
Y2i

1
@JawadLeWywadi, API 14'ten önce bu xml niteliğini kullanamazsınız. Java kodunda manuel olarak yapmanız gerekir.
Murphy

63

Eski API'leri (14'ten az) destekleyen Android Uygulamalarında AppCompat kullanaraktextAllCaps

CompatTextView adlı AppCompat ile birlikte gelen bir UI widget'ı var, textAllCaps için destek ekleyen bir Özel TextView uzantısıdır

Daha yeni android API> 14 için şunları kullanabilirsiniz:

android:textAllCaps="true"

Basit bir örnek:

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

Kaynak: developer.android

Güncelleme:

Durum böyle olunca CompatTextView, en son appcompat-v7 kütüphanesinde AppCompatTextView ile değiştirildi ~ Eugen Pechanec


Android.support.v7.internal içinde dahili fark ettiniz mi? Dahili olduğu gibi destek kitaplığının sonraki sürümünde artık bulunmayabilir mi?
Emanuel Moecklin

1
Bu harika! @EmanuelMoecklin Bir kez projenizde var sihirli bir şekilde çalıştırmak için olmaz.
Eugen Pechanec

@eugen Tabii ki Google hiçbir zaman faydalı bir şey eklemediğinden destek kitaplığını en son sürüme güncellemezsiniz, değil mi?
Emanuel Moecklin

@EmanuelMoecklin Aslında sık sık çok çabuk güncelleme benim kod kırar: D Tamamen dahili kaynakları kullanarak dikkatli olması gerektiğini kabul ediyorum AMA ben sadece AppCompat-v7 kaynağında bir göz attım ve CompatTextViewkullanılan ScrollingTabCointainerViewmakinenin kullanıldığı ToolbarWidgetWrapperoldukça yeni sesler, hangi ve adı "v7" adını tuttuğu sürece, bu benim için yeterince iyi bir garanti CompatTextViewolduğu yerde kalacak.
Eugen Pechanec

2
@EmanuelMoecklin Bunun gibi , en son appcompat-v7 kütüphanesinde CompatTextViewyerini aldı AppCompatTextView. Çok haklıydın.
Eugen Pechanec

30

TextAllCaps özniteliğine sahip stillerle ( <item name="android:textAllCaps">true</item>) veya her XML mizanpaj dosyasında yapamamanız gerçekten çok hayal kırıklığı yaratıyor ve bunu yapmanın tek yolu, aslında her dizede String.toUpperCase () kullanmaktır. bir textViewXXX.setText (dizgi).

Benim durumumda, kodumun her yerinde theString.toUpperCase () olmasını istemiyordum, ancak bunu yapmak için merkezi bir yere sahip olmak istemiyordum çünkü bazı Faaliyetlerim vardı ve TextViews ile her zaman büyük harf kullanılması gereken öğeler düzenlerini listeliyordu (a başlık) ve diğer değil ... yani ... bazı insanlar bir overkill olduğunu düşünebilir, ancak android.widget.TextView genişleten kendi CapitalizedTextView sınıfımı oluşturdum ve anında metnin büyük harfini kullanan setText yöntemini geçersiz kıldım.

En azından, tasarım değişirse veya büyük harfli metni gelecekteki sürümlerde kaldırmam gerekirse, yalnızca düzen dosyalarındaki normal TextView'e geçmem gerekir.

Şimdi, bunu yaptığımı göz önünde bulundurun çünkü Uygulama Tasarımcısı aslında bu metni (başlıkları) orijinal içerik büyük harf kullanımı ne olursa olsun tüm CAPS'de istiyordu ve ayrıca büyük harflerin gerçek içerikle geldiği diğer normal TextView'lerim vardı .

Bu sınıf:

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

}

Ve ne zaman kullanmanız gerekiyorsa, XML düzenindeki tüm paketlerle beyan edin:

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

Bazı bir TextView metin stil için doğru yolu bir SpannableString kullanmak olduğunu iddia edecektir, ama daha büyük bir overkill olacağını düşünüyorum, TextView daha başka bir sınıf somutlaştırmak çünkü daha fazla kaynak tüketen söz değil.


9

Ben de TextViewmetnin büyük harf yapma kolları olan bir alt sınıf yarattım aslında RacZo ile benzer bir çözüm buldum .

Fark, setText()yöntemlerden birini geçersiz kılmak yerine TextView, API 14+ üzerinde gerçekte ne yaptığına benzer bir yaklaşım kullandığımdır (benim görüşüme göre daha temiz bir çözümdür).

Kaynağa bakarsanız , aşağıdakilerin uygulanmasını görürsünüz setAllCaps():

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

AllCapsTransformationMethodSınıf (şu anda) kamu değil, ama yine de, kaynak da kullanılabilir . Bu sınıf biraz basitleştirdim ( setLengthChangesAllowed()yöntemi kaldırıldı ), bu yüzden tam çözüm şudur:

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

Mobil tuş takımı ayarında izin var gibi görünüyor, bu yüzden bunu yapmanın en kolay yolu:

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

umarım bu işe yarar


1

PixlUI projesi, ButtonA, EditText AutoCompleteEditText Checkbox RadioButton ve diğer birçok metin görünümünde veya metin görünümünün alt sınıfında textAllCaps'i kullanmanıza izin verir.

Metin kaynaklarınızı android kaynağından ziyade pixlui sürümünü kullanarak oluşturmanız gerekir, yani bunu yapmanız gerekir:

<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, varlıklar klasörünüze koyduğunuz özel bir yazı tipi / yazı tipi ayarlamanıza da olanak tanır.

Gradle kullanan ve biri orijinal proje gibi satır içi yerine stilleri gelen textAllCaps yanı sıra stilleri belirtmek için izin verir PixlUI çerçeve Gradle çatal üzerinde çalışıyorum .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.