एंड्रॉइड एप्लिकेशन में टेक्स्ट व्यू का फ़ॉन्ट आकार देशी सेटिंग्स से फ़ॉन्ट आकार बदलने पर बदलता है


171

मैं अपने आवेदन में अपना स्वयं का पाठ आकार निर्दिष्ट करना चाहता हूं, लेकिन मुझे ऐसा करने में समस्या हो रही है।

जब मैं डिवाइस सेटिंग्स में फ़ॉन्ट आकार TextViewबदलता हूं, तो मेरे एप्लिकेशन का फ़ॉन्ट आकार भी बदल जाता है।


2
यह डिफ़ॉल्ट व्यवहार है कि यदि आप अपने डिवाइस का फ़ॉन्ट आकार देशी फ़ॉन्ट बदलते हैं तो यह आपके एप्लिकेशन फ़ॉन्ट आकार पर भी प्रभाव डालता है।
श्रेयांश महाजन

आप यहाँ से उत्तर प्राप्त कर सकते हैं stackoverflow.com/questions/16706076/…
भावेश जेठानी

पाठ आकार के लिए सपा का उपयोग करें ... क्योंकि यह उपयोगकर्ता के फ़ॉन्ट आकार वरीयता द्वारा बढ़ाया जाता है। सब कुछ के लिए डीपी का उपयोग करें।
लाइव-लव

जवाबों:


231

दरअसल, सेटिंग्स फ़ॉन्ट आकार केवल आकार को प्रभावित करता है sp। परिभाषित - सभी तो आप सब करने की ज़रूरत textSizeमें dpके बजायsp , फिर सेटिंग आपका ऐप पाठ का आकार परिवर्तन नहीं होगा।

यहाँ प्रलेखन के लिए एक कड़ी है: आयाम

हालाँकि कृपया ध्यान दें कि अपेक्षित व्यवहार यह है कि सभी ऐप्स में मौजूद फोंट उपयोगकर्ता की प्राथमिकताओं का सम्मान करते हैं। कई कारण हो सकते हैं कि कोई उपयोगकर्ता फ़ॉन्ट आकार समायोजित करना चाहता है और उनमें से कुछ भी चिकित्सा - दृष्टिबाधित उपयोगकर्ता हो सकते हैं। पाठ के dpबदले उपयोग करने से spआपके ऐप के कुछ उपयोगकर्ताओं के साथ अनिच्छा से भेदभाव हो सकता है।

अर्थात:

android:textSize="32dp"

12
एक लंबे समय पहले मैं यह जानना चाहता था कि मुझे कब उपयोग करना चाहिए spऔर कब उपयोग करना चाहिए dp। मुझे यहाँ बहुत अच्छी प्रतिक्रिया मिली: stackoverflow.com/questions/11638691/…
सैम

129

ऐसा करने के लिए सबसे आसान है बस निम्नलिखित की तरह कुछ का उपयोग करें:

android:textSize="32sp"

यदि आप textSizeसंपत्ति के बारे में अधिक जानना चाहते हैं, तो आप Android डेवलपर दस्तावेज़ देख सकते हैं ।


1
यह वास्तव में टीएस का मुद्दा है, क्योंकि 'dp' के बजाय 'sp' का उपयोग कर रहा है
Boy

8
मैं अभी भी नहीं जानता कि 100 अपवोट क्यों हैं। क्योंकि अगर हम सेट के लिए sp का उपयोग करते हैं, तो एप्लिकेशन में टेक्स्टाइज़ करें। फिर हम सेटिंग में फ़ॉन्ट आकार बदलते हैं, एप्लिकेशन में टेक्स्ट व्यू भी बदलते हैं
फान वान

इस सवाल का जवाब कैसे देता है?
सिद्धार्थ जी

48

dimensionसंसाधनों का उपयोग करें जैसे आप stringसंसाधनों का उपयोग करते हैं ( DOCS )।

अपनी dimens.xmlफ़ाइल में, अपने आयाम चर घोषित करें:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <dimen name="textview_height">25dp</dimen>
  <dimen name="textview_width">150dp</dimen>
  <dimen name="ball_radius">30dp</dimen>
  <dimen name="font_size">16sp</dimen>
</resources>

फिर आप इन मूल्यों का उपयोग इस तरह कर सकते हैं:

<TextView
   android:layout_height="@dimen/textview_height"
   android:layout_width="@dimen/textview_width"
   android:textSize="@dimen/font_size"/>

आप अलग-अलग घोषित कर सकते हैं dimens.xml विभिन्न प्रकार के स्क्रीन के लिए विभिन्न फ़ाइलों की । ऐसा करने से विभिन्न उपकरणों पर आपके ऐप के वांछित लुक की गारंटी होगी।

जब आप निर्दिष्ट नहीं करते हैं android:textSizeकि सिस्टम डिफ़ॉल्ट मानों का उपयोग करता है।


1
मुद्दा स्क्रीन नहीं है। यह एंड्रॉइड डिस्प्ले सेटिंग्स में चयनित देशी फ़ॉन्ट आकार है जो उल्लेखित मुद्दे की ओर जाता है
हिमांशु विरमानी

24

यह भी ध्यान दें कि यदि textSize कोड में सेट है, तो कॉलिंग textView.setTextSize(X)संख्या (X) को SP के रूप में व्याख्या करता है। DpsetTextSize(TypedValue.COMPLEX_UNIT_DIP, X) में मान सेट करने के लिए उपयोग करें ।


13

जब पहले से ही dimen.xml फ़ाइल में परिभाषित किया गया हो, तो कोड द्वारा DIP या SP को फिर से निर्दिष्ट करना अच्छी बात नहीं है।

मुझे लगता है कि dimen.xml मूल्य का उपयोग करते समय सबसे अच्छा विकल्प पीएक्स का उपयोग करना है:

tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.txt_size));

इस तरह, आप किसी भी कोड को बदलने के बिना dimen.xml फ़ाइल में जरूरत पड़ने पर DP से SP पर स्विच कर सकते हैं।


6

संपूर्ण एप्लिकेशन को सिस्टम फ़ॉन्ट आकार से प्रभावित होने से रोकने का सरल तरीका है आधार गतिविधि का उपयोग करके अपडेट करना।

//in base activity add this code.
public  void adjustFontScale( Configuration configuration) {

    configuration.fontScale = (float) 1.0;
    DisplayMetrics metrics = getResources().getDisplayMetrics();
    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    wm.getDefaultDisplay().getMetrics(metrics);
    metrics.scaledDensity = configuration.fontScale * metrics.density;
    getBaseContext().getResources().updateConfiguration(configuration, metrics);

}

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    adjustFontScale( getResources().getConfiguration());
}

1

यह मदद कर सकता है। अपने कस्टम एप्लिकेशन या बेसएक्टिविटी में कोड जोड़ें

/**
 * 重写 getResource 方法,防止系统字体影响
 *
 * @return
 */
@Override
public Resources getResources() {
    Resources resources = super.getResources();
    if (resources != null && resources.getConfiguration().fontScale != 1) {
        Configuration configuration = resources.getConfiguration();
        configuration.fontScale = 1;
        resources.updateConfiguration(configuration, resources.getDisplayMetrics());
    }
    return resources;
}

हालाँकि, संसाधन # updateConfiguration API स्तर 25 में हटा दिया गया है, जिसका अर्थ है कि यह भविष्य में किसी दिन असमर्थित हो जाएगा।


1

आप इस कोड का उपयोग कर सकते हैं:

android:textSize="32dp"

यह आपकी समस्या को हल करता है लेकिन आपको पता होना चाहिए कि आपको उपयोगकर्ता के निर्णयों का सम्मान करना चाहिए। इसके द्वारा, डिवाइस सेटिंग्स से टेक्स्ट का आकार बदलने से यह मान नहीं बदलेगा। इसलिए आपको dp के बजाय sp का उपयोग करने की आवश्यकता है । इसलिए मेरा सुझाव है कि आप अलग-अलग सिस्टम फॉन्ट साइज़ (छोटे, सामान्य, बड़े, ...) के साथ अपने ऐप की समीक्षा करें



1

बदलने के लिए डीपी को बदलें यह एंड्रॉइड एंड्रॉइड के लिए अच्छा विकल्प है: textSize = "18sp"


0

यदि उपयोग की जाने वाली इकाइयाँ SP हैं, DP नहीं हैं, और आप सिस्टम फॉन्ट स्केलिंग को ओवरराइड करना चाहते हैं, तो आप जो भी करते हैं वह गतिविधि में एक विधि को ओवरराइड करता है - इस पोस्ट को देखें

resource.updateConfiguration हटा दिया गया है और छोटी गाड़ी है (Oreo पर मेरे पास स्वरूपित पाठ के साथ समस्याएँ थीं)।


0

getResources()गतिविधि में ओवरराइड ।

हमेशा की तरह टेक्स्टव का आकार सेट करें android:textSize="32sp"

override fun getResources(): Resources {
    return super.getResources().apply {
        configuration.fontScale = 1F
        updateConfiguration(configuration, displayMetrics)
    }
}

0

एंड्रॉइड 8 में यह समाधान मेरे लिए काम करता है

आधार गतिविधि में इस कोड को जोड़ें

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(newBase);
    final Configuration override = new Configuration(newBase.getResources().getConfiguration());
    override.fontScale = 1.0f;
    applyOverrideConfiguration(override);
}

source https://stackoverflow.com/a/57225687/7985871

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