मैं अपने आवेदन में अपना स्वयं का पाठ आकार निर्दिष्ट करना चाहता हूं, लेकिन मुझे ऐसा करने में समस्या हो रही है।
जब मैं डिवाइस सेटिंग्स में फ़ॉन्ट आकार TextView
बदलता हूं, तो मेरे एप्लिकेशन का फ़ॉन्ट आकार भी बदल जाता है।
मैं अपने आवेदन में अपना स्वयं का पाठ आकार निर्दिष्ट करना चाहता हूं, लेकिन मुझे ऐसा करने में समस्या हो रही है।
जब मैं डिवाइस सेटिंग्स में फ़ॉन्ट आकार TextView
बदलता हूं, तो मेरे एप्लिकेशन का फ़ॉन्ट आकार भी बदल जाता है।
जवाबों:
दरअसल, सेटिंग्स फ़ॉन्ट आकार केवल आकार को प्रभावित करता है sp
। परिभाषित - सभी तो आप सब करने की ज़रूरत textSize
में dp
के बजायsp
, फिर सेटिंग आपका ऐप पाठ का आकार परिवर्तन नहीं होगा।
यहाँ प्रलेखन के लिए एक कड़ी है: आयाम
हालाँकि कृपया ध्यान दें कि अपेक्षित व्यवहार यह है कि सभी ऐप्स में मौजूद फोंट उपयोगकर्ता की प्राथमिकताओं का सम्मान करते हैं। कई कारण हो सकते हैं कि कोई उपयोगकर्ता फ़ॉन्ट आकार समायोजित करना चाहता है और उनमें से कुछ भी चिकित्सा - दृष्टिबाधित उपयोगकर्ता हो सकते हैं। पाठ के dp
बदले उपयोग करने से sp
आपके ऐप के कुछ उपयोगकर्ताओं के साथ अनिच्छा से भेदभाव हो सकता है।
अर्थात:
android:textSize="32dp"
sp
और कब उपयोग करना चाहिए dp
। मुझे यहाँ बहुत अच्छी प्रतिक्रिया मिली: stackoverflow.com/questions/11638691/…
ऐसा करने के लिए सबसे आसान है बस निम्नलिखित की तरह कुछ का उपयोग करें:
android:textSize="32sp"
यदि आप textSize
संपत्ति के बारे में अधिक जानना चाहते हैं, तो आप Android डेवलपर दस्तावेज़ देख सकते हैं ।
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
कि सिस्टम डिफ़ॉल्ट मानों का उपयोग करता है।
जब पहले से ही dimen.xml फ़ाइल में परिभाषित किया गया हो, तो कोड द्वारा DIP या SP को फिर से निर्दिष्ट करना अच्छी बात नहीं है।
मुझे लगता है कि dimen.xml मूल्य का उपयोग करते समय सबसे अच्छा विकल्प पीएक्स का उपयोग करना है:
tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.txt_size));
इस तरह, आप किसी भी कोड को बदलने के बिना dimen.xml फ़ाइल में जरूरत पड़ने पर DP से SP पर स्विच कर सकते हैं।
संपूर्ण एप्लिकेशन को सिस्टम फ़ॉन्ट आकार से प्रभावित होने से रोकने का सरल तरीका है आधार गतिविधि का उपयोग करके अपडेट करना।
//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());
}
यह मदद कर सकता है। अपने कस्टम एप्लिकेशन या बेसएक्टिविटी में कोड जोड़ें
/**
* 重写 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 में हटा दिया गया है, जिसका अर्थ है कि यह भविष्य में किसी दिन असमर्थित हो जाएगा।
आप इस कोड का उपयोग कर सकते हैं:
android:textSize="32dp"
यह आपकी समस्या को हल करता है लेकिन आपको पता होना चाहिए कि आपको उपयोगकर्ता के निर्णयों का सम्मान करना चाहिए। इसके द्वारा, डिवाइस सेटिंग्स से टेक्स्ट का आकार बदलने से यह मान नहीं बदलेगा। इसलिए आपको dp के बजाय sp का उपयोग करने की आवश्यकता है । इसलिए मेरा सुझाव है कि आप अलग-अलग सिस्टम फॉन्ट साइज़ (छोटे, सामान्य, बड़े, ...) के साथ अपने ऐप की समीक्षा करें
कोटलिन के लिए, यह मेरे लिए काम करता है
priceTextView.textSize = 12f
यदि उपयोग की जाने वाली इकाइयाँ SP हैं, DP नहीं हैं, और आप सिस्टम फॉन्ट स्केलिंग को ओवरराइड करना चाहते हैं, तो आप जो भी करते हैं वह गतिविधि में एक विधि को ओवरराइड करता है - इस पोस्ट को देखें ।
resource.updateConfiguration हटा दिया गया है और छोटी गाड़ी है (Oreo पर मेरे पास स्वरूपित पाठ के साथ समस्याएँ थीं)।
एंड्रॉइड 8 में यह समाधान मेरे लिए काम करता है
आधार गतिविधि में इस कोड को जोड़ें
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase);
final Configuration override = new Configuration(newBase.getResources().getConfiguration());
override.fontScale = 1.0f;
applyOverrideConfiguration(override);
}