¿Cómo configurar la fuente personalizada de la fuente para el texto de Spinner mediante progtwigción?

Tengo un archivo de fuente ttf en mi carpeta de activos. Sé cómo usarlo para las textviews con:

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

He definido buscar mi texto spinner en su propio archivo xml (como es habitual en Android):

   

Simplemente no puedo hacer referencia a esta vista de texto desde el código, siempre obtengo excepciones de puntero nulo. Por ejemplo, intenté:

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

¿Es posible seleccionar mi fuente externa incluso para mi texto giratorio definido en su propio xml?

Gracias.

EDIT con respuesta:

Esto funciona:

 String [] items = new String[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); 

Puede ser necesario agregar

 import android.view.ViewGroup; 

A su lista de importaciones en la parte superior de su archivo. Por alguna razón, Eclipse no hace esta sugerencia cuando no reconoce la clase ViewGroup involucrada en el código.

Esto es lo que funcionó para mí (usando ideas tanto de las respuestas de CommonsWare como 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 usted, como yo, ArrayAdapter.createFromResource() originalmente Spinner usando ArrayAdapter.createFromResource() y un recurso de matriz (como en la documentación de Spinner ), entonces usaría MySpinnerAdapter de la siguiente manera:

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

SpinnerAdapter aplicar la fuente a través de su propio SpinnerAdapter , en getView() y getDropDownView() .

Si implementa su Adaptador en otro archivo, puede acceder a la función “getAssets ()” desde el constructor del Adaptador, ya que tiene el Contexto como parámetro.

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

Intenta esto crear personalizado custom_spinner.xml

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

Crea un CheckedtextView personalizado como este

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

implementa el nuevo diseño

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

Siga la personalización básica de FontTextView, FontEditView, FontRadioButton, FontCheckBox y FontButton.

[Para obtener la respuesta exacta, después de ver esta guía, consulte: https://stackoverflow.com/a/51113022/787399 ]

Use FontTextView personalizado, en el diseño del elemento ArrayAdapter, así:

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

usa el código:

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

Describe el estilo y los atributos en las respectivas xmls:

          

y

    

definir algunos estilos más:

    

menciona fonts en tus strings.xml:

 ... fonts/roboto_regular.ttf ... 

y uso en los diseños que ahorran código y tiempo:

  

¡Feliz encoding con estilo! 🙂

Esta es la continuación de mi respuesta anterior: https://stackoverflow.com/a/51100507/787399

Paso 1: declare item_spinner.xml

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

paso 2: declare item_spinner_dropdown.xml:

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

Paso 3: Usa el spinner en el diseño:

     

[Nota: el id de FontTextView es el mismo en los diseños, en el elemento giratorio y en el elemento desplegable]

Paso 4: úsalo en la Actividad / Fragmento:

 private void initSpinnerBusinessType(View rootView) { String[] ar_dd_bus_type = getResources().getStringArray(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); } 

[para obtener más orientación, consulte mi otra publicación: https://stackoverflow.com/a/51077569/787399 y https://stackoverflow.com/a/22164007/787399 ]

Chicos, encontré una solución increíble, envuelvo el adaptador de señal por ayudante como

Utilice esta clase SpinnerViewHelper y feliz progtwigción con Android

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

Se usa la expresión Lambda.