प्रोग्रामर से स्पिनर पाठ के लिए फ़ॉन्ट कस्टम फ़ॉन्ट कैसे सेट करें?


93

मेरे पास मेरे संपत्ति फ़ोल्डर में एक ttf फ़ॉन्ट फ़ाइल है। मुझे पता है कि इसका उपयोग कैसे करें:

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

मैंने अपने स्पिनर पाठ के लिए अपनी स्वयं की xml फ़ाइल (Android में usuall के रूप में) को परिभाषित किया है:

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

क्या मेरे स्पिनर पाठ को स्वयं के xml में परिभाषित करने के लिए भी मेरे बाहरी फ़ॉन्ट का चयन करना संभव है?

धन्यवाद।

उत्तर के साथ संपादित करें:

यह काम:

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;

अपनी फ़ाइल के शीर्ष पर आयात की अपनी सूची में। जब यह कोड में शामिल ViewGroup वर्ग को नहीं पहचानता है, तो किसी कारण से ग्रहण यह सुझाव नहीं देता है।


2
बहुत बहुत धन्यवाद दोस्त .. लंबे संघर्ष के बाद, मैंने यह पाया है। इसने मेरे दिन को बचाया
एंड्रो सेल्वा

उत्तर जोड़ने के लिए धन्यवाद!
कॉमनसेंससकोड

बहुत अच्छे सवाल ...
राहुल कुशवाहा

जवाबों:


81

यह मेरे लिए काम कर रहा है ( कॉमन्सवेयर के विचारों और गन्सलोरेंट के उत्तरों से दोनों का उपयोग करके ):

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 का उपयोग करेंगे:

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

1
महान! मैंने और भी आगे बढ़कर एक assignAdapterWithOptions(Spinner spinner, int textArrayResId)विधि बनाई , जिसमें से संदर्भ प्राप्त करना spinner.getContext()और उसके अंदर स्पिनर को एडॉप्टर असाइन करना (स्पिनर लेआउट मेरे पूरे ऐप के लिए स्टैंडर हैं)
आईजी पास्कुअल

यह मदद मुझे alot.Thanks ... @ Jonik
राहुल कुशवाहा

24

आप अपने स्वयं के कस्टम के माध्यम से फ़ॉन्ट लागू करेंगे SpinnerAdapter, getView()और getDropDownView()


मैंने अपनी नवीनतम समस्या के साथ अपने प्रश्न को संपादित किया, क्या आप कृपया बता सकते हैं कि मैं क्या गलत कर रहा हूँ। Tnx
DixieFlatline

1
@DixieFlatline: आप के लिए एक आयात जोड़ने की जरूरत है 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)था : TextView को खोजने के लिए नहीं लगता था, हालांकि आईडी सही थी। इस कोड में कुछ अन्य समस्याएं: 1) में अनुपलब्ध रिटर्न स्टेटमेंट getView(), 2) अप्रयुक्त फ़ील्ड recurso, 3) कुछ स्टाइल मुद्दे जैसे कि एक वैरिएबल का नामकरण spinner_textहोना चाहिए (होना चाहिए spinnerText)। यहाँ मेरे लिए क्या काम किया है
जोनीक

4

यह कस्टम बनाने की कोशिश करें custom_spinner.xml

<?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"

    />

कस्टम CheckedtextView इस तरह बनाएँ

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

मुझे लगता है कि यह बेहतर होगा, क्योंकि आपको एडॉप्टर पर अपना हाथ गंदे करने की ज़रूरत नहीं है, और आप अपने ऐप में कहीं भी इस CustomTextview का उपयोग कर सकते हैं।
मिलाद

2

यह मेरे पिछले उत्तर की निरंतरता है: https://stackoverflow.com/a/51100507/7878799

संगतता कारणों के लिए, आप एंड्रॉइड में विजेट्स के खिलाफ शैलियों और अनुकूलित कक्षाओं का उपयोग कर सकते हैं। यद्यपि एंड्रॉइड स्तर 15 से ऊपर, नए /res/fontसंसाधन फ़ोल्डर पेश किए गए थे:

Android में फ़ॉन्ट संसाधन

चरण 1: item_spinner.xml घोषित करें

<?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: घोषित करें item_spinner_dropdown.xml:

<?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>

[नोट: FontTextView की आईडी लेआउट, स्पिनर आइटम और ड्रॉप डाउन आइटम दोनों में समान है]

चरण 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

कृपया FontTextView, FontEditView, FontRadioButton, FontCheckBox और FontBitton के बुनियादी अनुकूलन का पालन करें।

[सटीक उत्तर के लिए, इस गाइड को देखने के बाद, कृपया देखें: https://stackoverflow.com/a/51113022/787399 ]

ArrayAdapter आइटम लेआउट में कस्टम FontTextView का उपयोग करें, जैसे:

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>

अपने तार में फोंट का उल्लेख करें। xml:

...
<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" />

Android स्तर 16 और इसके बाद के संस्करण में, यह सब सरलीकृत है, क्योंकि अब आप TTF और अन्य फ़ॉन्ट संसाधनों /res/fontको संपत्ति में रखने के बजाय फ़ोल्डर में रख सकते हैं । यह कस्टम कक्षाओं, शैलियों और विशेषताओं को हटाता है, देखें:

Android में फ़ॉन्ट संसाधन

स्टाइल के साथ हैप्पी कोडिंग !! :-)


लंबे उत्तर, लेकिन एक समय काम। फिर उसके बाद यह एक पुन: प्रयोज्य है।
अभिनव सक्सेना

-1

दोस्तों मैं एक भयानक समाधान मिला, मैं सहायक की तरह orignal अनुकूलक लपेट

Android के साथ इस वर्ग SpinnerViewHelper और खुश प्रचार का उपयोग करें

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

लैंबडा अभिव्यक्ति का उपयोग किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.