Android PopupWindow初步使用

来源:互联网 发布:ug nx8.0数控编程教程 编辑:程序博客网 时间:2024/06/05 12:41
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <RelativeLayout        android:layout_width="match_parent"        android:layout_height="45dp" >        <!-- 输入框 -->        <EditText            android:id="@+id/et_content"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:background="@drawable/et_bg"            android:paddingLeft="3dp"            android:paddingRight="3dp" />        <ImageView            android:id="@+id/iv_arrow"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_alignParentRight="true"            android:layout_centerVertical="true"            android:src="@drawable/down_arrow" />    </RelativeLayout></RelativeLayout>
public class MainActivity extends Activity implements OnClickListener,        OnItemClickListener {    private ImageView mIvArrow;    private EditText mEtContent;    private PopupWindow mWindow;    private List<String> mDatas;    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        // 模拟假数据        mDatas = new ArrayList<String>();        for (int i = 0; i < 50; i++) {            mDatas.add(1000000 + i + "");        }    }    private void initView() {        mIvArrow = (ImageView) findViewById(R.id.iv_arrow);        mEtContent = (EditText) findViewById(R.id.et_content);        // 设置点击事件        mIvArrow.setOnClickListener(this);    }    public void onClick(View v) {        if (v == mIvArrow) {            clickArrow();        }    }    private void clickArrow() {        // 点击小三角弹出list数据展示        // Toast.makeText(this, "弹出list数据展示", Toast.LENGTH_SHORT).show();        // popupwindow        // View contentView = null;// 内容显示的view        if (mWindow == null) {            // TextView contentView = new TextView(this);            // contentView.setText("弹出层的内容view");            // contentView.setBackgroundColor(Color.GRAY);            ListView contentView = new ListView(this);            contentView.setBackgroundResource(R.drawable.listview_background);            contentView.setAdapter(new MyAdapter());// 设置adapter -->List            contentView.setOnItemClickListener(this);            int width = mEtContent.getWidth();// 弹出层的宽度            int height = 300;// 弹出层的高度            mWindow = new PopupWindow(contentView, width, height);            // 设置焦点            mWindow.setFocusable(true);            // 设置点击其他部分收起PopupWindow            mWindow.setOutsideTouchable(true);            mWindow.setBackgroundDrawable(new ColorDrawable());        }        mWindow.showAsDropDown(mEtContent);// 在某某view的 正下方显示    }    class MyAdapter extends BaseAdapter {        public int getCount() {            if (mDatas != null) {                return mDatas.size();            }            return 0;        }        public Object getItem(int position) {            if (mDatas != null) {                return mDatas.get(position);            }            return null;        }        public long getItemId(int position) {            return position;        }        public View getView(final int position, View convertView,                ViewGroup parent) {            ViewHolder holder = null;            if (convertView == null) {                // 没有复用的情况下                convertView = View.inflate(MainActivity.this, R.layout.item,                        null);                holder = new ViewHolder();// 创建holder                convertView.setTag(holder);// 打标记                // 初始化view                holder.ivDelete = (ImageView) convertView                        .findViewById(R.id.item_iv_delete);                holder.ivIcon = (ImageView) convertView                        .findViewById(R.id.item_iv_icon);                holder.tvContent = (TextView) convertView                        .findViewById(R.id.item_tv_content);                holder.ivDelete.setOnClickListener(new OnClickListener() {                    public void onClick(View v) {                        // 删除对应的item                        mDatas.remove(position);                        // ui更新                        notifyDataSetChanged();                    }                });            } else {                // 有复用                holder = (ViewHolder) convertView.getTag();            }            // 给view设置数据            // 获得当前item对应的数据            String data = mDatas.get(position);            holder.tvContent.setText(data);            // 展示convertView            return convertView;        }    }    class ViewHolder {        ImageView ivIcon;        ImageView ivDelete;        TextView tvContent;    }    public void onItemClick(AdapterView<?> parent, View view, int position,            long id) {        String data = mDatas.get(position);        // 文本框显示选中的内容        mEtContent.setText(data);        // 光标选中最后        mEtContent.setSelection(data.length());        // 弹出层消失        mWindow.dismiss();    }}

item.xml:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content" >    <ImageView        android:id="@+id/item_iv_icon"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:layout_centerVertical="true"        android:layout_margin="10dp"        android:src="@drawable/user" />    <TextView        android:id="@+id/item_tv_content"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerVertical="true"        android:layout_margin="10dp"        android:layout_toRightOf="@id/item_iv_icon"        android:text="Content"        android:textSize="20dp" />    <ImageView        android:id="@+id/item_iv_delete"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentRight="true"        android:layout_centerVertical="true"        android:layout_margin="10dp"        android:src="@drawable/delete" /></RelativeLayout>

封装:

public class SpinnerView extends RelativeLayout implements OnClickListener {    private ImageView mIvArrow;    private EditText mEtContent;    private PopupWindow mWindow;    private ListAdapter mAdapter;    private OnItemClickListener mListener;    public SpinnerView(Context context) {        this(context, null);    }    public SpinnerView(Context context, AttributeSet attrs) {        super(context, attrs);        // 绑定xml        View.inflate(context, R.layout.spinner, this);        initView();    }    private void initView() {        mIvArrow = (ImageView) findViewById(R.id.iv_arrow);        mEtContent = (EditText) findViewById(R.id.et_content);        // 设置点击事件        mIvArrow.setOnClickListener(this);    }    public void onClick(View v) {        if (v == mIvArrow) {            clickArrow();        }    }    public void setAdapter(ListAdapter adapter) {        this.mAdapter = adapter;    }    public void setOnItemClickListener(OnItemClickListener listener) {        this.mListener = listener;    }    private void clickArrow() {        // 点击小三角弹出list数据展示        // Toast.makeText(this, "弹出list数据展示", Toast.LENGTH_SHORT).show();        if (mAdapter == null) {            throw new RuntimeException("请调用setAdapter");        }        // popupwindow        // View contentView = null;// 内容显示的view        if (mWindow == null) {            // TextView contentView = new TextView(this);            // contentView.setText("弹出层的内容view");            // contentView.setBackgroundColor(Color.GRAY);            ListView contentView = new ListView(getContext());            contentView.setBackgroundResource(R.drawable.listview_background);            contentView.setAdapter(mAdapter);// 设置adapter -->List            contentView.setOnItemClickListener(mListener);// 设置的是item点击的事件            int width = mEtContent.getWidth();// 弹出层的宽度            int height = 300;// 弹出层的高度            mWindow = new PopupWindow(contentView, width, height);            // 设置焦点            mWindow.setFocusable(true);            // 设置点击其他部分收起PopupWindow            mWindow.setOutsideTouchable(true);            mWindow.setBackgroundDrawable(new ColorDrawable());        }        mWindow.showAsDropDown(mEtContent);// 在某某view的 正下方显示    }    public void setText(String data) {        mEtContent.setText(data);    }    public void setSelection(int length) {        mEtContent.setSelection(length);    }    public void dismissPop() {        if (mWindow != null) {            mWindow.dismiss();        }    }}
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="45dp" >    <!-- 输入框 -->    <EditText        android:id="@+id/et_content"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:background="@drawable/et_bg"        android:paddingLeft="3dp"        android:paddingRight="3dp" />    <ImageView        android:id="@+id/iv_arrow"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentRight="true"        android:layout_centerVertical="true"        android:src="@drawable/down_arrow" /></RelativeLayout>
public class DemoActivity extends Activity implements OnItemClickListener {    private SpinnerView mSv;    private List<String> mDatas;    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_demo);        mSv = (SpinnerView) findViewById(R.id.sv);        // 模拟假数据        mDatas = new ArrayList<String>();        for (int i = 0; i < 50; i++) {            mDatas.add(1000000 + i + "");        }        // 设置点击事件        mSv.setOnItemClickListener(this);        mSv.setAdapter(new MyAdapter());    }    class MyAdapter extends BaseAdapter {        public int getCount() {            if (mDatas != null) {                return mDatas.size();            }            return 0;        }        public Object getItem(int position) {            if (mDatas != null) {                return mDatas.get(position);            }            return null;        }        public long getItemId(int position) {            return position;        }        public View getView(final int position, View convertView,                ViewGroup parent) {            ViewHolder holder = null;            if (convertView == null) {                // 没有复用的情况下                convertView = View.inflate(DemoActivity.this, R.layout.item,                        null);                holder = new ViewHolder();// 创建holder                convertView.setTag(holder);// 打标记                // 初始化view                holder.ivDelete = (ImageView) convertView                        .findViewById(R.id.item_iv_delete);                holder.ivIcon = (ImageView) convertView                        .findViewById(R.id.item_iv_icon);                holder.tvContent = (TextView) convertView                        .findViewById(R.id.item_tv_content);                holder.ivDelete.setOnClickListener(new OnClickListener() {                    public void onClick(View v) {                        // 删除对应的item                        mDatas.remove(position);                        // ui更新                        notifyDataSetChanged();                    }                });            } else {                // 有复用                holder = (ViewHolder) convertView.getTag();            }            // 给view设置数据            // 获得当前item对应的数据            String data = mDatas.get(position);            holder.tvContent.setText(data);            // 展示convertView            return convertView;        }    }    class ViewHolder {        ImageView ivIcon;        ImageView ivDelete;        TextView tvContent;    }    public void onItemClick(AdapterView<?> parent, View view, int position,            long id) {        String data = mDatas.get(position);        // 文本框显示选中的内容        mSv.setText(data);        // 光标选中最后        mSv.setSelection(data.length());        // 弹出层消失        mSv.dismissPop();    }}

参考:Android PopupWindow