वहाँ एक तरह से अपने सभी अक्षरों को बड़ा करने के लिए एक TextView शैली है?


239

मैं एक xml विशेषता या शैली को असाइन करने में सक्षम होना चाहूंगा जो TextViewकि सभी अक्षरों में जो भी पाठ है वह बना देगा।

विशेषताएँ android:inputType="textCapCharacters"और android:capitalize="characters"कुछ नहीं करते हैं और देखते हैं कि वे उपयोगकर्ता इनपुट किए गए पाठ के लिए हैं, नहीं TextView

मैं ऐसा करना चाहूंगा ताकि मैं शैली को सामग्री से अलग कर सकूं। मुझे पता है कि मैं यह प्रोग्रामिक रूप से कर सकता हूं लेकिन फिर से मैं सामग्री और कोड से शैली रखना चाहता हूं।


1
न inputType = "textCapCharacters", textAllCaps = "true" smasung famili ^ में काम करता है। मैंने अपने EditText में
TextWatcher

जवाबों:


358

हालांकि मैं एक बहुत ही उचित अनुरोध था, लेकिन ऐसा लगता है कि आप इस समय ऐसा नहीं कर सकते। कुल विफलता क्या है। जबरदस्त हंसी

अपडेट करें

अब आप सभी कैप्स को बाध्य करने के लिए textAllCaps का उपयोग कर सकते हैं ।


14
टेक्स्टव्यू विशेषताओं में निश्चित रूप से कमी है। के रूप में अच्छी तरह से विशेषता फ़ोल्डर से एक ttf आवंटित करने के लिए अच्छा होगा!
नाथन श्वरमन

8
जुड़े हुए सवालों के जवाबों में से एक का सुझाव है 'Android: textAllCaps = "true"' इसने मेरे लिए काम किया।
ब्लफी जू

@blaffie अपडेट के लिए धन्यवाद। मैं देखूँगा कि क्या android: textAllCaps = "true" ठीक से काम करता है।
टेरेंस

1
आप "textAllCaps" विशेषता का उपयोग कर सकते हैं, इसलिए डाउनवोट।
JaydeepW

1
की तरह लगता है textAllCapsका कारण बनता है, तो आपके द्वारा निर्दिष्ट दुर्घटना एप्लिकेशन android:fontFamilyमें themes.xml
आला एम।

142

Android के बारे में क्या : textAllCaps ?


8
@ larham1 यह एक xml विशेषता है इसलिए मैं यह नहीं देखता कि इसका उपयोग कैसे किया जा सकता है। यदि काम नहीं कर रहा है तो Google को रिपोर्ट करें। मुझे लगता है कि यह एपीआई स्तर 14 तक सीमित है जैसे कि सेटलैप्स (बूलियन)।
मर्फी

1
मैंने अभी इसका परीक्षण किया है और यह काम कर रहा है। मेरे पास बाहरी शैली की फाइल है
7heViking

1
@ मर्फी हाँ, यह एक संस्करण है। SDK 14 और ऊपर के लिए setAllCaps (); स्पष्ट नहीं है जब xml जोड़ा गया था, लेकिन मुझे एसडीके 14 भी लगता है।
लार्हम 1

यह अजीब है, textAllCaps एक साधारण परीक्षण परियोजना में काम करता है, लेकिन जब व्यू को ArrayAdapter.getView () के अंदर बनाया जाता है, तो यह नहीं होता है। सब कुछ काम करता है: पृष्ठभूमि, पाठ शैली, आदि, लेकिन textAllCaps नहीं करता है :(
Y2i

1
@JawadLeWywadi आप एपीआई 14 से पहले इस xml विशेषता का उपयोग नहीं कर सकते। आपको इसे जावा कोड में मैन्युअल रूप से करने की आवश्यकता है।
मर्फी

63

पुराने APIs textAllCaps (14 से कम) का समर्थन करने वाले Android ऐप्स में AppCompat का उपयोग करके

एक UI विजेट्स हैं जिन्हें कम्पेटटेक्स्ट व्यू नाम के AppCompat के साथ जहाज एक कस्टम टेक्स्ट व्यू एक्सटेंशन है जो 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 पुस्तकालय ~ यूजेन Pechanec


क्या आपने android.support.v7.internal में आंतरिक सूचना दी है? आंतरिक के रूप में समर्थन पुस्तकालय के अगले संस्करण में और अधिक नहीं हो सकता है?
इमानुएल मोएक्लिन

1
यह कमाल का है! @EmanuelMoecklin एक बार जब आप इसे अपने प्रोजेक्ट में लगा लेते हैं तो यह जादुई तरीके से नहीं चल सकता है।
यूजेन पिंचेक

@ निश्चित रूप से आप कभी भी समर्थन पुस्तकालय को नवीनतम संस्करण में अपडेट नहीं करते हैं क्योंकि Google कभी भी उपयोगी, सही कुछ नहीं जोड़ता है?
इमानुएल मोएक्लिन

@EmanuelMoecklin वास्तव में मैं अक्सर इतनी जल्दी अपडेट हो जाता है कि इससे मेरा कोड टूट जाता है: DI पूरी तरह से सहमत हैं कि आपको आंतरिक संसाधनों का उपयोग करने से सावधान रहना चाहिए लेकिन मैंने सिर्फ appcompat-v7 स्रोत पर एक नज़र डाली है और इसमें CompatTextViewउपयोग ScrollingTabCointainerViewकिया जाता है ToolbarWidgetWrapper, जो बहुत नया लगता है और जब तक नाम अपने नाम में "v7" रखता है, यह मेरे लिए एक अच्छी पर्याप्त गारंटी CompatTextViewहै कि यह जहां है वहीं रहने वाला है।
युगेन

2
@EmanuelMoecklin जैसा कि ऐसा होता है CompatTextViewको AppCompatTextViewनवीनतम एप्कोम्पैट- v7 लाइब्रेरी द्वारा बदल दिया गया था । आप काफी सही थे।
यूजेन पिंचेक

30

यह वास्तव में बहुत निराशाजनक है कि आप इसे स्टाइल ( <item name="android:textAllCaps">true</item>) या प्रत्येक XML लेआउट फ़ाइल पर TextAllCaps विशेषता के साथ नहीं कर सकते हैं , और ऐसा करने का एकमात्र तरीका वास्तव में स्ट्रिंग्स का उपयोग कर रहा है। प्रत्येक स्ट्रिंग पर (जब आप करते हैं) एक textViewXXX.setText (स्ट्रिंग)।

मेरे मामले में, मैं अपने कोड में हर जगह theString.toUpperCase () नहीं करना चाहता था, लेकिन ऐसा करने के लिए एक केंद्रीकृत स्थान होना चाहिए क्योंकि मेरे पास TextViews के साथ कुछ गतिविधियाँ और सूचियाँ आइटम थीं, जहाँ हर समय पूंजी होना चाहिए शीर्षक) और अन्य जिन्होंने ऐसा नहीं किया ... इसलिए ... कुछ लोग सोच सकते हैं कि यह एक ओवरकिल है, लेकिन मैंने अपना खुद का CapitalizedTextView वर्ग बनाया है, जो android.widget.TextView का विस्तार करता है और सेटटैक्स्ट विधि को मक्खी पर पाठ को बड़ा करता है।

कम से कम, यदि डिज़ाइन बदलता है या मुझे भविष्य के संस्करणों में पूंजीकृत पाठ को निकालने की आवश्यकता है, तो मुझे लेआउट फ़ाइलों में सामान्य TextView में बदलने की आवश्यकता है।

अब, यह ध्यान में रखें कि मैंने ऐसा इसलिए किया क्योंकि ऐप के डिज़ाइनर ने वास्तव में इस पाठ (शीर्षक) को CAPS में चाहा था, ऐप में मूल सामग्री कैपिटलाइज़ेशन से कोई फर्क नहीं पड़ता था, और मेरे पास अन्य सामान्य टेक्स्ट व्यू भी थे, जहां कैपिटलाइज़ेशन वास्तविक सामग्री के साथ आया ।

यह वर्ग है:

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

मैं एक समाधान के साथ आया हूं, जो इस तथ्य के साथ है कि मैं भी एक उपवर्ग TextViewबना रहा हूं, जो पाठ को ऊपरी-केस बनाता है।

अंतर यह है कि किसी एक setText()तरीके को ओवरराइड करने के बजाय , मैंने एक समान दृष्टिकोण का उपयोग किया है जो TextViewवास्तव में एपीआई 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 का उपयोग करने की अनुमति देता है: बटन, EditText AutoCompleteEditText चेकबॉक्स RadioButton और कई अन्य।

आपको 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 आपको एक कस्टम टाइपफेस / फॉन्ट सेट करने की भी अनुमति देता है जिसे आप अपने एसेट फोल्डर में रखते हैं।

मैं PixlUI फ्रेमवर्क के ग्रैडल कांटे पर काम कर रहा हूं जो कि ग्रेडेल का उपयोग करता है और एक को टेक्स्टअलैप्स के साथ-साथ शैलियों से टाइपफेस के रूप में निर्दिष्ट करने की अनुमति देता है, बल्कि उन्हें इनलाइन की आवश्यकता होती है जो मूल प्रोजेक्ट के रूप में होती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.