【问题标题】:Show dropdown programmatically in ActionBar / ActionBarSherlock在 ActionBar / ActionBarSherlock 中以编程方式显示下拉菜单
【发布时间】:2012-07-31 09:55:43
【问题描述】:

我有一个使用ActionBarSherlockActionBar.NAVIGATION_MODE_LIST 的活动。

进入页面时,我希望操作栏中的微调器在填充项目后以编程方式展开,因此用户需要选择一个项目。到目前为止,适配器中的第一项已自动选择。

我想不出以编程方式扩展操作栏中的微调器的好方法。我是否需要使用自定义视图来实现此行为?

我查看了带有 HierarchyViewer 的操作栏,并且微调器没有设置 id。有什么想法吗?

【问题讨论】:

    标签: android spinner android-actionbar actionbarsherlock


    【解决方案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>
    

    扩展微调器调用

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

    【讨论】:

    • 此外,您可能希望在适配器上使用一个接口,以便在加载数据并填充微调器后获得回调。然后你可以执行你的performClick()
    • @Georgy Gobozov。谢谢,这似乎是你必须做的。即使我想避免使用自定义视图。
    • 您好,感谢您的回答,但如果我尝试运行您在此处提供的示例,则无法在此处使用完整代码 stackoverflow.com/questions/15208285/…。请帮助我错误在哪里。我想要确切的行为作为这个问题
    【解决方案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);
    
    • 如果你想打开它作为屏幕打开,只需使用下面提到的代码

    @覆盖 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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多