Yazı tipi özel yazı tipini programlama yoluyla Spinner metnine nasıl ayarlayabilirim?


93

Varlıklar klasörümde bir ttf yazı tipi dosyam var. Aşağıdakilerle metin görünümleri için nasıl kullanılacağını biliyorum:

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

Döndürücü metnimin görünümünü kendi xml dosyasında tanımladım (android'de genellikle olduğu gibi):

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

Bu metin görünümüne koddan başvuramıyorum, her zaman boş işaretçi istisnaları alıyorum. Örneğin, denedim:

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

Kendi xml'sinde tanımlanan döndürücü metnim için bile harici yazı tipimi seçmem mümkün mü?

Teşekkür ederim.

Cevapla DÜZENLE:

Bu çalışıyor:

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

Eklemek gerekli olabilir

import android.view.ViewGroup;

Dosyanızın üst kısmındaki içe aktarmalar listenize. Bazı nedenlerden dolayı Eclipse, koda dahil olan ViewGroup sınıfını tanımadığında bu öneride bulunmaz.


2
Çok teşekkürler dostum .. Uzun bir mücadeleden sonra bunu buldum. Bu benim günümü kurtardı
Andro Selva

cevap eklediğiniz için teşekkürler!
CommonSenseCode

Çok güzel sorular ...
Rahul Kushwaha

Yanıtlar:


81

Bu (fikir ikisini de kullanarak benim için çalıştı ne CommonsWare en ve gsanllorente en cevapları):

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

Siz de benim gibi Spinner'ı ArrayAdapter.createFromResource()ve bir dizi kaynağı kullanarak ( Spinner belgelerinde olduğu gibi ) orijinal olarak doldurduysanız, MySpinnerAdapter'ı şu şekilde kullanırsınız:

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

1
Harika! Daha da ileri gittim ve bağdaştırıcıdan assignAdapterWithOptions(Spinner spinner, int textArrayResId)bağlamı alarak spinner.getContext()ve içindeki eğiriciye atayarak bir yöntem yarattım (eğirme düzenleri tüm uygulamamın yerine geçer)
IG Pascual

Bu bana çok yardımcı oluyor. @ Jonik
Rahul Kushwaha

24

Yazı tipini kendi özel SpinnerAdapter, getView()ve içinde uygularsınız getDropDownView().


Sorumu en son sorunumla düzenledim, lütfen neyi yanlış yaptığımı söyleyebilir misiniz? Tnx
DixieFlatline

1
@DixieFlatline: android.view.ViewGroupMuhtemelen için bir içe aktarma eklemeniz gerekiyor
CommonsWare

15

Bağdaştırıcınızı başka bir dosyada uygularsanız, Parametre olarak Bağlam'a sahip olduğunuz için Bağdaştırıcının yapıcısından "getAssets ()" işlevine erişebilirsiniz.

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

bu gerçekten yardımcı oluyor, Teşekkürler :)
Jashan PJ

Bu, benim için işe findViewById(R.id.text1)yaramasa da bir nevi yararlıydı: ID doğru olmasına rağmen TextView'ı bulamıyor gibiydi. Bu koddaki diğer bazı sorunlar: 1) eksik dönüş ifadesi getView(), 2) kullanılmayan alan recurso, 3) bir değişkeni adlandırmak gibi bazı stil sorunları spinner_text(olması gerekir spinnerText). İşte benim için ne işe yaradı .
Jonik

4

Bunu deneyin özel custom_spinner.xml oluşturun

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

    />

Bunun gibi özel CheckedtextView oluşturun

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

    }
}

yeni düzeni uygula

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

Bunun daha iyi olacağını düşünüyorum çünkü elinizi adaptörde kirletmenize gerek yok ve bu CustomTextview'i Uygulamanızda başka herhangi bir yerde kullanabilirsiniz.
Milad

2

Bu, önceki cevabımın devamı: https://stackoverflow.com/a/51100507/787399

Uyumluluk nedenlerinden dolayı, Android'deki widget'lara karşı stilleri ve özelleştirilmiş sınıfları kullanabilirsiniz. Android seviye 15'in üzerinde olmasına rağmen, yeni /res/fontkaynak klasörleri tanıtıldı:

Android'de Yazı Tipi Kaynakları

Adım 1: item_spinner.xml'yi bildirin

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

adım 2: item_spinner_dropdown.xml beyan edin:

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

Adım 3: Düzende çarkı kullanın:

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

[Not: FontTextView’un kimliği hem düzenlerde, dönen öğede hem de açılır öğede aynıdır]

Adım 4: Etkinlik / Parça içinde kullanın:

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

[Daha fazla bilgi için diğer gönderime bakın: https://stackoverflow.com/a/51077569/787399 ve https://stackoverflow.com/a/22164007/787399 ]


0

Lütfen FontTextView, FontEditView, FontRadioButton, FontCheckBox ve FontButton'ın temel özelleştirmesini izleyin.

[Kesin yanıt için, bu kılavuzu gördükten sonra lütfen şu adrese bakın: https://stackoverflow.com/a/51113022/787399 ]

ArrayAdapter öğe düzeninde şunun gibi özel FontTextView kullanın:

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

kodu kullanın:

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

    }

İlgili XML'lerde stili ve öznitelikleri açıklayın:

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

ve

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

daha fazla stil tanımlayın:

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

strings.xml dosyanızdaki yazı tiplerinden bahsedin:

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

ve biraz kod ve zaman tasarrufu sağlayan düzenlerde kullanın:

<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 düzeyi 16 ve üzerinde, tüm bunlar basitleştirilmiştir, çünkü artık TTF ve diğer yazı tipi kaynaklarını /res/fontvarlıklar yerine klasörde tutabilirsiniz . Bu, özel sınıfların, stillerin ve özniteliklerin çoğunu kaldırır, bakınız:

Android'de Yazı Tipi Kaynakları

Stil ile Mutlu Kodlama !! :-)


Uzun cevap, ama bir kez işe yarıyor. Daha sonra bu tekrar kullanılabilir.
Abhinav Saxena

-1

Arkadaşlar harika bir çözüm buldum, orignal adaptörü yardımcıya sarıyorum

Bu sınıfı SpinnerViewHelper ve Android ile mutlu bir program kullanın

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

Lambda ifadesi kullanılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.