Comment définir la police de police personnalisée pour le texte Spinner par programme?

J’ai un fichier de fonts ttf dans mon dossier de ressources. Je sais comment l’utiliser pour les vues de texte avec:

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

J’ai défini l’apparence de mon texte spinner dans son propre fichier xml (comme d’habitude dans Android):

   

Je ne peux simplement pas faire référence à cette textview du code, je reçois toujours des exceptions de pointeur nul. Par exemple, j’ai essayé:

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

Est-il possible de sélectionner ma police externe même pour mon texte spinner défini dans son propre XML?

Je vous remercie.

EDIT avec réponse:

Cela marche:

 Ssortingng [] items = new Ssortingng[2]; items[0]="Something1"; items[1]="Something2"; ArrayAdapter adapter = new ArrayAdapter(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); 

Il peut être nécessaire d’append

 import android.view.ViewGroup; 

À votre liste d’importations en haut de votre fichier. Pour une raison quelconque, Eclipse ne fait pas cette suggestion quand il ne reconnaît pas la classe ViewGroup impliquée dans le code.

C’est ce qui a fonctionné pour moi (en utilisant les idées des réponses de CommonsWare et de gsanllorente ):

 private static class MySpinnerAdapter extends ArrayAdapter { // 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 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; } } 

Si vous, comme moi, ArrayAdapter.createFromResource() origine le Spinner en utilisant ArrayAdapter.createFromResource() et une ressource de tableau (comme dans la documentation de Spinner ), vous utiliseriez alors MySpinnerAdapter comme ceci:

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

Vous appliqueriez la police via votre propre SpinnerAdapter , dans getView() et getDropDownView() .

Si vous implémentez votre adaptateur dans un autre fichier, vous pouvez accéder à la fonction “getAssets ()” à partir du constructeur de l’adaptateur, car vous avez le paramètre Context.

 public class YourItemAdapter extends ArrayAdapter { int recurso; Typeface tf; public YourItemAdapter(Context _context, int _resource, List _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); } } 

Essayez cette création personnalisée custom_spinner.xml

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

Créez un CheckedtextView personnalisé comme ceci

 import android.content.Context; import android.graphics.Typeface; import android.util.AtsortingbuteSet; import android.widget.CheckedTextView; public class CheckedTextViewC extends CheckedTextView { public CheckedTextViewC(Context context, AtsortingbuteSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } public CheckedTextViewC(Context context, AtsortingbuteSet 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*/); } } } } 

mettre en œuvre la nouvelle mise en page

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

Veuillez suivre la personnalisation de base de FontTextView, FontEditView, FontRadioButton, FontCheckBox et FontButton.

[Pour la réponse exacte, après avoir vu ce guide, veuillez consulter: https://stackoverflow.com/a/51113022/787399 ]

Utilisez la police personnalisée FontTextView, dans la présentation de l’élément ArrayAdapter, comme ceci:

 public class FontEditText extends AppCompatEditText { // private Ssortingng FONT = "fonts/roboto_regular.ttf"; public FontEditText(Context context) { super(context, null); // setFontFromAsset(context, null, R.style.DefaultFontTextView); // FONT = getContext().getSsortingng(R.ssortingng.font_roboto_regular); } public FontEditText(Context context, @Nullable AtsortingbuteSet attrs) { super(context, attrs); setFontFromAsset(context, attrs, R.attr.fetFontStyle); } public FontEditText(Context context, @Nullable AtsortingbuteSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setFontFromAsset(context, attrs, defStyleAttr); } private void setFontFromAsset(Context context, AtsortingbuteSet 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); } } 

utilisez le code:

 public void setFontFromAsset(View view, int[] resViewStyleable, int resStyleableViewFontFace, AtsortingbuteSet attrs, int defStyle) { Ssortingng strFont = null; Typeface tfFontFace = null; Ssortingng strButton = FontButton.class.getCanonicalName(), strTextView = FontTextView.class.getCanonicalName(), strEditText = FontEditText.class.getCanonicalName(), strView = view.getClass().getCanonicalName(); try { if (view.isInEditMode()) { return; } //R.ssortingng.font_roboto_regular strFont = context.getSsortingng(R.ssortingng.font_roboto_regular); tfFontFace = Typeface.createFromAsset(context.getAssets(), strFont); //AtsortingbuteSet set, int[] attrs, int defStyleAttr, int defStyleRes //R.styleable.FontButton TypedArray a = context.obtainStyledAtsortingbutes(attrs, resViewStyleable, defStyle, 0); //R.styleable.FontButton_btFontFace Ssortingng derivedFont = a.getSsortingng(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(); } } 

Décrivez le style et les atsortingbuts dans les fichiers XML respectifs:

          

et

    

définir quelques styles supplémentaires:

    

Mentionnez les fonts dans votre ssortingngs.xml:

 ... fonts/roboto_regular.ttf ... 

et utiliser dans les mises en page en sauvegardant du code et du temps:

  

Heureux codage avec style !! 🙂

Ceci est la suite de ma réponse précédente: https://stackoverflow.com/a/51100507/787399

Etape 1: déclarer item_spinner.xml

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

étape 2: déclarez item_spinner_dropdown.xml:

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

Étape 3: Utilisez la fonction spinner dans la mise en page:

     

[Note: l’identifiant de FontTextView est le même dans les deux mises en page, les éléments spinner et le menu déroulant]

Étape 4: utilisez-le dans l’activité / le fragment:

 private void initSpinnerBusinessType(View rootView) { Ssortingng[] ar_dd_bus_type = getResources().getSsortingngArray(R.array.ar_dd_bus_type); List lst_bus_type = Arrays.asList(ar_dd_bus_type); ArrayList ar_bus_type = new ArrayList<>(lst_bus_type); //== ArrayAdapter 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); } 

[pour plus d’informations, consultez mon autre article: https://stackoverflow.com/a/51077569/787399 et https://stackoverflow.com/a/22164007/787399 ]

Les gars, j’ai trouvé une solution géniale, je wrap orignal adaptateur par assistant comme

Utilisez cette classe SpinnerViewHelper et la programmation avec Android

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

L’expression lambda est utilisée.