টেক্সটভিউ.সেটেক্সটসাইজ অস্বাভাবিক আচরণ করে - বিভিন্ন স্ক্রিনের জন্য পাঠ্যদর্শনের পাঠ্য আকারকে গতিশীলভাবে কীভাবে সেট করবেন?


119

কলিং TextView.setTextSize()অস্বাভাবিকভাবে কাজ করছে। setTextSizeআমরা যদি এর getTextSizeপূর্বে এটি সেট করেছিলাম তার থেকে অনেক বেশি মূল্য ফিরে আসে তবে তার কল করার ঠিক পরে ।

আমরা যা করছি তা এখানে:

zoomControl.setOnZoomInClickListener(new OnClickListener() {
    public void onClick(View view) {
        float size = mViewShabad.getTextSize() + 1;
        textView.setTextSize(size);
    }
});

এর আগে কি কেউ দেখেছেন?


2
আপনি দুটি পৃথক বস্তুর উপর পাঠ্যের আকারটি পেয়ে যাচ্ছেন এবং সেট করছেন?
চেরিল সাইমন

উত্তর:


359

এখানে পার্থক্যটি হল setTextSize(int size)পদ্ধতিটিতে, ইউনিট টাইপটি ডিফল্টরূপে "স্প" বা "স্কেলড পিক্সেল" হয়। এই মানটি প্রতিটি পর্দার ঘনত্বের জন্য আলাদা পিক্সেল মাত্রা হবে (ldpi, mdpi, hdpi)।

getTextSize()অন্যদিকে, পাঠ্যের প্রকৃত পিক্সেল মাত্রা প্রদান করে।

আপনি setTextSize(int unit, float size)ইউনিটের ধরণ নির্দিষ্ট করতে ব্যবহার করতে পারেন । এটির জন্য ধ্রুবক মানগুলি টাইপডভ্যালু শ্রেণিতে পাওয়া যাবে তবে তাদের কয়েকটি হ'ল:

TypedValue.COMPLEX_UNIT_PX   //Pixels

TypedValue.COMPLEX_UNIT_SP   //Scaled Pixels

TypedValue.COMPLEX_UNIT_DIP  //Device Independent Pixels

আমি সবেমাত্র এটি পেয়েছি এবং এটি এখানে পোস্ট করতে চলেছি। অনেক ধন্যবাদ!
singhspk

1
আমি মনে করি এটি আসলে টাইপডালিউ (একবচন) দ্বারা হওয়া উচিত। আমদানিটি হ'ল android.util.TypedValue;
হেইন ডু প্লেসিস

5
এছাড়াও লক্ষণীয়, এটি কেবল এপিআই স্তরে এটি করা শুরু করেছিল a একটি হাস্যকর এপিআইতে আর একটি "গোটচা"।
এমএক্সসিএল

3
আর্গুমেন্ট অর্ডারটি পর্যবেক্ষণ করা গুরুত্বপূর্ণ - আমার ভুলবশত সেটেক্সটসাইজ (আকার, টাইপডভ্যালিউ। COMPLEX_UNIT_SP) সেট ছিল কারণ এটি ছিল আমার ভুল অনুসারে যে আদেশ!
চিহ্নিত করুন

1
মজার বিষয় হল, আমার গ্যালাক্সি নেক্সাসের আইসিএসে, সেটটেক্সটসাইজ (14, টাইপডভ্যালিউ। COMPLEX_UNIT_SP) ব্যবহার করে কোনও প্রভাব পড়েনি (তাই ব্যবহৃত ডিফল্ট আকার) তবে আমি জেলি বিনে আপগ্রেড করার সময়, পাঠ্যের কোনওটিই প্রদর্শিত হয়নি (0 আকারের মতো)। আমি যখন আমার ভুল বুঝতে পেরেছিলাম তখন আমি জেলি বিনের বাগটি দেওয়ার কথা বলছিলাম!
চিহ্নিত করুন

20

এই সমস্যাটির কারণ হ'ল কারণ getTextSize()পদ্ধতিটি পিক্সেলের আকার ফিরিয়ে দেয় স্ক্রিনের ঘনত্বের উপর নির্ভর করে! প্রকৃত পাঠ্য আকারটি এটি ব্যবহার করতে:

DisplayMetrics metrics;
metrics = getApplicationContext().getResources().getDisplayMetrics();
float Textsize =myTextView.getTextSize()/metrics.density;
myTextView.setTextSize(Textsize+1);

আমি আশা করি এটি সমাধান করে দিয়েছে :)


2
আমি আমার সমস্যার সঙ্গে প্রদর্শন মেট্রিক্স ব্যবহার দ্বারা মীমাংসিত setTextSize(int unit, float size)
এডওয়ার্ড চিয়াং

8

যদি পরিবর্তন হরফ আকার নির্ধারণ করে - কিছু শোয়ের ত্রুটির কারণ হয়ে থাকে - আপনি হিসাবে এটি করতে পারেন :

setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15.f);

3
কে পাঠ্য আকার সেট করে DIP?
ইগোরগানাপলস্কি

4

যখন আমরা getTextSize () প্রোগ্রামেটমেটিক সমস্যায় সেটটেক্সট () সেট করার চেষ্টা করি তখন এসপি / ডিপি / ডিপের পরিবর্তে পিএক্সে মান প্রদান করে আমরা 1sp / dp = 1.5px (পর্দার আকার = 240) জানি।

 titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*1.5f)); 

আমার জন্য নিখুঁতভাবে কাজ করছে বা আমরা ডিসপ্লেমেট্রিক্স থেকে পিএক্স: এসপি / ডিপি অনুপাত ব্যবহার করতে পারি তারপরে সেই মানটি 1.5f এর সাথে প্রতিস্থাপন করতে পারি

means-> titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*your_sp_and_px_ratio_in_int f));

3

দীর্ঘ সময় পরে এটি আঘাত করেছে এবং শেষ পর্যন্ত এর মতো সমাধান হয়েছে

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
          getResources().getDimension(R.dimen.textsize));

এই রেজ / মান / মাত্রা। xML এর মতো ডায়মন্ড ফোল্ডার তৈরি করুন

<?xml version="1.0" encoding="utf-8"?>
<resources>

 <dimen name="textsize">8sp</dimen>

 </resources>

2

সংক্ষেপে, আপনি যদি নিজের লেখাগুলি জুম করতে চান

float size = mViewShabad.getTextSize()*1.1f;
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);

কারণ getTextSize () UNIT_PX প্রদান করে, তারপরে আমাদের UNIT_PX ব্যবহার করা উচিত


1

কোটলিন সলিউশন

একটি উত্স ব্যবহার করে সেট করতে, কেবল এটি ব্যবহার করুন:

textView.setTextSize(COMPLEX_UNIT_PX, textView.resources.getDimension(R.dimen.my_text_size))

একটি রিসোর্স মান দিয়ে এটি করতে, আরও অনেক সহজেই আপনার পাঠ্যের আকার সেট করতে এই এক্সটেনশন সম্পত্তিটি যুক্ত করুন

textView.textSizeRes = R.dimen.my_text_size

var TextView.textSizeRes
    get() = textSize.toInt()
    set(@DimenRes textSizeRes) {
        setTextSize(COMPLEX_UNIT_PX, resources.getDimension(textSizeRes))
    }

0

এই উত্তরের জন্য কিছু অতিরিক্ত স্বাদ যুক্ত করা, পাশাপাশি কিছুটা বিভ্রান্তির মধ্যে পড়ে। আপনি উচিত কোন একটির এই পরীক্ষাটি ড্রপ পাবে @RunWith(AndroidJUnit4.class)আপনি আপনার প্রকল্পে আছে (আপনি আপনার dimens.xml করার dimens যোগ করতে হবে) পরীক্ষা।

দ্রষ্টব্য: এই সমস্ত পরীক্ষা পাস

@Test public void testScaledFontSizes() {
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    final Context context = InstrumentationRegistry.getTargetContext();

    Configuration configuration = context.getResources().getConfiguration();
    configuration.fontScale = 2.0f;
    configuration.densityDpi = 160; // mdpi, 1:1
    context.getResources().updateConfiguration(configuration, null);

    float scaledTextSize = context.getResources().getDimensionPixelSize(R.dimen.sp_15);
    assertEquals(30.0f, scaledTextSize);

    // Create a new TextView with the explicitly set configuration
    TextView textView = new TextView(context);
    textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, scaledTextSize);

    // 30, because font size is scaled
    assertEquals(30.0f, textView.getTextSize());

    // This is what we *don't* want, it's scaled *twice*!
    textView.setTextSize(scaledTextSize);
    assertEquals(60.0f, textView.getTextSize());

    // DP instead of SP tests
    float fifteenDp = context.getResources().getDimensionPixelSize(R.dimen.dp_15);
    assertEquals(15.0f, fifteenDp);

    textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, fifteenDp);
    // Still 15, because it's DP, not SP
    assertEquals(15.0f, fifteenDp);

    textView.setTextSize(fifteenDp);
    // 30, because setTextSize DOES font scaling
    assertEquals(30.0f, textView.getTextSize());
  }
}

আমি যে বড় গ্রহণযোগ্যতা পেয়েছি তা হ'ল TextView.setTextSize(float) এটি ফন্ট স্কেলিং প্রয়োগ করে , সুতরাং আপনি যদি ডিপির পরিবর্তে এসপি হিসাবে ইতিমধ্যে লেবেলযুক্ত কোনও মাত্রায় পাস করেন তবে এটি ফন্ট স্কেলিংটি দুইবার গ্রহণ করবে ।

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