Tips for using Android PopupWindow

PopupWindow is a custom popup window on Android that is very convenient to use.

The constructor of PopupWindow is

public PopupWindow(View contentView, int width, int height, boolean focusable)

contentView is the view to be displayed, width and height are width and height, and the values ​​are pixel values, which can also be MATCHT_PARENT and WRAP_CONTENT.

focusable is whether the focus can be obtained, this is a very important parameter, it can also be passed

public void setFocusable(boolean focusable)

To set, if focusable is false, pop up a PopupWindow in an Activity, press the return key, because PopupWindow has no focus, it will directly exit the Activity. If focusable is true, after PopupWindow pops up, all touch screen and physical buttons are handled by PopupWindow.

If there is an Editor in the PopupWindow, focusable must be true.

The following implements a simple PopupWindow

The layout of the main interface is:

copy code
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/layout_main"
    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" >

    <Button
        android:id="@+id/btn_test_popupwindow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="@string/app_name" />

</RelativeLayout>
copy code

The layout of PopupWindow is:

copy code
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#000000" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:text="@string/app_name" 
        android:textColor="#ffffffff"
        android:layout_centerInParent="true"
        android:gravity="center"/>

</RelativeLayout>
copy code

Activity的代码为:

copy code
public class MainActivity extends Activity {

    private Button mButton;
    private PopupWindow mPopupWindow;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        View popupView = getLayoutInflater().inflate(R.layout.layout_popupwindow, null);

        mPopupWindow = new PopupWindow(popupView, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, true);
        mPopupWindow.setTouchable(true);
        mPopupWindow.setOutsideTouchable(true);
        mPopupWindow.setBackgroundDrawable(new BitmapDrawable(getResources(), (Bitmap) null));

        mButton = (Button) findViewById(R.id.btn_test_popupwindow);
        mButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                mPopupWindow.showAsDropDown(v);
            }
        });
    }
}
copy code

这三行代码

mPopupWindow.setTouchable(true);
mPopupWindow.setOutsideTouchable(true);
mPopupWindow.setBackgroundDrawable(new BitmapDrawable(getResources(), (Bitmap) null));

的作用是点击空白处的时候PopupWindow会消失

mPopupWindow.showAsDropDown(v);

这一行代码将PopupWindow以一种向下弹出的动画的形式显示出来

public void showAsDropDown(View anchor, int xoff, int yoff)

这个函数的第一个参数为一个View,我们这里是一个Button,那么PopupWindow会在这个Button下面显示,xoff,yoff为显示位置的偏移。

点击按钮,就会显示出PopupWindow

很多时候我们把PopupWindow用作自定义的菜单,需要一个从底部向上弹出的效果,这就需要为PopupWindow添加动画。

在工程res下新建anim文件夹,在anim文件夹先新建两个xml文件

menu_bottombar_in.xml

copy code
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="250"
        android:fromYDelta="100.0%"
        android:toYDelta="0.0" />

</set>
copy code

menu_bottombar_out.xml

copy code
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="250"
        android:fromYDelta="0.0"
        android:toYDelta="100%" />

</set>
copy code

在res/value/styles.xml添加一个sytle

    <style name="anim_menu_bottombar">
        <item name="android:windowEnterAnimation">@anim/menu_bottombar_in</item>
        <item name="android:windowExitAnimation">@anim/menu_bottombar_out</item>
    </style>

Acivity修改为

copy code
public class MainActivity extends Activity {

    private PopupWindow mPopupWindow;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        View popupView = getLayoutInflater().inflate(R.layout.layout_popupwindow, null);

        mPopupWindow = new PopupWindow(popupView, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, true);
        mPopupWindow.setTouchable(true);
        mPopupWindow.setOutsideTouchable(true);
        mPopupWindow.setBackgroundDrawable(new BitmapDrawable(getResources(), (Bitmap) null));

        mPopupWindow.getContentView().setFocusableInTouchMode(true);
        mPopupWindow.getContentView().setFocusable(true);
        mPopupWindow.getContentView().setOnKeyListener(new OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_MENU && event.getRepeatCount() == 0
                        && event.getAction() == KeyEvent.ACTION_DOWN) {
                    if (mPopupWindow != null && mPopupWindow.isShowing()) {
                        mPopupWindow.dismiss();
                    }
                    return true;
                }
                return false;
            }
        });
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_MENU && event.getRepeatCount() == 0) {
            if (mPopupWindow != null && !mPopupWindow.isShowing()) {
                mPopupWindow.showAtLocation(findViewById(R.id.layout_main), Gravity.BOTTOM, 0, 0);
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}
copy code

Clicking the menu key in this way will pop up a custom PopupWindow, click the blank space or the return key or the menu key, and the PopupWindow will disappear.

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=327081141&siteId=291194637