先来看下效果吧,点击右边按钮后出现一个弹出菜单,点击菜单中文字可以响应点击事件。
下面就来实现这个效果。
首先是布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@color/popmenuGray" android:orientation="vertical" android:gravity="center" android:padding="20dp"> <TextView android:id="@+id/course_popup_item1" android:gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/course_popmenu1" android:textColor="#ffffff" android:drawablePadding="10dp" android:drawableStart="@drawable/popmenu1" android:drawableLeft="@drawable/popmenu1"/> <TextView android:id="@+id/course_popup_item2" android:gravity="center" android:layout_marginTop="15dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/course_popmenu2" android:textColor="#ffffff" android:drawablePadding="10dp" android:drawableStart="@drawable/popmenu2" android:drawableLeft="@drawable/popmenu2"/> </LinearLayout>
界面布局也比较简单,这里就省略了。
下面是效果的实现:
</pre><pre name="code" class="java">private void showPopupWindow() { if(popupWindow != null && popupWindow.isShowing()){ popupWindow.dismiss(); return ; } if(popupWindow == null) { View view = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)) .inflate(R.layout.course_popup_window, null); popupWindow = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT,true); TextView item1 = (TextView) view.findViewById(R.id.course_popup_item1); TextView item2 = (TextView) view.findViewById(R.id.course_popup_item2); item1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(CourseActivity.this,"已定制",Toast.LENGTH_SHORT).show(); } }); item2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(CourseActivity.this,"已完成",Toast.LENGTH_SHORT).show(); } }); } popupWindow.setBackgroundDrawable(new BitmapDrawable()); popupWindow.setOutsideTouchable(true); popupWindow.showAsDropDown(mBtnAdd,-120,10);//设置popupWindow出现位置 popupWindow.setFocusable(true); popupWindow.update(); }
代码很简单,不过有些地方要注意一下:
1.
popupWindow.setBackgroundDrawable(new BitmapDrawable()); popupWindow.setOutsideTouchable(true);
这两句是用来使得点击其他地方让popupWindow消失的。
我刚开始的时候代码是这样的
popupWindow.showAsDropDown(mBtnAdd,-120,10);//设置popupWindow出现位置 popupWindow.setFocusable(true);
<pre name="code" class="java">popupWindow.setBackgroundDrawable(new BitmapDrawable()); popupWindow.setOutsideTouchable(true);
popupWindow.update();
点击按钮之后popupWindow是能出来,不过点击其他地方不能让他消失,而且所有的点击事件包括返回按钮事件都没用了,在网上找了半天也没有结果,最后无意中把这两句话放到前面就行了(为什么?????)
2.
TextView item1 = (TextView) view.findViewById(R.id.course_popup_item1); TextView item2 = (TextView) view.findViewById(R.id.course_popup_item2);
注意是
(TextView) view.findViewById(R.id.course_popup_item1);
而不是
(TextView) findViewById(R.id.course_popup_item1);
刚开始我用的是下面一个,进去之后一点击就崩溃,后来才知道TextView是在popWindow中,要找到这个控件要在popWindow中找,所以要用View.fnidViewById,而不能直接findViewById
参考资料 www.chinambs.com/bbs/thread-1009-1-1.html
有什么不对的地方欢迎大家指出来。