ListPopupWindow用法

基本用法

ListPopupWindow也是在参照控件下方显示列表窗口,不同的是,它在展示上更加灵活,开发者可以自定义列表弹窗的大小与样式。
下面是ListPopupWindow的常用方法说明:
setAdapter : 设置下拉列表的数据适配器。
setModal : 设置显示模式。通常设置为true。
setWidth : 设置下拉列表窗口的宽度。
setHeight : 设置下拉列表窗口的高度。
setAnchorView : 设置下拉列表的参照控件。下拉列表在显示时将展现在参照控件的下方,注意:如果不设置参照控件就直接调用show函数,系统不知道要把下拉列表在何处展示,只能是异常退出了。
setDropDownGravity : 设置下拉列表的对齐方式。Gravity.START表示与参照控件左侧对齐,Gravity.END表示与参照控件右侧对齐。注意:该函数只在4.4.2及以上版本中使用。
setOnItemClickListener : 设置列表项的点击监听器。
show : 显示下拉列表窗口。
dismiss : 关闭下拉列表窗口。
setOnDismissListener : 设置下拉列表的关闭监听器。

ListPopupWindow与EditText结合使用,效果上有点类似AutoCompleteTextView,即都会在编辑框下方弹出文本列表可供选择。但它们之间也有明显的区别:AutoCompleteTextView一旦设置适配器,则它会根据编辑框的文本来自动调整文本列表;而ListPopupWindow的文本列表是固定的,不会自动调整。
下面是ListPopupWindow的代码示例:

import android.annotation.TargetApi;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListPopupWindow;

@TargetApi(Build.VERSION_CODES.KITKAT)
public class ListPopupActivity extends Activity implements OnClickListener, OnItemClickListener {

    private EditText et_list;
    private ListPopupWindow mPopup;
    private String[] mGoodArray={"pencil", "potato", "peanut", "carrot", "cabbage", "cat"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

        et_list = (EditText) findViewById(R.id.et_list);
        et_list.setOnClickListener(this);
        Button btn_show_list = (Button) findViewById(R.id.btn_show_list);
        btn_show_list.setOnClickListener(this);

        mPopup = new ListPopupWindow(this);
        ArrayAdapter adapter = new ArrayAdapter(this, R.layout.spinner_item, mGoodArray);
        mPopup.setAdapter(adapter);
        mPopup.setWidth(LayoutParams.WRAP_CONTENT);
        mPopup.setHeight(LayoutParams.WRAP_CONTENT);
        mPopup.setModal(true);
        mPopup.setOnItemClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.et_list) {
            if (Build.VERSION.SDK_INT >=  Build.VERSION_CODES.KITKAT) {
                mPopup.setDropDownGravity(Gravity.END);
            }
            mPopup.setAnchorView(v);
            mPopup.show();
        } else if (v.getId() == R.id.btn_show_list) {
            if (Build.VERSION.SDK_INT >=  Build.VERSION_CODES.KITKAT) {
                mPopup.setDropDownGravity(Gravity.START);
            }
            mPopup.setAnchorView(v);
            mPopup.show();
        }
    }

    @Override
    public void onItemClick(AdapterView<!--?--> parent, View view, int position, long id) {
        et_list.setText(mGoodArray[position]);
        et_list.setSelection(et_list.getText().length());
        mPopup.dismiss();
    }

}

新旧ListPopupWindow的区别

v7-appcompat库中也提供了新版ListPopupWindow,据我观察在功能上没什么区别,主要是在弹窗的显示风格上有所差异,如旧版的ListPopupWindow有明显的窗口边框与边缘阴影,而新版的ListPopupWindow就没有窗口边框。

下面是旧版ListPopupWindow的UI,有窗口边框:
!查看

下面是新版ListPopupWindow的UI,没有窗口边框:
!查看

PopupMenu、ListPopupWindow和Spinner的区别

PopupMenu和ListPopupWindow同样都是列表弹窗,与spinnerMode=”dropdown”的Spinner极其相似,都可以用来做下拉列表的选择弹窗,不过也有部分差异。下面是博主总结的它们之间的区别:
1、查看源码,会发现PopupMenu和Spinner内部都是使用ListPopupWindow实现下拉列表效果,所以ListPopupWindow是基础。
2、PopMenu的列表页面无法定制UI,只能显示光秃秃的文字;而ListPopupWindow和Spinner可以通过适配器来设置每项的布局风格,当然ListPopupWindow是最灵活的,不但可在左侧显示列表,还能在右侧显示列表。
3、PopMenu可通过子菜单实现多级菜单效果,而ListPopupWindow和Spinner只有一级列表。
4、ListPopupWindow和Spinner可以设置默认选中项,而PopMenu没有默认选中项。
5、Spinner既可以下拉列表来展示,也可以对话框来展示;而PopupMenu和ListPopupWindow只能以下拉列表展示。

猜你喜欢

转载自blog.csdn.net/ZHW1551706847/article/details/78030927