下拉菜单包含字符串+图片

时间:2013-04-19 11:33:35

标签: android drop-down-menu

我正在使用下拉菜单,我只在其中放入一个字符串,但我想在我点击下拉菜单小部件上的操作栏时,当选项列表下降时,我将看到的不仅仅是字符串,而是每个选择,我试图查找它,但我没有找到相关的如何做到这一点。 我所说的是这个例子 http://2.bp.blogspot.com/-mVQddiSMz0I/TzL2y2Ny5uI/AAAAAAAABKo/ikNPtWiPu4w/s1600/Screenshot_2012-02-08-14-01-21.png那么,你能给我一个例子和解释吗? 感谢

5 个答案:

答案 0 :(得分:0)

使用ActionBar,请参阅此文档:

Adding an Action Provider

ShareActionProvider是ActionProvider的扩展,它通过显示操作栏中的可用共享目标列表来促进“共享”操作。

enter image description here

使用ActionProvider,您可以添加菜单,并可以创建自定义菜单项。 这里有如何创建菜单项xml文档:

Menu Resource

参见示例:menu with photo

这里有如何为ShareIntent添加图标流的意见: ShareActionProvider with one icon - looking as simple actionitem

答案 1 :(得分:0)

您的屏幕截图是ListPopupWindow使用的ShareActionProvider

答案 2 :(得分:0)

如果您不需要使用ShareActionProvider,只需使用带有图片和文字的Spinner,则可以在操作栏中添加子菜单,如下所示: https://stackoverflow.com/a/8312985/626787

或者您可以添加Spinner作为操作,并使用CustomAdapter填充。

答案 3 :(得分:0)

正如@mbarrben所说,你不需要ShareActionProvider。您只需要一个Spinner并实现CustomAdapter。您可以在下面看到一个简单示例(Full example here

在您的活动中,您应该拥有:

public class SpinnerIconActivity extends SherlockActivity implements OnNavigationListener{

private SpinnerAdapter mSpinnerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_spinner_icon);

    ActionBar actionBar = getSupportActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);


    List<SpinnerRow> options = new ArrayList<SpinnerRow>();
    options.add(new SpinnerRow("Droid 1", R.drawable.android01));
    options.add(new SpinnerRow("Droid 2", R.drawable.android02));
    options.add(new SpinnerRow("Droid 3", R.drawable.android03));
    mSpinnerAdapter  = new MySpinnerAdapter(getApplicationContext(),
            R.layout.spinner_row, R.id.text, options);

        actionBar.setListNavigationCallbacks(mSpinnerAdapter, this);
   }

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
        getSupportMenuInflater().inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
   }

   @Override
   public boolean onNavigationItemSelected(int itemPosition, long itemId) {
    return false;
   }

}

最重要的是编写自定义适配器。我选择使用ArrayAdapter因为使用它我只需要覆盖一个方法

编写customAdapter的方法与创建具有一个基本区别的可自定义ListView相同,而不是覆盖getView方法,您必须覆盖getDropDownView

所以,下面是我的例子:

public class MySpinnerAdapter extends ArrayAdapter<SpinnerRow> {

private List<SpinnerRow> rows;
private int resource;

public MySpinnerAdapter(Context context, int resource,
        int textViewResourceId, List<SpinnerRow> objects) {
    super(context, resource, textViewResourceId, objects);
    rows = objects;
    this.resource = resource;
}

static class ViewHolder {

    TextView text;
    ImageView icon;
}

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
    ViewHolder  holder = new ViewHolder();
    if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(resource,
                parent, false);

        holder.text = (TextView) convertView.findViewById(R.id.text);
        holder.icon = (ImageView) convertView.findViewById(R.id.icon);

        convertView.setTag(holder);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    SpinnerRow currentRow = rows.get(position);
    holder.text.setText(currentRow.toString());
    holder.icon.setImageDrawable(
            getContext().getResources().getDrawable(currentRow.getIconResourceId()));


    return convertView;
}

}

答案 4 :(得分:0)