Mostrar menú desplegable mediante programación en ActionBar / ActionBarSherlock

I have an activity using ActionBarSherlock con ActionBar.NAVIGATION_MODE_LIST.

When entering the page I want the spinner in the action bar to expand programmatically after it's populated with items so the user needs to pick an item. As of now the first item in the adapter is selected automatically.

I can't figure out a nice way to expand the spinner in the action bar programmatically. Do I need to use a custom view to achieve this behavior?

I've looked on the action bar with the HierarchyViewer and the spinner does not have an id set. Any ideas?

preguntado el 31 de julio de 12 a las 10:07

2 Respuestas

Aquí está el código de cómo creo una barra de acción personalizada con actiobBarSherlock

 private void createCustomActionBar() {

    List<SiteLink> links = new ArrayList<SiteLink>();
    links.add(...)  
    LinksAdapter linkAdapter = new LinksAdapter(this, R.layout.external_link, links);

    View customNav = LayoutInflater.from(this).inflate(R.layout.custom_show_action_bar, null);
    IcsSpinner spinner = (IcsSpinner)customNav.findViewById(R.id.spinner);
    spinner.setAdapter(linkAdapter);


    ImageView refresh = (ImageView) customNav.findViewById(R.id.refresh);
    refresh.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            ...
        }
    });

    ImageView settings = (ImageView) customNav.findViewById(R.id.settings);
    settings.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            ...
        }
    });

    getSupportActionBar().setCustomView(customNav, new ActionBar.LayoutParams(Gravity.RIGHT));
    getSupportActionBar().setDisplayShowCustomEnabled(true);

}

adaptador

private static class LinksAdapter extends ArrayAdapter<SiteLink> {

    private List<SiteLink> strings;
    private Context context;

    private LinksAdapter(Context context, int textViewResourceId, List<SiteLink> objects) {
        super(context, textViewResourceId, objects);
        this.strings = objects;
        this.context = context;
    }

    @Override
    public int getCount() {
        if (strings == null) return 0;
        return strings.size();
    }

    @Override
    public SiteLink getItem(int position) {
        return super.getItem(position);
    }


    // return views of drop down items
    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {

        final SiteLink siteLink = strings.get(position);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        // at 0 position show only icon

        TextView site = (TextView) inflater.inflate(R.layout.external_link, null);
        site.setText(siteLink.getName());

        site.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(siteLink.getUrl()));
                context.startActivity(i);
            }
        });
        return site;


    }


    // return header view of drop down
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        return inflater.inflate(R.layout.icon, null);
    }
}

Disposición

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
               android:gravity="right"
        >


    <com.actionbarsherlock.internal.widget.IcsSpinner
        android:id="@+id/spinner"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:paddingRight="20dp"
        android:layout_gravity="center"
            />

     <ImageView  android:layout_width="fill_parent"
                 android:layout_height="fill_parent"
                 android:src="@drawable/ic_navigation_refresh"
                 android:paddingRight="20dp"
                 android:paddingLeft="10dp"
                 android:layout_gravity="center"
                 android:background="@drawable/action_buttons_background"
                 android:id="@+id/refresh"/>


    <ImageView  android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:src="@drawable/ic_action_settings"
                android:paddingRight="20dp"
                android:background="@drawable/action_buttons_background"
                android:layout_gravity="center"
                android:id="@+id/settings"/>

</LinearLayout>

to expand spinner call

 (getSupportActionBar().getCustomView().findViewById(R.id.spinner)).performClick();

Respondido 03 ago 12, 11:08

Additionally you may want to use an interface on the adapter so you can get a callback once the data has been loaded and the spinner has been populated. Then you can execute your performClick() - DA

@Georgy Gobozov. Thanks, that seem to be what you have to do. Even though I wanted to avoid using a custom view. - comobobby

Hi, Thanks for your answer, but if i try to run the sample you have provided here, its not working here is the full code stackoverflow.com/questions/15208285/…. please help me where is the mistake. i want exact behavior as this question - Naruto

The best and easy way to implement this functionality by extending StringAdapter if you are using it. Otherwise you can take any adapter whichever you are using.

pasos:

  • create an adapter

       class ListNavigationAdapter extends ArrayAdapter<String>{
    
    public Spinner mSpinner; // This is the spinner which is used in actionbar
    
    public ListNavigationAdapter(Context context,
            int resource,
            int textViewResourceId, 
            String[] objects) {
        super(context, resource, 
                textViewResourceId, objects);
        // TODO Auto-generated constructor stub
    }
    
    @Override
    public View getView(int position, 
            View convertView, 
            ViewGroup parent) {
        // TODO Auto-generated method stub
    
        mSpinner = (Spinner) parent;
    
        return super.getView(position, convertView, parent);
    }
    

    }

  • set an adapter to actionbar

// Set up the action bar to show a dropdown list.
    actionBar = getSupportActionBar();
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

    // Set up the dropdown list navigation in the action bar.
    actionBar.setListNavigationCallbacks(
            // Specify a SpinnerAdapter to populate the dropdown list.
          mAdapter = new ListNavigationAdapter(
                    actionBar.getThemedContext(),
                    android.R.layout.simple_list_item_1,
                    android.R.id.text1,
                    new String[] {
                            getString(R.string.title_1),
                            getString(R.string.title_2)
                    }),
            this);
  • if you want to open it as screen open, just use below mentioned code

@Override public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.
    ...........

    if(mAdapter.mSpinner != null){
      mAdapter.mSpinner.performClick();
    }
    return true;
}

Try this . It works (Y)

Respondido el 04 de Septiembre de 14 a las 21:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.