I have an activity using ActionBarSherlock
with 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 cutom 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?
Here is code how I create custom action bar with 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);
}
Adapter
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);
}
}
Layout
<?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();
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.
Steps :
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)