(Android)五分鐘學會PopupWindow

對於自定義窗口,Android提供了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下加上

     <style name="popupAnimation" parent="android:Animation">
        <item name="android:windowEnterAnimation">@anim/in</item>
        <item name="android:windowExitAnimation">@anim/out</item>
    </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();就好

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

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;
			}
		}
	}

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章