0

与微调器不同,下拉列表应具有固定的预定义名称。当它的元素被点击时,他们应该传递一个 Intent 去他们相应的活动。希望有好的代码。谢谢你。

4

2 回答 2

0

我将在此处发布基础知识,但您可以在我们的 github 存储库 ( https://github.com/todoroo/astrid ) 中找到更多详细信息。基本思想是按照 hanry 的建议扩展 GreenDroid 的 QuickActionWidget。子类看起来像:

public class MenuPopover extends QuickActionWidget {

protected DisplayMetrics metrics;
protected LinearLayout content;

public MenuPopover(Context context) {
    super(context);
    setContentView(R.layout.my_layout);

    content = (LinearLayout) getContentView().findViewById(R.id.content);
    metrics = context.getResources().getDisplayMetrics();

    setFocusable(true);
    setTouchable(true);
}

@Override
protected void populateQuickActions(List<QuickAction> quickActions) {
    // Do nothing
}

@Override
protected void onMeasureAndLayout(Rect anchorRect, View contentView) {
    contentView.setLayoutParams(new     FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,     ViewGroup.LayoutParams.WRAP_CONTENT));
    contentView.measure(MeasureSpec.makeMeasureSpec(getScreenWidth(),     MeasureSpec.EXACTLY),
            ViewGroup.LayoutParams.WRAP_CONTENT);

    int rootHeight = contentView.getMeasuredHeight();

    int offsetY = getArrowOffsetY();
    int dyTop = anchorRect.top;
    int dyBottom = getScreenHeight() - anchorRect.bottom;

    boolean onTop = (dyTop > dyBottom);
    int popupY = (onTop) ? anchorRect.top - rootHeight + offsetY : anchorRect.bottom -  offsetY;

    setWidgetSpecs(popupY, onTop);
}
}

布局文件 my_layout.xml 非常简单:

    <LinearLayout
            android:id="@+id/content"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/gdi_arrow_up"
            android:orientation="vertical"/>

    <ImageView
        android:id="@+id/gdi_arrow_up"
        android:layout_width="27dip"
        android:layout_height="27dip"
        android:layout_marginLeft="-10dip"
        android:scaleType="fitCenter"
        android:layout_marginBottom="-8dip"
        android:src="?attr/asListArrowUp" />

    <ImageView
        android:id="@+id/gdi_arrow_down"
        android:layout_width="27dip"
        android:layout_height="27dip"
        android:scaleType="fitCenter"
        android:layout_marginBottom="-8dip"
        android:layout_below="@android:id/list"/>

    </RelativeLayout>

然后,您只需向 popover 类添加一个简单的辅助方法,即可将视图(即行,带有可选侦听器)添加到 popover 的主体:

public void addViewToContent(View v, OnClickListener listener) {
    content.addView(v);
    if (listener != null) {
        v.setOnClickListener(listener);
    }
}

创建弹出窗口的实例后,您可以通过调用来显示它

menuPopover.show(anchorView);

这是一个稍微简化的版本——在实践中,我们将一些附加信息、侦听器等附加到这些视图中,以使它们在单击时实际执行操作。如果你愿意,你可以在https://github.com/todoroo/astrid查看完整的代码——类是 com.todoroo.astrid.ui.MainMenuPopover。

于 2013-02-07T07:30:07.643 回答
0

为什么您希望它与 Spinner 不同?您可以将微调器设置为在选择项目时启动活动。

    playlistsSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int pos, long arg3) {
            Intent intent = new Intent(this, yourOtherActivity.class);
            intent.putExtra("extra-pos", pos);

            //or, if you want different activites then: 
            Intent newActivity;
            switch (pos) {
            case 0:
                newActivity = new Intent(this, activityB.class); 
                break;
            case 1: 
                newActivity = new Intent(this, activityC.class); 
                break;
            default:
                //do nothing
                break;
            }
            if (newActivity != null) {
                startActivity(newActivity);
            }
        }

您还可以根据自己的喜好自定义微调器的外观。

于 2013-02-07T07:25:36.963 回答