Показать выпадающий программно в ActionBar/ActionBarSherlock

У меня есть активность с использованием ActionBarSherlock с ActionBar.NAVIGATION_MODE_LIST.

При входе на страницу я хочу, чтобы счетчик на панели действий расширялся программно после того, как он заполняется элементами, поэтому пользователю необходимо выбрать элемент. На данный момент первый элемент в адаптере выбирается автоматически.

Я не могу найти хороший способ расширить счетчик в панели действий программным способом. Нужно ли использовать пользовательское представление для достижения этого поведения?

Я посмотрел на панель действий с HierarchyViewer и счетчик не имеет установленного идентификатора. Есть идеи?

Ответ 1

Вот код, как я создаю пользовательскую панель действий с 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>

чтобы развернуть вызов spinner

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

Ответ 2

Лучший и простой способ реализовать эту функциональность, расширив StringAdapter, если вы ее используете. В противном случае вы можете взять любой адаптер в зависимости от того, что вы используете.

Шаги:

  • создать адаптер

       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 (меню меню) {

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

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

Попробуйте это. Он работает (Y)