অ্যান্ড্রয়েড ডিজাইন সমর্থন ট্যাবলাউটে ট্যাব পাঠ্যের ফন্ট পরিবর্তন করুন


109

আমি TabLayoutঅ্যান্ড্রয়েড ডিজাইনের লাইব্রেরি থেকে নতুনটিতে কাজ করার চেষ্টা করছি ।

আমি কাস্টম ফন্টে ট্যাব পাঠ্য পরিবর্তন করতে চাই । এবং, আমি কিছু এর সাথে সম্পর্কিত স্টাইলিং অনুসন্ধান করার চেষ্টা TabLayout, কিন্তু শেষ পর্যন্ত এই

আমি কীভাবে ট্যাব পাঠ্য ফন্টগুলি পরিবর্তন করতে পারি তা গাইড করুন।


3
স্প্যানিয়েবল স্ট্রিং ব্যবহার করুন
নুলবাইট

উত্তর:


37

জাভা কোড বা এটির মতো এক্সএমএল থেকে একটি টেক্সটভিউ তৈরি করুন

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:textSize="15sp"
    android:textColor="@color/tabs_default_color"
    android:gravity="center"
    android:layout_height="match_parent"
/>

আইডিটি এখানে যেমন রয়েছে তেমনি তা নিশ্চিত করে রাখুন কারণ আপনি যদি কাস্টম পাঠ্যদর্শনটি ব্যবহার করেন তবে ট্যাবলয়আউটটি এই আইডিটি পরীক্ষা করে

তারপরে কোড থেকে এই বিন্যাসটিকে Typefaceস্ফীত করুন এবং সেই পাঠ্যদর্শনটিতে কাস্টম সেট করুন এবং এই কাস্টম ভিউটিকে ট্যাবে যুক্ত করুন

for (int i = 0; i < tabLayout.getTabCount(); i++) {
     //noinspection ConstantConditions
     TextView tv = (TextView)LayoutInflater.from(this).inflate(R.layout.custom_tab,null)
     tv.setTypeface(Typeface);       
     tabLayout.getTabAt(i).setCustomView(tv);
}

2
এই পরিস্থিতিতে আমি কীভাবে সেট tabTextColorএবং tabSelectedTextColorসম্পত্তি রাখতে পারি ?
আলিরিজা নুরালি

আমি
প্রবীণ

162

আপনি যদি ব্যবহার করছেন TabLayoutএবং আপনি ফন্টটি পরিবর্তন করতে চান তবে আপনাকে আগের সমাধানটিতে লুপের জন্য একটি নতুন যুক্ত করতে হবে:

private void changeTabsFont() {
    ViewGroup vg = (ViewGroup) tabLayout.getChildAt(0);
        int tabsCount = vg.getChildCount();
        for (int j = 0; j < tabsCount; j++) {
            ViewGroup vgTab = (ViewGroup) vg.getChildAt(j);
            int tabChildsCount = vgTab.getChildCount();
            for (int i = 0; i < tabChildsCount; i++) {
                View tabViewChild = vgTab.getChildAt(i);
                if (tabViewChild instanceof TextView) {
                    ((TextView) tabViewChild).setTypeface(Font.getInstance().getTypeFace(), Typeface.NORMAL);
                }
        }
    }
} 

শেরলক ব্যবহার করে অ্যাকশন বার ট্যাবে ফন্ট শৈলী পরিবর্তন করতে দয়া করে উল্লেখ করুন


আমি এম প্রিভিউ ব্যবহার করছি না। এটা করতে অন্য কোন উপায় আছে কি.
ডুরি

1
আপনার এম প্রিভিউয়ের দরকার নেই, এটি ব্যবহারকারীর জন্য বৈধTabLayout
মারিও ভেলাস্কো

তবে, আমি অ্যান্ড্রয়েড.ভিউতে একটি নালপয়েন্টার এক্সসেপশনের মুখোমুখি হয়েছি iew আমি আমার কোডটিতে কী মিস করছি তা খুঁজে পাচ্ছি না।
brettbrdls

1
প্রথম প্যারামিটারটি setTypeFaceহ'ল TypeFace, যদি আপনি Fontক্লাসটি না খুঁজে পান (যা আমার কাছে উপস্থিত নেই বলে মনে করেন)
ওয়াহিদ আমিরি

104

আপনার নিজস্ব কাস্টম শৈলী তৈরি করুন এবং হিসাবে পিতামাতার শৈলী ব্যবহার করুন parent="@android:style/TextAppearance.Widget.TabWidget"

এবং আপনার ট্যাব বিন্যাসে এই স্টাইলটি ব্যবহার করুন app:tabTextAppearance="@style/tab_text"

উদাহরণ: স্টাইল:

<style name="tab_text" parent="@android:style/TextAppearance.Widget.TabWidget">
    <item name="android:fontFamily">@font/poppins_regular</item>
</style>

উদাহরণ: ট্যাব বিন্যাসের উপাদান:

<android.support.design.widget.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:tabTextAppearance="@style/tab_text" />

9
এটি সঠিক, আমি parent="TextAppearance.Design.Tab"আমার ক্ষেত্রে ব্যবহার করছি ।
জাভাটার

1
এটি প্রথম
জবাবগুলির

2
ফন্টফ্যামিলি ব্যবহার করার সময় কেবল কাজ করুন, ফন্টপথ ব্যবহার করার সময় কাজ করবেন না
ট্রাম নগুইন

2
আমি ব্যবহার করার সময় ভুলভাবে ব্যতিক্রম পেয়েছিলাম TextAppearance.Widget.TabWidget। @ জাভতারের উত্তর এটি আমার জন্য স্থির করেছে।
funct7

47

প্রবীণ শর্মার দুর্দান্ত উত্তর। কেবলমাত্র একটি সামান্য সংযোজন: আপনার যে কোনও changeTabsFont()জায়গায় প্রয়োজনের পরিবর্তে TabLayoutআপনি কেবল নিজের ব্যবহার করতে পারেন CustomTabLayout

import android.content.Context;
import android.graphics.Typeface;
import android.support.design.widget.TabLayout;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class CustomTabLayout extends TabLayout {
    private Typeface mTypeface;

    public CustomTabLayout(Context context) {
        super(context);
        init();
    }

    public CustomTabLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CustomTabLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mTypeface = Typeface.createFromAsset(getContext().getAssets(), "fonts/Roboto-Regular.ttf");
    }

    @Override
    public void addTab(Tab tab) {
        super.addTab(tab);

        ViewGroup mainView = (ViewGroup) getChildAt(0);
        ViewGroup tabView = (ViewGroup) mainView.getChildAt(tab.getPosition());

        int tabChildCount = tabView.getChildCount();
        for (int i = 0; i < tabChildCount; i++) {
            View tabViewChild = tabView.getChildAt(i);
            if (tabViewChild instanceof TextView) {
                ((TextView) tabViewChild).setTypeface(mTypeface, Typeface.NORMAL);
            }
        }
    }

}

এবং আরও একটি জিনিস। TabViewএটি অভ্যন্তরের LinearLayoutসাথে একটি TextView(এটি বিকল্পভাবে ধারণ করে ImageView)। সুতরাং আপনি কোডটিকে আরও সহজ করে তুলতে পারেন:

@Override
public void addTab(Tab tab) {
    super.addTab(tab);

    ViewGroup mainView = (ViewGroup) getChildAt(0);
    ViewGroup tabView = (ViewGroup) mainView.getChildAt(tab.getPosition());
    View tabViewChild = tabView.getChildAt(1);
    ((TextView) tabViewChild).setTypeface(mTypeface, Typeface.NORMAL);
}

তবে আমি এইভাবে সুপারিশ করব না। যদি TabLayoutপ্রয়োগটি পরিবর্তিত হয়, এই কোডটি ভুলভাবে বা এমনকি ক্র্যাশ করতে পারে।

কাস্টমাইজ করার অন্য একটি উপায় TabLayoutএটিতে কাস্টম ভিউ যুক্ত করছে। এখানে মহান উদাহরণ


আপনি যদি এই জাতীয় ট্যাব সেট করেন তবে অ্যাডট্যাব আপনাকে অনুরোধ করবে না: mViewPager.setAdapter (নতুন আপনারপেজারএডাপ্টার (getChildFraamentManager ())); mTabLayout.setupWithViewPager (mViewPager);
Penzzz

2
@ Penzzz আপনি একদম ঠিক আছেন এই ক্ষেত্রে আপনার কোডটি অ্যাডট্যাব পদ্ধতি থেকে অন্যটিতে সরিয়ে নেওয়া উচিত। উদাহরণস্বরূপ onMeasure।
আন্দ্রেই আওলাস্কা

আপনি আমার দিন বাঁচান আপনার শেষ লিঙ্কটি আমাকে বাঁচায়।
অমল ডালে 12

এটি আর কাজ করে না আমি সর্বশেষ সংস্করণে ভাবি। @ ইজউ এর উত্তর এখন কাজ করছে। এটি অ্যাডটিবে যুক্ত করতে হবে (ট্যাব ট্যাব, বুলিয়ান সেট নির্বাচন করা হয়েছে)
সায়েম

3
এটি ভাল কাজ করে। দ্রষ্টব্য: সমর্থন লাইব্রেরি 25.x হিসাবে, আপনার addTab(Tab tab, int position, boolean setSelected)পরিবর্তে ওভাররাইড করা উচিত addTab(Tab tab)
ভিকি চিজওয়ানি

20

XMLডিভাইসে চলমান Android 4.1(এপিআই স্তর 16) এবং এর চেয়ে বেশি উচ্চতর বৈশিষ্ট্যে ফন্ট সমর্থন ব্যবহার করতে, সমর্থন লাইব্রেরি 26+ ব্যবহার করুন।

  1. ফোল্ডারে রাইট ক্লিক করুন
  2. নতুন -> অ্যান্ড্রয়েড সংস্থান ডিরেক্টরি -> ফন্ট নির্বাচন করুন -> ঠিক আছে Ok
  3. আপনার myfont.ttfফাইলটি সদ্য নির্মিত ফন্ট ফোল্ডারে রাখুন

উপর res/values/styles.xmlঅ্যাড:

<style name="customfontstyle" parent="@android:style/TextAppearance.Small">
    <item name="android:fontFamily">@font/myfont</item>
</style>

লেআউট ফাইলটিতে অ্যাপ্লিকেশন যুক্ত করুন: ট্যাবটেক্সটএপরিয়েন্স = "@ শৈলী / কাস্টমফন্টসাইল",

<android.support.design.widget.TabLayout
    android:id="@+id/tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabGravity="fill"
    app:tabTextAppearance="@style/customfontstyle"
    app:tabMode="fixed" />

দয়া করে [XML- এর ফন্ট] পড়ুন। ( Https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml )


এটি xamarin ফর্ম এবং xamarin android.thanks- এ কাজ করে
ইসমাইল

দুর্দান্ত উত্তর! যদিও "টেক্সটএপরিয়েন্স.ডিজাইন.ট্যাব" প্রসারিত করা উচিত
XY

16

নিম্নলিখিত পদ্ধতিটি ViewGroupপুনরাবৃত্তভাবে পুরো ফন্টে পরিবর্তন করবে । আমি এই পদ্ধতিটি বেছে নিয়েছি কারণ আপনার অভ্যন্তরীণ কাঠামোর যত্ন নিতে হবে না TabLayout। আমি একটি ফন্ট সেট করতে ক্যালিগ্রাফি লাইব্রেরি ব্যবহার করছি ।

void changeFontInViewGroup(ViewGroup viewGroup, String fontPath) {
    for (int i = 0; i < viewGroup.getChildCount(); i++) {
        View child = viewGroup.getChildAt(i);
        if (TextView.class.isAssignableFrom(child.getClass())) {
            CalligraphyUtils.applyFontToTextView(child.getContext(), (TextView) child, fontPath);
        } else if (ViewGroup.class.isAssignableFrom(child.getClass())) {
            changeFontInViewGroup((ViewGroup) viewGroup.getChildAt(i), fontPath);
        }
    }
}

1
এটির সাথে সমস্যাটি হ'ল যদি আপনি কোনও ভিউপাগারের সাথে লেআউটটি সংযুক্ত করেন তবে আপনি কাস্টমাইজড ফন্টগুলি হারাবেন।
রুপ্পস

10

ডিজাইনের সহায়তার জন্য 23.2.0, সেটআপউইথ ভিউপেজার ব্যবহার করে আপনাকে কোডটি অ্যাডট্যাব (ট্যাব ট্যাব) থেকে অ্যাডটাব (ট্যাব ট্যাব, বুলিয়ান সেটসলেক্টড) এ সরিয়ে নিতে হবে।


8

আপনি এটি ব্যবহার করতে পারেন, এটি আমার পক্ষে কাজ করে।

 private void changeTabsFont() {
    ViewGroup vg = (ViewGroup) tabLayout.getChildAt(0);
    int tabsCount = vg.getChildCount();
    for (int j = 0; j < tabsCount; j++) {
        ViewGroup vgTab = (ViewGroup) vg.getChildAt(j);
        int tabChildsCount = vgTab.getChildCount();
        for (int i = 0; i < tabChildsCount; i++) {
            View tabViewChild = vgTab.getChildAt(i);
            if (tabViewChild instanceof TextView) {
                AssetManager mgr = getActivity().getAssets();
                Typeface tf = Typeface.createFromAsset(mgr, "fonts/Roboto-Regular.ttf");//Font file in /assets
                ((TextView) tabViewChild).setTypeface(tf);
            }
        }
    }
}

7

ঠিক আছে, আমি লুপ ব্যবহার না করেই এটি 23.4.0 এ সাদৃশ্য পেয়েছি। @ ইজেডাবির পরামর্শ অনুসারে স্রেফ অ্যাডট্যাব (@ নননুল ট্যাব ট্যাব, বুলিয়ান সেটসিলেক্ট) ওভাররাইড করুন।

@Override
public void addTab(@NonNull Tab tab, boolean setSelected) {
    CoralBoldTextView coralTabView = (CoralBoldTextView) View.inflate(getContext(), R.layout.coral_tab_layout_view, null);
    coralTabView.setText(tab.getText());
    tab.setCustomView(coralTabView);

    super.addTab(tab, setSelected);
}

এবং এখানে এক্সএমএল

<?xml version="1.0" encoding="utf-8"?>
<id.co.coralshop.skyfish.ui.CoralBoldTextView
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/custom_text"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:ellipsize="end"
   android:gravity="center"
   android:singleLine="true"
   android:textColor="@color/graylove"
   android:textSize="@dimen/tab_text_size" />

আশা করি এটি সাহায্য করতে পারে :)


1
তবে কীভাবে ট্যাবসিলিটেডটেক্সটকালার এবং ট্যাবটেক্সটকোলো সেট করবেন?
মোস্তফা ইমরান

@ মোস্তফাআইমরান এর সংস্করণটিতে android:textColor="@color/graylove"রাজ্য তালিকা নির্বাচিত হওয়া উচিত_যে়র সাথে নির্বাচিত রঙ নির্দিষ্ট করা আছে
এএএপভিভি

7

আন্ড্রেই হিসাবে উত্তর , আপনি ট্যাবলআউট ক্লাস প্রসারিত করে ফন্টফেস পরিবর্তন করতে পারেন । এবং Penzzz যেমন বলেছে, আপনি এটি অ্যাডট্যাব পদ্ধতিতে করতে পারবেন না । বেনো হিসাবে লেআউট পদ্ধতিটি ওভাররাইড করুন :

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom){
    super.onLayout(changed, left, top, right, bottom);

    final ViewGroup tabStrip = (ViewGroup)getChildAt(0);
    final int tabCount = tabStrip.getChildCount();
    ViewGroup tabView;
    int tabChildCount;
    View tabViewChild;

    for(int i=0; i<tabCount; i++){
        tabView = (ViewGroup)tabStrip.getChildAt(i);
        tabChildCount = tabView.getChildCount();
        for(int j=0; j<tabChildCount; j++){
            tabViewChild = tabView.getChildAt(j);
            if(tabViewChild instanceof AppCompatTextView){
                if(fontFace == null){
                    fontFace = Typeface.createFromAsset(context.getAssets(), context.getString(R.string.IranSans));
                }
                ((TextView) tabViewChild).setTypeface(fontFace, Typeface.BOLD);
            }
        }
    }
}

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

আরেকটি সমাধান:

প্রথমত, কোডগুলির এই লাইনগুলি:

    if(fontFace == null){
        fontFace = Typeface.createFromAsset(context.getAssets(), context.getString(R.string.IranSans));
    }

উপরের সমাধানে দুটি লুপের বাইরে লেখা উচিত।

তবে এর জন্য আরও ভাল সমাধান API এর = = 16 অ্যান্ড্রয়েড ব্যবহার করছে : হরফফ্যামিলি :

একটি অ্যান্ড্রয়েড রিসোর্স ডিরেক্টরি নামের ফন্ট তৈরি করুন এবং আপনার পছন্দসই ফন্টটি ডিরেক্টরিতে অনুলিপি করুন।

তারপরে এই স্টাইলগুলি ব্যবহার করুন:

<style name="tabLayoutTitles">
    <item name="android:textColor">@color/white</item>
    <item name="android:textSize">@dimen/appFirstFontSize</item>
    <item name="android:fontFamily">@font/vazir_bold</item>
</style>

<style name="defaultTabLayout">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">@dimen/defaultTabLayoutHeight</item>
    <item name="android:gravity">right</item>
    <item name="tabTextAppearance">@style/tabLayoutTitles</item>
    <item name="tabSelectedTextColor">@color/white</item>
    <item name="tabIndicatorColor">@color/white</item>
    <item name="tabIndicatorHeight">@dimen/accomTabIndicatorHeight</item>
    <item name="tabMode">fixed</item>
    <item name="tabGravity">fill</item>
    <item name="tabBackground">@drawable/rectangle_white_ripple</item>
    <item name="android:background">@color/colorPrimary</item>
</style>

এটি একটি খারাপ পারফরম্যান্স ফিক্স, onLayout()ট্যাব স্যুইচিং বা এমনকি ট্যাবগুলির নীচে তালিকা স্ক্রোলিংয়ের মতো প্রতিটি লেআউট পরিবর্তনের সাথে ডাকা হয়েছে, forঅনেকগুলি ট্যাব TabLayoutঅ্যাপ্লিকেশনটিতে নেস্টেড এস লাগিয়ে দেওয়া হবে।
আমর বারাকাত

2
@ আমর বারাকাত। এই লিঙ্কটি অনুসারে: বিকাশকারী.অ্যান্ড্রয়েড / রেফারেন্স / অ্যান্ড্রয়েড / ভিউ / আইটি, ইনট, ইনট, ইনট, ইনট), এটি সত্য নয়। আমি এটিও পরীক্ষা করে দেখেছি। আমি অন - লেআউট পদ্ধতিতে একটি ব্রেক পয়েন্ট রেখেছি এবং ট্যাবগুলি যখন সারণী ট্যাব স্যুইচিং বা তালিকা স্ক্রোলিংয়ের উপর না তৈরি করা হচ্ছে তখন কল হয়ে যায়।
আরশ

1
আমার জন্য onLayout()যখন ট্যাব স্যুইচিংয়ের সময় একাধিকবার কল করা হয় (কেন ঠিক তা নিশ্চিত নয়) তবে এর জন্য অ্যাকাউন্ট করতে আমি কেবল হরফ সেট করি যখন boolean changedসত্য হয়। এটি করা একাধিকবার হরফ সেট করতে বাধা দেয়।
রবার্ট

দুর্দান্ত সমাধান, কোনও কোডের প্রয়োজন নেই, কেবলমাত্র এক্সএমএল বৈশিষ্ট্য
সাবধানতা

3

আমার সমাধানের পদ্ধতিটি ঠিক এইভাবেই সুনির্দিষ্ট ট্যাব পাঠ্য পরিবর্তন করুন,

 ViewGroup vg = (ViewGroup) tabLayout.getChildAt(0);
 ViewGroup vgTab = (ViewGroup) vg.getChildAt(1);
 View tabViewChild = vgTab.getChildAt(1);
 if (tabViewChild instanceof TextView) {
      ((TextView) tabViewChild).setText(str);
 }

2
I think this is easier way.

<android.support.design.widget.TabLayout
   android:id="@+id/tabs"
   app:tabTextColor="@color/lightPrimary"
   app:tabSelectedTextColor="@color/white"
   style="@style/CustomTabLayout"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"/>
<style name="CustomTabLayout" parent="Widget.Design.TabLayout">
   <item name="tabMaxWidth">20dp</item>
   <item name="tabMode">scrollable</item>
   <item name="tabIndicatorColor">?attr/colorAccent</item>
   <item name="tabIndicatorHeight">2dp</item>
   <item name="tabPaddingStart">12dp</item>
   <item name="tabPaddingEnd">12dp</item>
   <item name="tabBackground">?attr/selectableItemBackground</item>
   <item name="tabTextAppearance">@style/CustomTabTextAppearance</item>
   <item name="tabSelectedTextColor">?android:textColorPrimary</item>
</style>
<style name="CustomTabTextAppearance" parent="TextAppearance.Design.Tab">
   <item name="android:textSize">16sp</item>
   <item name="android:textStyle">bold</item>
   <item name="android:textColor">?android:textColorSecondary</item>
   <item name="textAllCaps">false</item>
</style>

2

কোটলিন এক্সটেনশন যা আমার পক্ষে কাজ করেছে:

fun TabLayout.setFont(font: FontUtils.Fonts) {
    val vg = this.getChildAt(0) as ViewGroup
    for (i: Int in 0..vg.childCount) {
        val vgTab = vg.getChildAt(i) as ViewGroup?
        vgTab?.let {
            for (j: Int in 0..vgTab.childCount) {
                val tab = vgTab.getChildAt(j)
                if (tab is TextView) {
                    tab.typeface = FontUtils.getTypeFaceByFont(FontUtils.Fonts.BOLD, context)
                }
            }
        }
    }
}

1

আমার 2p, রেফারেন্স চেকিং সহ কোটলিন, সর্বত্র প্রযোজ্য কারণ এটি কিছু ভুল হলে এটি বন্ধ হবে।

private fun setTabLayouFont(tabLayout: TabLayout) {
    val viewGroupTabLayout = tabLayout.getChildAt(0) as? ViewGroup?
    (0 until (viewGroupTabLayout?.childCount ?: return))
            .map { viewGroupTabLayout.getChildAt(it) as? ViewGroup? }
            .forEach { viewGroupTabItem ->
                (0 until (viewGroupTabItem?.childCount ?: return))
                        .mapNotNull { viewGroupTabItem.getChildAt(it) as? TextView }
                        .forEach { applyDefaultFontToTextView(it) }
            }
}

1

এবং এখানে কোটলিনে আমার বাস্তবায়ন যা নির্বাচিত এবং অনির্বাচিত ট্যাবগুলির জন্য ফন্ট পরিবর্তন করার অনুমতি দেয়।

class FontTabLayout @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    @AttrRes defStyleAttr: Int = 0
) : TabLayout(context, attrs, defStyleAttr) {

    private var textSize = 14f

    private var defaultSelectedPosition = 0

    private var selectedTypeFace: Typeface? = ResourcesCompat.getFont(context, R.font.muli_bold)
    private var normalTypeFace: Typeface? = ResourcesCompat.getFont(context, R.font.muli_regular)

    @ColorInt private var selectedColor = 0
    @ColorInt private var normalTextColor = 0

    init {
        attrs?.let { initAttrs(it) }
        addOnTabSelectedListener()
    }

    private fun initAttrs(attrs: AttributeSet) {
        val a = context.obtainStyledAttributes(attrs, R.styleable.FontTabLayout)

        textSize = a.getDimensionPixelSize(R.styleable.FontTabLayout_textSize, 14).toFloat()

        defaultSelectedPosition = a.getInteger(R.styleable.FontTabLayout_defaultSelectedPosition, 0)
        val selectedResourceId = a.getResourceId(R.styleable.FontTabLayout_selectedTypeFace, R.font.muli_bold)
        val normalResourceId = a.getResourceId(R.styleable.FontTabLayout_normalTypeFace, R.font.muli_regular)

        selectedColor = a.getColor(com.google.android.material.R.styleable.TabLayout_tabSelectedTextColor, 0)
        normalTextColor = a.getColor(R.styleable.FontTabLayout_normalTextColor, 0)

        selectedTypeFace = ResourcesCompat.getFont(context, selectedResourceId)
        normalTypeFace = ResourcesCompat.getFont(context, normalResourceId)

        a.recycle()
    }

    private fun addOnTabSelectedListener() {
        addOnTabSelectedListener(object : OnTabSelectedListenerAdapter() {

            override fun onTabUnselected(tab: Tab?) {
                getCustomViewFromTab(tab)?.apply {
                    setTextColor(normalTextColor)
                    typeface = normalTypeFace
                }
            }

            override fun onTabSelected(tab: Tab?) {

                getCustomViewFromTab(tab)?.apply {
                    setTextColor(selectedColor)
                    typeface = selectedTypeFace
                }
            }

            private fun getCustomViewFromTab(tab: Tab?) = tab?.customView as? AppCompatTextView

        })
    }

    override fun setupWithViewPager(viewPager: ViewPager?, autoRefresh: Boolean) {
        super.setupWithViewPager(viewPager, autoRefresh)
        addViews(viewPager)
    }

    private fun addViews(viewPager: ViewPager?) {
        for (i in 0 until tabCount) {
            val customTabView = getCustomTabView(i).apply {
                typeface = if (i == defaultSelectedPosition) selectedTypeFace else normalTypeFace
                val color = if (i == defaultSelectedPosition) selectedColor else normalTextColor
                setTextColor(color)
                text = viewPager?.adapter?.getPageTitle(i)
            }

            getTabAt(i)?.customView = customTabView
        }
    }

    private fun getCustomTabView(position: Int): AppCompatTextView {
        return AppCompatTextView(context).apply {
            gravity = Gravity.CENTER
            textSize = this@FontTabLayout.textSize
            text = position.toString()
        }
    }
}

atrs.xML এ:

<declare-styleable name="FontTabLayout">
    <attr name="normalTextColor" format="reference|color" />
    <attr name="textSize" format="dimension" />
    <attr name="defaultSelectedPosition" format="integer" />
    <attr name="selectedTypeFace" format="reference" />
    <attr name="normalTypeFace" format="reference" />
</declare-styleable>

tabs.getTabAt (1) ?. পাঠ্য একবার সেট হয়ে গেলে পাঠ্য পরিবর্তনশীল হয় না।
শানরাইশান

0

কোটলিন এক্সটেনশন ফাংশন সহ এটি ব্যবহার করুন:

 fun TabLayout.setFontSizeAndColor(typeface: Typeface, @DimenRes textSize: Int, @ColorRes textColor: Int) {
val viewGroup: ViewGroup = this.getChildAt(0) as ViewGroup
val tabsCount: Int = viewGroup.childCount
for (j in 0 until tabsCount) {
    val viewGroupTab: ViewGroup = viewGroup.getChildAt(j) as ViewGroup
    val tabChildCount: Int = viewGroupTab.childCount
    for (i in 0 until tabChildCount) {
        val tabViewChild: View = viewGroupTab.getChildAt(i) as View
        if ( tabViewChild is TextView) {
            tabViewChild.typeface = typeface
            tabViewChild.gravity = Gravity.FILL
            tabViewChild.maxLines = 1
            tabViewChild.setTextSize(TypedValue.COMPLEX_UNIT_PX, this.resources.getDimension(textSize))
            tabViewChild.setTextColor(ContextCompat.getColor(this.context, textColor))
        }
    }
}

}


-2

পরিবর্তন

if (tabViewChild instanceof TextView) {

জন্য

if (tabViewChild instanceof AppCompatTextView) { 

এটিকে android.support.design.widget.TabLayout (কমপক্ষে com.android.support:design:23.2.0 থেকে) দিয়ে কাজ করার জন্য


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