Please Enable JavaScript!
Gon[ Enable JavaScript ]

안드로이드(Android) PopupWindow 위젯을 이용해 팝업창 만들기

안드로이드 개발

안드로이드(Android) PopupWindow 위젯을 이용해 팝업창 만들기

 

환경 : Eclipse Mars, Android 4.2.2

 

이번 예제는 PopupWindow 위젯을 이용해서 팝업 창을 만들 때 레이아웃을 적용하는 방법입니다. 이렇게 레이아웃 적용이 가능하다는 팝업 창을 아주 다양하게 꾸밀 수 있다는 것입니다. 일반 Activity 에 xml 레이아웃을 적용하듯 팝업창에도 적용이 가능합니다. 

 

안드로이드(Android) PopupWindow 위젯을 이용해 팝업창 만들기

 

PopupWindow 객체를 이용해 팝업창을 생성하기 위해서는 LayoutInflater

레이아웃 xml 을 객체화 한후 PopupWindow 인수로 넘기면 됩니다. 팝업창 레이아웃을 객체화 하는 소스는 다음과 같습니다.

 

//  LayoutInflater 객체와 시킴 
LayoutInflater inflater = (LayoutInflater) PopUpWinndowActivity.this
		.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View layout = inflater.inflate(R.layout.screen_popup,
		(ViewGroup) findViewById(R.id.popup_element));

팝업창 레이아웃에 대한 전체 xml 입니다.


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/popup_element"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#000000"
    android:orientation="vertical"
    android:padding="10sp" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:background="#3F0099"
        android:paddingBottom="@dimen/abc_action_bar_icon_vertical_padding"
        android:paddingTop="@dimen/abc_action_bar_icon_vertical_padding"
        android:text="레이아웃이 적용된 팝업창"
        android:textColor="#FFFFFF" />

    <Button
        android:id="@+id/btn_close_popup"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="false"
        android:gravity="center_vertical|center_horizontal"
        android:text="Close" />

</RelativeLayout>

 

LayoutInflater 이용해 팝업창레이아웃을 객체화 하였다면 PopupWindow 객체에 인수로 넘기면 됩니다. 그리고 팝업창의 크기를 넘기는데 메인화면의 스크린에서 일정크기를 뺏습니다. 팝업창 레이아웃에 등록되어있는 버튼에 대한 이벤트도 등록하였습니다.

 

pwindo = new PopupWindow(layout, mWidthPixels-100, mHeightPixels-500, true);
pwindo.showAtLocation(layout, Gravity.CENTER, 0, 0);
btnClosePopup = (Button) layout.findViewById(R.id.btn_close_popup);
btnClosePopup.setOnClickListener(cancel_button_click_listener);

 

팝업창닫기 버튼에 대한 이벤트 연결함수입니다.

팝업창을 닫는 함수 dismiss() 호출합니다.

 

private OnClickListener cancel_button_click_listener = 
		new OnClickListener() {
	
	public void onClick(View v) {
		pwindo.dismiss();
	}
};

 

메인 activity 의 전체 레이아웃 xml 입니다.


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:background="#3F0099"
        android:paddingBottom="@dimen/abc_action_bar_icon_vertical_padding"
        android:paddingTop="@dimen/abc_action_bar_icon_vertical_padding"
        android:text="PopupWindow 위젯을 이용한 팝업만들기"
        android:textColor="#FFFFFF" />
    
    <Button
        android:id="@+id/button1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/abc_action_bar_icon_vertical_padding"
        android:text="Button" />

</LinearLayout>

 

메인 activity 의 전체 소스 입니다.


import android.app.Activity;
import android.content.Context;
import android.graphics.Point;
import android.os.Build;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.PopupWindow;

public class PopUpWinndowActivity extends Activity {
	private Button btnClosePopup;
	private Button btnCreatePopup;
	private PopupWindow pwindo;
	private int mWidthPixels, mHeightPixels; 
	
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_pop_up_winndow);

		WindowManager w = getWindowManager();
		Display d = w.getDefaultDisplay();
		DisplayMetrics metrics = new DisplayMetrics();
		d.getMetrics(metrics);
		// since SDK_INT = 1;
		mWidthPixels = metrics.widthPixels;
		mHeightPixels = metrics.heightPixels;
		
		// 상태바와 메뉴바의 크기를 포함해서 재계산
		if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
		try {
			mWidthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
			mHeightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
		} catch (Exception ignored) {
		}
		// 상태바와 메뉴바의 크기를 포함
		if (Build.VERSION.SDK_INT >= 17)
		try {
		    Point realSize = new Point();
		    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
		    mWidthPixels = realSize.x;
		    mHeightPixels = realSize.y;
		} catch (Exception ignored) {
		}
		
		btnCreatePopup = (Button) findViewById(R.id.button1);
		btnCreatePopup.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				initiatePopupWindow();
			}
		});
	}

	private void initiatePopupWindow() {
		try {
			//  LayoutInflater 객체와 시킴 
			LayoutInflater inflater = (LayoutInflater) PopUpWinndowActivity.this
					.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			
			View layout = inflater.inflate(R.layout.screen_popup,
						(ViewGroup) findViewById(R.id.popup_element));
			
			pwindo = new PopupWindow(layout, mWidthPixels-100, mHeightPixels-500, true);
			pwindo.showAtLocation(layout, Gravity.CENTER, 0, 0);
			btnClosePopup = (Button) layout.findViewById(R.id.btn_close_popup);
			btnClosePopup.setOnClickListener(cancel_button_click_listener);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private OnClickListener cancel_button_click_listener = 
			new OnClickListener() {
		
		public void onClick(View v) {
			pwindo.dismiss();
		}
	};
}
Posted by 녹두장군

댓글을 달아 주세요

  1. 알랑깔랑 2015.06.20 17:11  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 ㅎㅎ

    감사히 잘 읽었습니다

    혹시 전체 소스파일도 zip이나 이런걸로 받을 수있을까요?
    저렇게 보니 조금 헷갈리는 부분이 많아서요 ㅠㅠ 감사합니다!
    qlrqoddkdls@naver.com 입니다

  2. 도움맘ㄶ이되었습니다 2015.09.11 16:52  댓글주소  수정/삭제  댓글쓰기

    감사합니다 ^^

  3. 김병희 2017.05.28 13:31  댓글주소  수정/삭제  댓글쓰기

    녹두장군님 만세.
    잘 쓰겠습니다.