popupwindow那些坑!!!

关于popupwindow,是一个很简单的控件,也比较好用,今天也主要是搞了这个东西,分享一下;

先上代码:

private voidinitMoviePopupWindow() {

View contentViewMovie = LayoutInflater.from(mContext).inflate(R.layout.float_tab_movie, null);

mMoviePopWindow=newPopupWindow();

mMoviePopWindow.setContentView(contentViewMovie);

mMoviePopWindow.setWidth(222);

mMoviePopWindow.setHeight(134);

mMoviePopWindow.setBackgroundDrawable(mContext.getResources().getDrawable(R.drawable.home_cinema));

mMoviePopWindow.setOutsideTouchable(true);

mMoviePopWindow.setTouchable(true);

mDvdLayout= (LinearLayout) contentViewMovie.findViewById(R.id.llyt_dvd);

mLocalMovieLayout= (LinearLayout) contentViewMovie.findViewById(R.id.llyt_local_movie);

mImageDvd= (ImageView) contentViewMovie.findViewById(R.id.imv_dvd);

mImageLocalMovie= (ImageView) contentViewMovie.findViewById(R.id.imv_local_movie);

//设置各个控件的点击响应

mDvdLayout.setOnClickListener(newNoDoubleClickListener() {

@Override

public voidonNoDoubleClick(View v) {

mImageDvd.setVisibility(VISIBLE);

mImageLocalMovie.setVisibility(INVISIBLE);

mSelectedItem=TAB_DVD;

openSeletedItem();

HoverTabViewManager.getInstance().updateCommonView();

}

});

mLocalMovieLayout.setOnClickListener(newNoDoubleClickListener() {

@Override

public voidonNoDoubleClick(View v) {

mImageDvd.setVisibility(INVISIBLE);

mImageLocalMovie.setVisibility(VISIBLE);

mSelectedItem=TAB_LOCAL_MOVIE;

openSeletedItem();

}

});

mMoviePopWindow.setOnDismissListener(newPopupWindow.OnDismissListener() {

@Override

public voidonDismiss() {//因为common模式下,左侧栏不退出,所以设计在军营点歌和扩音播放点击之后,未选中tab下,popupwindow消失时当前选中tab恢复高亮

if(mSelectedItem!=TAB_DVD&&mSelectedItem!=TAB_LOCAL_MOVIE){

mOutLayout.setMinimumWidth(236);

showSelectedLeftTab(mSelectedItem);

}

}

});

}

这个代码主要是初始化popupwindow。首先,popupwindow需要传入一个布局,还需要设置宽和高,设置是否可点击,设置点击空白区域是否自动消失。之后就是跟大部分类似的绑定控件,设置内部控件点击事件啦。还可以设置消失的时候需要做的操作,通过添加一个dismisslistener,代码中可以看到重写了popupwindow类的setdismisslistener函数,在函数中实现了dismisslistener接口,这样popupwindow消失的时候就可以通过回调进入到接口内部的逻辑。有人会问,代码中还有setbackgrpund函数,看名字是给popupwindow设置背景的把,我不需要添加背景,是不是就不用添加了呢?答案是no,如果你不加,你就进入坑了,跟我一样的。没加的话你是看不到popupwindow的界面的,我参考了一些资料说是部分设备不设置背景的话,是不显示popupwindow的,我的确是的。听从建议就加上了。但是加了是不是还不显示呢?

是的呀,原因很简单,因为你只是定义并初始化了popupwindow,但是代码中还缺少最后一步,就是显示出来呀!话不多说,先贴上显示代码:

private voidshowMoviePopupWindow() {

//显示PopupWindow

mMoviePopWindow.showAsDropDown(mView,232,-593,Gravity.LEFT);

mMoviePopWindow.update();

}

显示代码很简单,就是一行代码而已,显示popupwindow主要是有两类函数,一种就是代码中显示的,showasdropdown函数,卡看到有四个参数,第一个是要依附的view,popupwindow是要·依附于其他view显示的,是在依附的view内部,如果超过view边界的话,系统会自动挪动,使不越界。所以就要注意了这里是要有一个依附的view的!!!这个问题刚开始我不知道。坑了我好久,代码写完了,才知道有这个问题,索性还好最后被机智的自己化解。第二,三个参数是x,y方向上的位移。第四个是参考点。一行代码就可以搞定popupwindow显示的位置啦!

update函数可以加也可以不加,但是如果popupwindow内部控件有修改到界面显示得话,最好还是加一下,及时更新界面。

好啦,今天的分享就到这里,希望对你有所帮助。

你可能感兴趣的:(popupwindow那些坑!!!)