8

Sto cercando di personalizzare lo spinner della barra delle azioni di Android su qualcosa che come l'applicazione di Google Maps. Fondamentalmente, solo il 'sottotitolo' dovrebbe riflettere ciò che scelgo dallo spinner mentre il 'titolo' rimane lo stesso. Comprendo che è necessario creare uno spinner personalizzato e devo eseguire l'override del metodo getView() e getDropDownView(). Ma sono molto confuso su come sovrascrivere correttamente questi metodi. Alcuni possono per favore spingermi nella giusta direzione. Spero di aver chiarito la mia domanda.Personalizzazione spinner barra di azioni

the image screenshot http://androidcowboy.com/wp-content/uploads/2012/12/google-currents-3a.jpg

Dato che segue è il mio codice.

public class CustomSpinnerAdapter extends BaseAdapter { 

private LayoutInflater inflater; 

private final Context context; 
private final String[] dropDown; 
private final String mainText; 
private final String subText; 

public CustomSpinnerAdapter(Context context, 
     String mainText, String subText,String[] dropDown) { 

    inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    this.mainText=mainText; 
    this.subText=subText; 
    this.context = context; 
    this.dropDown=dropDown; 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 




@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 

    View actionBarView = inflater.inflate(R.layout.custom_spinner, null); 
    TextView textView = (TextView) actionBarView 
      .findViewById(R.id.custom_spinner_textview); 
    textView.setText(mainText); 
    return actionBarView; 
} 

@Override 
public View getDropDownView(int position, View convertView, ViewGroup parent) { 

    View dropDownView = inflater.inflate(R.layout.custom_spinner, null); 
    TextView dropDownTextView = (TextView) dropDownView 
      .findViewById(R.id.custom_spinner_dropdown_textview); 

    dropDownTextView.setText(dropDown[position]); 
    return dropDownView; 

} 
} 

risposta

17

Ho risolto.

elenco della mia classe di adattatori:

public class AdapterBaseMaps extends BaseAdapter { 

Context context; 
int layoutResourceId; 
ArrayList<ObjectLayers> data; 
LayoutInflater inflater; 

public AdapterBaseMaps(Context context, int textViewResourceId, 
     ArrayList<ObjectLayers> data) { 
    // super(a, textViewResourceId, data); 
    this.data = data; 
    inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    this.context = context; 
    this.layoutResourceId = textViewResourceId; 

} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View actionBarView = inflater.inflate(R.layout.ab_main_view, null); 
    TextView title = (TextView) actionBarView 
      .findViewById(R.id.ab_basemaps_title); 
    TextView subtitle = (TextView) actionBarView 
      .findViewById(R.id.ab_basemaps_subtitle); 
    title.setText(context.getResources() 
      .getString(R.string.label_cartravel)); 
    subtitle.setText(data.get(position).getLayerName()); 
    return actionBarView; 

} 

@Override 
public View getDropDownView(int position, View convertView, ViewGroup parent) { 
    View actionBarDropDownView = inflater.inflate(
      R.layout.ab_dropdown_view, null); 
    TextView dropDownTitle = (TextView) actionBarDropDownView 
      .findViewById(R.id.ab_basemaps_dropdown_title); 

    dropDownTitle.setText(data.get(position).getLayerName()); 

    return actionBarDropDownView; 

} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return data.size(); 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

} 

elenco di ab_main_view.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" > 

<TextView 
    android:id="@+id/ab_basemaps_title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="TextView" 
    android:textSize="20sp" 
    android:textColor="@color/White" /> 

<TextView 
    android:id="@+id/ab_basemaps_subtitle" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/ab_basemaps_title" 
    android:text="TextView" 
    android:textColor="@color/White" 
    android:textSize="13sp" /> 

</RelativeLayout> 

elenco di ab_dropdown_view.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" > 

<TextView 
    android:id="@+id/ab_basemaps_dropdown_title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:textSize="20sp" 
    android:padding="5dp" 
    android:textColor="@color/White" /> 

</RelativeLayout> 
+0

ciò che è Objectlayers? – ajay

2

La prima risposta è utile, ma la sottoclasse Adapter non è necessaria.

Definire XML come in @ di user1624587 risposta poi semplicemente riferimento in public boolean onCreateOptionsMenu(Menu menu):

ArrayAdapter<CharSequence> someAdapter = new 
     ArrayAdapter<CharSequence>(context, R.layout.ab_main_view, 
     android.R.id.text1, getResources().getStringArray(R.array.some_array)); 


    someAdapter.setDropDownViewResource(R.layout.ab_dropdown); 

    MenuItem item = menu.add("SomeTitle").setActionView(R.layout.some_spinner); 
    item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); //or whatever 

    someSpinner = (someSpinner) item.getActionView(); 
    someSpinner.setAdapter(someAdapter); 
    ...etc