অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে টেক্সটভিউয়ের ফন্টের আকারটি স্থানীয় সেটিংস থেকে ফন্টের আকার পরিবর্তন করে


171

আমি আমার অ্যাপ্লিকেশনটিতে আমার নিজের পাঠ্য আকারটি নির্দিষ্ট করতে চাই, তবে এটি করতে আমার সমস্যা হচ্ছে।

আমি যখন ডিভাইস সেটিংসে ফন্টের আকার পরিবর্তন করি তখন আমার অ্যাপ্লিকেশনের ফন্টের আকারও TextViewপরিবর্তন হয়।


2
এটি ডিফল্ট আচরণ যে আপনি যদি নিজের ডিভাইসের নেটিভ ফন্টের ফন্টের আকার পরিবর্তন করেন তবে এটি আপনার অ্যাপ্লিকেশন ফন্টের আকারেও প্রভাবিত করে।
শ্রেয়াশ মহাজন

আপনি এখান থেকে উত্তর পেতে পারেন stackoverflow.com/questions/16706076/...
Bhavesh Jethani

পাঠ্য আকারের জন্য এসপি ব্যবহার করুন ... কারণ এটি ব্যবহারকারীর ফন্টের আকারের পছন্দ দ্বারা স্কেল করা হয়েছে। অন্য সব কিছুর জন্য ডিপি ব্যবহার করুন।
লাইভ-

উত্তর:


231

প্রকৃতপক্ষে, সেটিংস ফন্টের আকারটি কেবলমাত্র আকারগুলিকেই প্রভাবিত করে sp। সংজ্ঞায়িত - সব সুতরাং আপনি যা করতে হবে textSizeসালে dpপরিবর্তে sp, তারপর সেটিংস আপনার অ্যাপে লেখার আকার পরিবর্তন করবে না।

এখানে ডকুমেন্টেশনের লিঙ্ক রয়েছে: মাত্রা

তবে দয়া করে নোট করুন যে প্রত্যাশিত আচরণটি হ'ল সমস্ত অ্যাপ্লিকেশনে হরফ ব্যবহারকারীদের পছন্দকে সম্মান করে। কোনও ব্যবহারকারী ফন্টের আকারগুলি সামঞ্জস্য করতে চাইতে পারে এমন অনেকগুলি কারণ রয়েছে এবং এর মধ্যে কিছু চিকিত্সা - দৃষ্টি প্রতিবন্ধী ব্যবহারকারীও হতে পারে। পাঠ্যের dpপরিবর্তে ব্যবহার spকরা অনিচ্ছাকৃতভাবে আপনার অ্যাপের কিছু ব্যবহারকারীর সাথে বৈষম্যমূলক আচরণ করতে পারে।

অর্থাৎ,

android:textSize="32dp"

12
অনেক দিন আগে আমি জানতে চেয়েছিলাম যে আমার কখন ব্যবহার করা উচিত spএবং কখন ব্যবহার করা উচিত সে সম্পর্কে কোনও নিয়ম ছিল কিনা dp। আমি এখানে সত্যিই একটি ভাল প্রতিক্রিয়া পেয়েছি: stackoverflow.com/questions/11638691/…
স্যাম

129

এর মধ্যে সবচেয়ে সহজটি হল নীচের মতো কিছু ব্যবহার করা:

android:textSize="32sp"

আপনি যদি textSizeসম্পত্তি সম্পর্কে আরও জানতে চান তবে অ্যান্ড্রয়েড বিকাশকারী ডকুমেন্টেশন পরীক্ষা করতে পারেন ।


1
এই কারণেই টিএসের সমস্যা আছে, 'ডিপি' এর পরিবর্তে 'এসপি' ব্যবহার করে
বয়

8
আমি এখনও 100 টি আপগেট কেন জানি না। কারণ আমরা যদি অ্যাপ্লিকেশনটিতে সেট টেক্সটাইজের জন্য এসপি ব্যবহার করি। তারপরে আমরা সেটিংয়ে ফন্টের আকারটি পরিবর্তন করি, অ্যাপ্লিকেশনটির পাঠ্যদর্শনটিও পরিবর্তন হয়
ফান ভ্যান লিনহ

কিভাবে এই প্রশ্নের উত্তর দেয়?
সিদ্ধার্থ জি

48

ব্যবহার করুন dimensionসম্পদের টাইপ মত আপনি ব্যবহার stringসম্পদগুলি ( দস্তাবেজ )।

আপনার 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

এছাড়াও মনে রাখবেন যে যদি টেক্সট সাইজ কোডে সেট করা থাকে, কল textView.setTextSize(X)করে নম্বর (এক্স) কে এসপি হিসাবে ব্যাখ্যা করে। ডিপিতেsetTextSize(TypedValue.COMPLEX_UNIT_DIP, X) মান সেট করতে ব্যবহার করুন ।


13

ইতিমধ্যে একটি মাত্রা.এক্সএমএল ফাইলে সংজ্ঞায়িত হয়ে কোডের মাধ্যমে আবার ডিআইপি বা এসপি নির্দিষ্ট করা ভাল জিনিস নয়।

আমি মনে করি যে মাত্রা.এক্সএমএল মান ব্যবহার করার সময় সেরা বিকল্প হ'ল পিএক্স ব্যবহার করা:

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

এইভাবে, আপনি কোনও কোড পরিবর্তন না করেই Dime.xML ফাইলে প্রয়োজনে ডিপি থেকে এসপিতে স্যুইচ করতে পারেন।


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

তবে রিসোর্স # আপডেট কনফিগারেশনটি এপিআই 25 স্তরে বর্ণিত হয়েছে, যার অর্থ এটি ভবিষ্যতে কোনও দিন অসমর্থিত হবে।


1

আপনি এই কোডটি ব্যবহার করতে পারেন:

android:textSize="32dp"

এটি আপনার সমস্যার সমাধান করে তবে আপনাকে অবশ্যই জানতে হবে যে আপনার ব্যবহারকারীর সিদ্ধান্তকে সম্মান করা উচিত। এর দ্বারা, ডিভাইস সেটিংস থেকে পাঠ্যের আকার পরিবর্তন করা এই মানটি পরিবর্তন করবে না। তাই আপনাকে ডিপি পরিবর্তে এসপি ব্যবহার করতে হবে । সুতরাং আমার পরামর্শটি হ'ল আপনার অ্যাপ্লিকেশনটিকে বিভিন্ন সিস্টেম ফন্টের আকার (ছোট, সাধারণ, বড়, ...) দিয়ে পর্যালোচনা করা



1

ডিপিকে এসপিতে পরিবর্তন করুন এটি অ্যান্ড্রয়েড অ্যান্ড্রয়েডের জন্য ভাল অভ্যাস: টেক্সট সাইজ = "18 স্প"


0

ব্যবহৃত ইউনিটগুলি যদি ডিপি নয়, এসপি হয় এবং আপনি সিস্টেম ফন্ট স্কেলিংকে ওভাররাইড করতে চান তবে আপনারা যা কিছু করেন তা ক্রিয়াকলাপে একটি পদ্ধতিকে ওভাররাইড করে - এই পোস্টটি দেখুন

রিসোর্সস.আপডেট কনফিগারেশন অবচিত এবং বগী (ওরিওতে আমার ফর্ম্যাটযুক্ত পাঠ্য নিয়ে সমস্যা ছিল)।


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

উত্স https://stackoverflow.com/a/57225687/7985871

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.