【控件篇】Popuwindow 新手使用误区讲解

周末闲来无事,研究下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..................

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值