五分鐘教你學會PopupWindow

于自定義窗口,Android提供了PopupWindow,簡單實用。
下面我們來看看今天demo實現的效果:

彈出PopupWindow

PopupWindow的構造函數

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

其中contentView為要顯示的view,width和height為寬和高,
值為像素值,可以是MATCHT_PARENT和WRAP_CONTENT
來設置,如果focusable為false,在一個Activity彈出一個PopupWindow,按返回鍵,由于PopupWindow沒有焦點,會直接退出Activity。如果focusable為true,PopupWindow彈出后,所有的觸屏和物理按鍵都有PopupWindows處理。
如果PopupWindow中有Editor的話,focusable要為true。

下面來看一個簡單的demo
主界面:就簡單放一個button,點擊彈出我們需要的PopupWindow

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:id="@+id/container"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent" >  
    <Button  
        android:id="@+id/btnOpen"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_centerInParent="true"  
        android:text="@string/app_name" />  
</RelativeLayout>  

popupwindow 界面:放了2個button 和一個文本框,用來輸入值

<?xml version="1.0" encoding="utf-8"?>  
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:background="#b5555555" >  
    <LinearLayout  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:layout_alignParentBottom="true"  
        android:background="#eee"  
        android:orientation="vertical" >  
        <EditText  
            android:id="@+id/leaveword"  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:layout_marginBottom="20dp"  
            android:layout_marginLeft="20dp"  
            android:layout_marginRight="20dp"  
            android:layout_marginTop="20dp"  
            android:gravity="top"  
            android:hint="說點什么吧~"  
            android:inputType="textMultiLine"  
            android:lineSpacingExtra="6.0dp"  
            android:maxHeight="150dp"  
            android:minHeight="100dp"  
            android:paddingLeft="10.0dp"  
            android:paddingRight="10.0dp"  
            android:paddingTop="10.0dp" />  
        <LinearLayout  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:layout_marginBottom="20dp"  
            android:gravity="center"  
            android:orientation="horizontal" >  
            <Button  
                android:id="@+id/confirmButton"  
                android:layout_width="80.0dip"  
                android:layout_height="wrap_content"  
                android:gravity="center"  
                android:text="發表"  
                android:textColor="#fff"  
                android:textSize="16.0sp" />  
            <Button  
                android:id="@+id/cancleButton"  
                android:layout_width="80.0dip"  
                android:layout_height="wrap_content"  
                android:layout_marginLeft="30dp"  
                android:gravity="center"  
                android:text="取消"  
                android:textColor="#565656"  
                android:textSize="16.0sp" />  
        </LinearLayout>  
    </LinearLayout>  
</RelativeLayout>  

這樣我們的界面布局就算完成了,下來我們來看一個Activity。寫個了OpenView方法來彈出view

public void OpenView() {  
    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);  
    popupWindowView = inflater.inflate(R.layout.popupwindow, null);  
    popupWindow = new PopupWindow(popupWindowView,  
            LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, true);  
    // 設置PopupWindow的彈出和消失效果  
    popupWindow.setAnimationStyle(R.style.popupAnimation);  
    btnsure = (Button) popupWindowView.findViewById(R.id.confirmButton);  
    btnsure.setOnClickListener(new ButtonOnClickListener());  
    cancleButton = (Button) popupWindowView.findViewById(R.id.cancleButton);  
    cancleButton.setOnClickListener(new ButtonOnClickListener());  
    leaveword = (EditText) popupWindowView.findViewById(R.id.leaveword);  
    popupWindow.showAtLocation(btnsure, Gravity.CENTER, 0, 0);  
}  

我們看到彈出來的有點動畫效果,是因為我們在彈出時,加上了

popupWindow.setAnimationStyle(R.style.popupAnimation); 

我們需要在在styles.xml下加上popupAnimation

<style name="popupAnimation" parent="android:Animation">  
   <item name="android:windowEnterAnimation">@anim/in</item>  
   <item name="android:windowExitAnimation">@anim/out</item>  
lt;/style>  

在工程res下新建anim文件夾,在anim文件夾先新建兩個xml文件

in.xml

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android" >  
    <translate  
        android:duration="1500"  
        android:fromYDelta="5000"  
        android:toYDelta="0" />  
</set>  

out.xml

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android">  
    <translate  
        android:fromYDelta="0"  
        android:toYDelta="5000"  
        android:duration="1500"  
    />  
</set>  

如果想要關閉彈出框
調用popupWindow.dismiss();就好.
完整的Activity源碼

public class MainActivity extends Activity {  
    private View popupWindowView;  
    private PopupWindow popupWindow;  
    private Button btnsure, cancleButton, btnOpen;  
    private EditText leaveword;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        btnOpen = (Button) findViewById(R.id.btnOpen);  
        btnOpen.setOnClickListener(new ButtonOnClickListener());  
    }  
  
    public void OpenView() {  
        LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);  
        popupWindowView = inflater.inflate(R.layout.popupwindow, null);  
        popupWindow = new PopupWindow(popupWindowView,  
                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, true);  
        // 設置PopupWindow的彈出和消失效果  
        popupWindow.setAnimationStyle(R.style.popupAnimation);  
        btnsure = (Button) popupWindowView.findViewById(R.id.confirmButton);  
        btnsure.setOnClickListener(new ButtonOnClickListener());  
        cancleButton = (Button) popupWindowView.findViewById(R.id.cancleButton);  
        cancleButton.setOnClickListener(new ButtonOnClickListener());  
        leaveword = (EditText) popupWindowView.findViewById(R.id.leaveword);  
        popupWindow.showAtLocation(btnsure, Gravity.CENTER, 0, 0);  
    }  
  
    private class ButtonOnClickListener implements OnClickListener {  
        @Override  
        public void onClick(View vid) {  
  
            switch (vid.getId()) {  
  
            case R.id.btnOpen:  
                OpenView();  
                break;  
            case R.id.confirmButton:  
  
                Toast.makeText(MainActivity.this, leaveword.getText().toString(), Toast.LENGTH_SHORT)  
                        .show();  
  
                break;  
            case R.id.cancleButton:  
                popupWindow.dismiss();  
                break;  
  
            default:  
                break;  
            }  
        }  
    }  
  
}  

這樣一個簡單的PopupWindow例子就算完成了.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容