প্রোগ্রামিংয়ে স্পিনারের পাঠ্যকে কীভাবে কাস্টম ফন্ট সেট করবেন?


93

আমার সম্পদ ফোল্ডারে আমার কাছে একটি টিটিএফ ফন্ট ফাইল রয়েছে। আমি এটির সাহায্যে পাঠ্যদর্শনগুলির জন্য কীভাবে ব্যবহার করব তা আমি জানি:

Typeface externalFont=Typeface.createFromAsset(getAssets(), "fonts/HelveticaNeueLTCom-Lt.ttf");
textview1.setTypeface(externalFont);

আমি আমার স্পিনার পাঠ্যের জন্য এটির নিজস্ব এক্সএমএল ফাইলে সংজ্ঞায়িত করেছি (যেমন অ্যান্ড্রয়েডে ব্যবহারযোগ্য):

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+android:id/text1"
style="?android:attr/spinnerItemStyle"
android:singleLine="true"
android:textColor="#ffffff"
android:gravity="center" 
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee" />

আমি কোড থেকে এই পাঠ্যদর্শনটি কেবল উল্লেখ করতে পারি না, আমি সর্বদা নাল পয়েন্টার ব্যতিক্রম পাই। যেমন আমি চেষ্টা করেছি:

TextView spinner_text=(TextView)findViewById(R.id.text1);
spinner_text.setTypeface(externalFont);

এটির নিজস্ব এক্সএমএল সংজ্ঞায়িত আমার স্পিনার পাঠ্যের জন্যও কি আমার বাহ্যিক ফন্ট নির্বাচন করা সম্ভব?

ধন্যবাদ.

উত্তরের সাথে সম্পাদনা করুন:

এইটা কাজ করে:

String [] items = new String[2];
    items[0]="Something1";
    items[1]="Something2";

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    R.layout.spinaca, items) {

         public View getView(int position, View convertView, ViewGroup parent) {
                 View v = super.getView(position, convertView, parent);

                 Typeface externalFont=Typeface.createFromAsset(getAssets(), "fonts/HelveticaNeueLTCom-Lt.ttf");
                 ((TextView) v).setTypeface(externalFont);

                 return v;
         }


         public View getDropDownView(int position,  View convertView,  ViewGroup parent) {
                  View v =super.getDropDownView(position, convertView, parent);

                 Typeface externalFont=Typeface.createFromAsset(getAssets(), "fonts/HelveticaNeueLTCom-Lt.ttf");
                 ((TextView) v).setTypeface(externalFont);
                 v.setBackgroundColor(Color.GREEN);

                 return v;
         }
 };


     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);                                 
     spinner.setAdapter(adapter);

এটি যুক্ত করা প্রয়োজন হতে পারে

import android.view.ViewGroup;

আপনার ফাইলের শীর্ষে আপনার আমদানির তালিকায়। কোনও কারণে যখন কোডের সাথে জড়িত ভিউগ্রুপ শ্রেণিটি স্বীকৃতি না দেয় তখনগ্রহণটি এই পরামর্শটি দেয় না doesn't


4
অনেক অনেক ধন্যবাদ বন্ধু .. দীর্ঘ সংগ্রামের পরেও আমি এটি পেয়েছি। এটি আমার দিন অ্যাটলাস্ট
অ্যান্ড্রো

উত্তর যুক্ত করার জন্য ধন্যবাদ!
কমনসেন্সকোড

খুব সুন্দর প্রশ্ন ...
রাহুল কুশওয়াহা

উত্তর:


81

এটিই আমার পক্ষে কাজ করেছে ( কমন্সওয়্যার এবং gsanllorente এর উত্তর উভয় থেকে ধারণা ব্যবহার করে ):

private static class MySpinnerAdapter extends ArrayAdapter<String> {
    // Initialise custom font, for example:
    Typeface font = Typeface.createFromAsset(getContext().getAssets(),
                        "fonts/Blambot.otf");

    // (In reality I used a manager which caches the Typeface objects)
    // Typeface font = FontManager.getInstance().getFont(getContext(), BLAMBOT);

    private MySpinnerAdapter(Context context, int resource, List<String> items) {
        super(context, resource, items);
    }

    // Affects default (closed) state of the spinner
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView view = (TextView) super.getView(position, convertView, parent);
        view.setTypeface(font);
        return view;
    }

    // Affects opened state of the spinner
    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        TextView view = (TextView) super.getDropDownView(position, convertView, parent);
        view.setTypeface(font);
        return view;
    }
}

আপনি যদি আমার মতো, স্পিনারটি মূলত স্পিনার ব্যবহার করে ArrayAdapter.createFromResource()এবং একটি অ্যারের সংস্থান ( স্পিনারের ডকুমেন্টেশনের মতো ) ব্যবহার করেন, তবে আপনি মাইস্পিনারএডাপ্টারটি এর মতো ব্যবহার করতে পারেন:

MySpinnerAdapter<String> adapter = new MySpinnerAdapter(
        getContext(),
        R.layout.view_spinner_item,
        Arrays.asList(getResources().getStringArray(R.array.my_array))
);
spinner.setAdapter(adapter);

4
দুর্দান্ত! আমি আরও এগিয়ে গিয়ে একটি assignAdapterWithOptions(Spinner spinner, int textArrayResId)পদ্ধতি তৈরি করেছিলাম , প্রসঙ্গটি পেয়েছি spinner.getContext()এবং এর অভ্যন্তরে স্পিনারের সাথে অ্যাডাপ্টারটি অর্পণ করেছি (স্পিনার লেআউটগুলি আমার পুরো অ্যাপ্লিকেশনটির স্ট্যান্ডার)
আইজি পাসকুল

এটি আমাকে অনেক সাহায্য করে han ধন্যবাদ ... @ জোনিক
রাহুল কুশওয়াহা

24

আপনি আপনার নিজস্ব কাস্টম মাধ্যমে ফন্ট প্রযোজ্য হবে SpinnerAdapterএ, getView()এবং getDropDownView()


আমি আমার সর্বশেষ সমস্যাটি দিয়ে আমার প্রশ্নটি সম্পাদনা করেছি, আপনি কি দয়া করে বলতে পারেন যে আমি কী ভুল করছি। Tnx
ডিক্সিফ্লেটলাইন

4
@ ডিক্সি ফ্ল্যাটলাইন: আপনার android.view.ViewGroupসম্ভবত একটি আমদানি যুক্ত করা দরকার , সম্ভবত
CommonsWare

15

আপনি যদি অন্য অ্যাডাপ্টারের অন্য কোনও ফাইলটিতে প্রয়োগ করেন তবে আপনি প্যারামিটার হিসাবে কনটেক্সট হিসাবে অ্যাডাপ্টারের কনস্ট্রাক্টরের কাছ থেকে "getAssets ()" ফাংশনটি অ্যাক্সেস করতে পারবেন।

public class YourItemAdapter extends ArrayAdapter<String> {
int recurso;
Typeface tf;

public YourItemAdapter(Context _context, int _resource,
        List<String> _items) {

    super(_context, _resource, _items);
    recurso=_resource;
    tf=Typeface.createFromAsset(_context.getAssets(),"font/digital-7.ttf");
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    //You can use the new tf here.
    TextView spinner_text=(TextView)findViewById(R.id.text1);
    spinner_text.setTypeface(tf);
    }
}

এটি সত্যিই সাহায্য করে, আপনাকে ধন্যবাদ :)
জশান পিজে

এটি আমার জন্য কার্যকর না হওয়া সত্ত্বেও এটি এক ধরণের দরকারী ছিল: findViewById(R.id.text1)আইডিটি সঠিক হলেও টেক্সটভিউটি খুঁজে পায়নি। এই কোডে অন্য কয়েকটি সমস্যা: ১) রিটার্ন স্টেটমেন্ট অনুপস্থিত getView(), ২) অব্যবহৃত ক্ষেত্র recurso, ৩) কিছু স্টাইলের সমস্যা যেমন ভেরিয়েবলের নামকরণ spinner_text(হওয়া উচিত spinnerText)) আমার জন্য কি কাজ করেছে তা এখানে
জোনিক

4

এটি কাস্টম কাস্টম_স্পিনার.এক্সএমএল তৈরি করার চেষ্টা করুন

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

<com.xxxx.xxxx.CheckedTextViewC

    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1"
    style="?android:attr/spinnerDropDownItemStyle"
    android:singleLine="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="marquee"
    android:textAlignment="center"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:textSize="18sp"

    />

এটির মতো কাস্টম চেকডেক্সটভিউ তৈরি করুন

import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.CheckedTextView;

public class CheckedTextViewC extends CheckedTextView {

    public CheckedTextViewC(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
    }
    public CheckedTextViewC(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }
    public CheckedTextViewC(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }
    public void setTypeface(Typeface tf, int style) {
        if(!this.isInEditMode()){
        Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/Roboto-Light.ttf");
        Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/Roboto-Light.ttf");

        if (style == Typeface.BOLD) {
            super.setTypeface(boldTypeface/*, -1*/);
        } else {
            super.setTypeface(normalTypeface/*, -1*/);
        }
        }

    }
}

নতুন লেআউট প্রয়োগ করুন

adapter= new ArrayAdapter <String>(Menu.this,R.layout.custom_spinner, list);

আমি মনে করি এটি আরও ভাল হবে, কারণ আপনাকে অ্যাডাপ্টারে আপনার হাতটি নোংরা করতে হবে না এবং আপনি এই অ্যাপ্লিকেশনটিতে অন্য কোথাও এই কাস্টম টেক্সটভিউটি ব্যবহার করতে পারেন।
মিলাদ

2

এটি আমার আগের উত্তরের ধারাবাহিকতা: https://stackoverflow.com/a/51100507/787399

সামঞ্জস্যতার কারণে, আপনি অ্যান্ড্রয়েডের উইজেটগুলির বিরুদ্ধে শৈলী এবং কাস্টমাইজড ক্লাস ব্যবহার করতে পারেন। যদিও অ্যান্ড্রয়েড স্তরের ১৫ এর উপরে, নতুন /res/fontসংস্থান ফোল্ডার চালু করা হয়েছিল:

অ্যান্ড্রয়েডে হরফ সংস্থান

পদক্ষেপ 1: আইটেম_স্পিনার.এক্সএমএল ঘোষণা করুন

<?xml version="1.0" encoding="utf-8"?>
<com.my_package.custom_views.FontTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv_spinner"
    style="@style/App_TextViewStyleSmall"
    android:layout_gravity="start|bottom"
    android:layout_marginLeft="@dimen/dp_5"
    android:layout_marginStart="@dimen/dp_5"
    android:ellipsize="marquee"
    android:gravity="start|bottom"
    android:padding="@dimen/dp_10"
    android:singleLine="true"
    android:textAlignment="inherit" />
    <!--declared in layout: item_spinner.xml-->
    <!-- removed attributes:  android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:textColor="@color/text_grey_light"
               android:textSize="@dimen/sp_14" -->
    <!--style="?android:attr/spinnerItemStyle"-->

পদক্ষেপ 2: আইটেম_স্পিনার_ড্রপডাউন.এক্সএমএল ঘোষণা করুন:

<?xml version="1.0" encoding="utf-8"?>
<com.my_package.custom_views.FontTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv_spinner"
    style="@style/App_TextViewStyleSmall"
    android:layout_gravity="start|bottom"
    android:layout_marginLeft="@dimen/dp_5"
    android:layout_marginStart="@dimen/dp_5"
    android:ellipsize="marquee"
    android:gravity="start|bottom"
    android:padding="@dimen/dp_10"
    android:singleLine="true" />
    <!--declared in layout: item_spinner_dropdown.xml -->
    <!--removed: ?android:attr/dropdownListPreferredItemHeight-->
    <!--style="?android:attr/spinnerDropDownItemStyle"-->

পদক্ষেপ 3: লেআউটে স্পিনার ব্যবহার করুন:

<LinearLayout
            android:id="@+id/ll_my_spinner"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/fet_bus_entity"
            android:layout_marginTop="@dimen/dp_12"
            android:orientation="horizontal">

            <com.my_package.custom_views.FontTextView
                style="@style/App_TextViewStyleSmall"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="start|bottom"
                android:gravity="start|bottom"
                android:text="@string/are_you_a" />

            <Spinner
                android:id="@+id/sp_my_spinner"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="@dimen/dp_5"
                android:layout_marginStart="@dimen/dp_5"
                android:layout_gravity="end|bottom"
                android:spinnerMode="dropdown" />
        </LinearLayout>

[দ্রষ্টব্য: ফন্টটেক্সটভিউয়ের আইডি লেআউট, স্পিনার আইটেম এবং ড্রপ ডাউন আইটেম উভয়ই সমান]

পদক্ষেপ 4: এটি কার্যকলাপ / খণ্ডে ব্যবহার করুন:

private void initSpinnerBusinessType(View rootView) {
        String[] ar_dd_bus_type = getResources().getStringArray(R.array.ar_dd_bus_type);
        List<String> lst_bus_type = Arrays.asList(ar_dd_bus_type);
        ArrayList<String> ar_bus_type = new ArrayList<>(lst_bus_type);
        //==

        ArrayAdapter<String> adapter = new ArrayAdapter<>(activity, R.layout.item_spinner, R.id.tv_spinner, ar_bus_type);
        adapter.setDropDownViewResource(R.layout
                .item_spinner_dropdown);
        //=========
        Spinner sp_my_spinner= rootView.findViewById(R.id.sp_my_spinner);
        sp_my_spinner.setAdapter(adapter);
    }

[আরও নির্দেশের জন্য আমার অন্যান্য পোস্টটি দেখুন: https://stackoverflow.com/a/51077569/787399 এবং https://stackoverflow.com/a/22164007/787399 ]


0

অনুগ্রহ করে ফন্টটেক্সটভিউ, ফন্টএডিটভিউ, ফন্টরাদিওবাটন, ফন্টচেকবক্স এবং ফন্টবটনের প্রাথমিক কাস্টমাইজেশন অনুসরণ করুন।

[সঠিক উত্তরের জন্য, এই গাইডটি দেখার পরে, দয়া করে দেখুন: https://stackoverflow.com/a/51113022/787399 ]

অ্যারেএডাপ্টার আইটেম বিন্যাসে কাস্টম ফন্টটেক্সটভিউ ব্যবহার করুন:

public class FontEditText extends AppCompatEditText {

//    private String FONT = "fonts/roboto_regular.ttf";

    public FontEditText(Context context) {
        super(context, null);
//        setFontFromAsset(context, null, R.style.DefaultFontTextView);
//        FONT = getContext().getString(R.string.font_roboto_regular);
    }

    public FontEditText(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        setFontFromAsset(context, attrs, R.attr.fetFontStyle);
    }

    public FontEditText(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setFontFromAsset(context, attrs, defStyleAttr);
    }

    private void setFontFromAsset(Context context, AttributeSet attrs, int defStyle) {
        BaseActivity activity = (BaseActivity)((MyApplication) context.getApplicationContext()).getCurrentActivity();
        FontAndLocaleManager fontAndLocaleManager = activity.getFontAndLocaleManager();
        fontAndLocaleManager.setFontFromAsset(this, R.styleable.FontEditText, R.styleable.FontEditText_fetFontFace, attrs, defStyle);
    }
}

কোডটি ব্যবহার করুন:

public void setFontFromAsset(View view, int[] resViewStyleable, int resStyleableViewFontFace, AttributeSet attrs, int defStyle) {
        String strFont = null;
        Typeface tfFontFace = null;
        String strButton = FontButton.class.getCanonicalName(),
                strTextView = FontTextView.class.getCanonicalName(),
                strEditText = FontEditText.class.getCanonicalName(),
                strView = view.getClass().getCanonicalName();
        try {
            if (view.isInEditMode()) {
                return;
            }
            //R.string.font_roboto_regular
            strFont = context.getString(R.string.font_roboto_regular);
            tfFontFace = Typeface.createFromAsset(context.getAssets(), strFont);

            //AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes
            //R.styleable.FontButton
            TypedArray a = context.obtainStyledAttributes(attrs, resViewStyleable, defStyle, 0);
            //R.styleable.FontButton_btFontFace
            String derivedFont = a.getString(resStyleableViewFontFace);

            a.recycle();

            //==
            try {
                if (derivedFont != null) {
                    Typeface derivedFontFace = Typeface.createFromAsset(context.getAssets(), derivedFont);
                    if (strView.equals(strButton)) {
                        ((FontButton) view).setTypeface(derivedFontFace);
                    } else if (strView.equals(strTextView)) {
                        ((FontTextView) view).setTypeface(derivedFontFace);
                    } else if (strView.equals(strEditText)) {
                        ((FontEditText) view).setTypeface(derivedFontFace);
                    }
                    return;
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            if (strFont != null && tfFontFace != null) {
                if (strView.equals(strButton)) {
                    ((FontButton) view).setTypeface(tfFontFace);
                } else if (strView.equals(strTextView)) {
                    ((FontTextView) view).setTypeface(tfFontFace);
                } else if (strView.equals(strEditText)) {
                    ((FontEditText) view).setTypeface(tfFontFace);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

সম্পর্কিত xmls এ শৈলী এবং বৈশিষ্ট্যগুলি বর্ণনা করুন:

<!--FontTextView-->
    <declare-styleable name="FontTextViewStyle">
        <!-- Style of the FontTextView. -->
        <attr name="ftvFontStyle" format="reference"/>

    </declare-styleable>
    <declare-styleable name="FontTextView">
        <!-- Font face of FontTextView. -->
        <attr name="ftvFontFace" format="reference"/>
    </declare-styleable>

এবং

<!--FontTextView-->
<style name="StyledFontTextView" parent="@android:style/Theme.Light">
<item name="ftvFontStyle">@style/DefaultFontTextView</item>
</style>

<style name="DefaultFontTextView">
<item name="ftvFontFace">@string/font_roboto_regular</item>
</style>

আরও কিছু শৈলীর সংজ্ঞা দিন:

<style name="App_TextViewStyle" parent="@android:style/Widget.TextView">
        <item name="android:textColor">@color/text_grey</item>
        <item name="android:textSize">@dimen/sp_20</item>
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
    </style>
    <style name="App_TextViewStyleMedium" parent="@android:style/Widget.TextView">
        <item name="android:textColor">@color/text_hint</item>
        <item name="android:textSize">@dimen/sp_18</item>
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
    </style>
    <style name="App_TextViewStyleSmall" parent="@android:style/Widget.TextView">
        <item name="android:textColor">@color/text_grey_light</item>
        <item name="android:textSize">@dimen/sp_14</item>
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
    </style>

আপনার স্ট্রিং.এক্সএমএলে ফন্টগুলি উল্লেখ করুন:

...
<string name="font_roboto_regular">fonts/roboto_regular.ttf</string>
...

এবং কিছু কোড এবং সময় সংরক্ষণ করে বিন্যাসগুলিতে ব্যবহার করুন:

<com.mypackage.custom_views.FontTextView
                style="@style/App_TextViewStyleMedium"
                android:layout_gravity="start|bottom"
                android:gravity="start|bottom"
                app:fetFontFace="@string/font_roboto_regular"
                android:text="@string/are_you_a" />

অ্যান্ড্রয়েড পর্যায়ে ১ and এবং তারপরে /res/font, এগুলি সমস্ত সরল করা হয়েছে, কারণ এখন আপনি সম্পদের চেয়ে টিটিএফ এবং অন্যান্য ফন্টের সংস্থানগুলি ফোল্ডারে রাখতে পারেন । এটি বেশিরভাগ কাস্টম ক্লাস, শৈলী এবং বৈশিষ্ট্যগুলি সরিয়ে দেয়, দেখুন:

অ্যান্ড্রয়েডে হরফ সংস্থান

শৈলীর সাথে শুভ কোডিং !! :-)


দীর্ঘ উত্তর, কিন্তু এক সময় কাজ। তারপরে এটি পুনরায় ব্যবহারযোগ্য।
অভিনব সাক্সেনা

-1

বলছি আমি একটি দুর্দান্ত সমাধান পেয়েছি, আমি সাহায্যকারীর মতো অরিগনাল অ্যাডাপ্টারটি মোড়ানো করি

এই শ্রেণীর স্পিনারভিউ হেল্পার এবং অ্যান্ড্রয়েডের সাথে সুখী প্রগতি ব্যবহার করুন

new SpinnerViewHelper((Spinner)view.findViewById(R.id.labelSurveyNumber),(parent, v, position, id) -> UrduFontHelper.set(v));

লাম্বদা এক্সপ্রেশন ব্যবহার করা হয়।

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