周末闲来无事,研究下Android的Popuwindow控件的使用方法。
在写Demo的过程中发现了多处容易让新手出错的地方,于是决定上CSDN记录下来。
下面首先贴出Demo代码:
Step1: 使用Popuwindow,目的当然是希望在点击某个控件时在屏幕上弹出一系列菜单,或者特定的布局。所以我们需要为 Popuwindow创建一个布局文件 (popu_item.xml)
<?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:orientation="horizontal"
android:background="#eaeaea"
>
<TextView
android:id="@+id/menu_down_new"
android:layout_width="wrap_content"
android:layout_height="55dp"
android:textSize="14sp"
android:layout_weight="1"
android:gravity="center"
android:text="下载最新"
/>
<TextView
android:id="@+id/menu_down_all"
android:layout_width="wrap_content"
android:layout_height="55dp"
android:textSize="14sp"
android:layout_weight="1"
android:gravity="center"
android:text="下载全部"
/>
</LinearLayout>
Step2: Popuwindow为弹出层,当然得依赖于一个主界面了。(MainActivity.java)
public class MainActivity extends Activity {
private PopupWindow popWin;
private TextView down_new;
private TextView down_all;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
public void initView(){
View view = this.getLayoutInflater().inflate(R.layout.popu_item, null);
down_new = (TextView) view.findViewById(R.id.menu_down_new);
down_all = (TextView) view.findViewById(R.id.menu_down_all);
Drawable down_new_drawable = this.getResources().getDrawable(android.R.drawable.stat_sys_download);
down_new_drawable.setBounds(0, 20, down_new_drawable.getMinimumWidth(), down_new_drawable.getMinimumHeight()+20);
down_new.setCompoundDrawables(null, down_new_drawable, null, null);
Drawable down_all_drawable = this.getResources().getDrawable(android.R.drawable.stat_sys_download_done);
down_all_drawable.setBounds(0,20,down_all_drawable.getMinimumWidth(),down_all_drawable.getMinimumHeight()+20);
down_all.setCompoundDrawables(null, down_all_drawable, null, null);
popWin = new PopupWindow(view, ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
popWin.setOutsideTouchable(true);
ColorDrawable cd = new ColorDrawable(-0000);
popWin.setBackgroundDrawable(cd);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_MENU){
popWin.showAtLocation(this.getWindow().getDecorView(), Gravity.BOTTOM,0,0);
}
return super.onKeyDown(keyCode, event);
}
上面是一个点击系统菜单键,在界面的底部弹出一个菜单的案例。
问题一 :popWin.setOutsideTouchable(true); 这个方法,一看就知道是设置点击Popuwindow区域外的地方时隐藏
Popuwindow的方法。博主想当然的以为这样就O了 - -!程序运行起来之后,发现点击非Popuwindow区域时并没隐藏。
经过查阅资料才发现,原来要让popWin.setOutsideTouchable(true);生效,就必须为Popuwindow设置背景!!!
加入以下代码便能成功:
ColorDrawable cd = new ColorDrawable(-0000);
popWin.setBackgroundDrawable(cd);
问题二 : Popuwindow不能在Activity的生命周期内操作。
我尝试在打开界面的时候让Popuwindow默认显示出来,一开始的思路是在onCreate()中直接创建Popuwindow,并showAtLocation.后来。。。后来就奔溃了!原来,如果在Activity生命周期内运行Popuwindow,由于popuwindow的运行机制,会导致程序被Crash掉。。。
还有一个比较无语的错误。非常简单,但我竟然还是犯了这个错。。。为此博主内心十分的羞愧。。。
View view = this.getLayoutInflater().inflate(R.layout.popu_item, null);
down_new = (TextView) view.findViewById(R.id.menu_down_new);
down_all = (TextView) view.findViewById(R.id.menu_down_all);
这里,通过getLayoutInflater塞进来的视图,必须经过它本身的view对象来进行findViewById...
博主一开始想当然的就直接findViewById了。。。于是我又见到了可恨的NullPointException..................