在ActionBar / ActionBarSherlock中以编程方式显示下拉菜单

我有一个活动使用ActionBarSherlock ActionBar.NAVIGATION_MODE_LIST

当进入页面时,我想让操作栏中的微调框以项目填充后以编程方式展开,以便用户需要选取一个项目。 截至目前,适配器中的第一个项目是自动select的。

我想不出一个很好的方式来以编程方式展开操作栏中的微调框。 我是否需要使用cutom视图来实现这种行为?

我用HierarchyViewer查看了操作栏,并且微调器没有设置id。 有任何想法吗?

Related of "在ActionBar / ActionBarSherlock中以编程方式显示下拉菜单"

这里是我如何创build与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); } 

适配器

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

布局

 <?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> 

扩大微调电话

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

通过扩展StringAdapter来实现这个function的最好和简单的方法,如果你正在使用它。 否则,你可以采取任何适配器,无论你正在使用。

脚步 :

  • 创build一个适配器

      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 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); 
  • 如果你想打开它作为屏幕打开,只需使用下面提到的代码

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

尝试这个 。 它工作(Y)