출처 : http://muzesong.tistory.com/42

이번에 PopupWindow로 팝업창을 만들어서 사용 할 일이 있었는데 팝업뷰를 처음 써봐서 

서투르기도 했겠지만, 굉장히 불안정하더군요 , 개인적으로..

예를들면 팝업뷰 xml 에 WebView를 추가하여 팝업에 웹페이지를 띄울라치면 뜨긴하지만 

터치 조금만 하면 badtokenexception 을 뱉어내며 죽어버립니다. 정말 딱 팝업창처럼,

뜬거 보고 확인 후 닫기. 이 기능만 할 수 있더군요 .

그러다가 알게 된 것이 액티비티를 팝업창만하게 띄워서 좀 더 쓸만한 팝업창을 만드는걸

알게 되었습니다.

우선 액티비티이니 팝업창으로 쓸 액티비티를 만듭니다 .

public class WebDialog extends Activity implements OnClickListener {

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,

WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

setContentView(R.layout.webpopup);

WebView webView = (WebView)findViewById(R.id.webPopup);

webView.setWebViewClient(new myWebViewClient());

WebSettings webSettings = webView.getSettings();

webSettings.setJavaScriptEnabled(true);

webSettings.setBuiltInZoomControls(true);

  webView.loadUrl("http://www.google.com");


}

class myWebViewClient extends WebViewClient {


@Override

view.loadUrl(url);

return true;

}

}

public void onClick(View arg0) {

}

} 


이렇게 구글닷컴으로 가는 액티비티를 만들어 줍니다. 여기서 흔히 못보시던게 두가지 있는데 

requestWindowFeature(Window.FEATURE_NO_TITLE); 

이 놈은 나중에 설명드리겠지만 매니페스트에 이 액티비티 테마를 다이얼로그 테마로 잡습니다.

다이얼로그 테마면 상단에 다이얼로그 제목바가 생기는데 이를 없애주는 명령어 입니다.

getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,

WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

두번째로 이것은 그냥 취향인데 이 팝업이 뜨면 뒷 배경이 블러 효과가 납니다. 뿌옇게 이쁘게..

무튼,해당 액티비티의 ContentView인 webPopup.xml(실질적인 팝업구성 xml입니다)을 보면 

  <RelativeLayout 

android:layout_centerInParent="true"

    android:layout_width="300dip"

    android:layout_height="240dip"

    android:background="#50FFFFFF">

        <android.webkit.WebView android:layout_width="fill_parent" 

        android:id="@+id/webPopup" 

        android:layout_height="fill_parent" 

        android:layout_alignParentLeft="true">

        </android.webkit.WebView>

    </RelativeLayout> 


보면 뭐 없습니다. 웹만 띄우기 때문에 웹뷰 하나 있습니다.

그리고 액티비티 이기 때문에 매니패스트에 등록을 해주어야 하는데요 

<activity

android:name="net.oshelp.Info.WebDialog"

android:screenOrientation="landscape" android:theme="@android:style/Theme.Dialog"

android:windowSoftInputMode="stateHidden" android:configChanges="orientation|keyboardHidden">

</activity>


순서대로 액티비티명, 화면가로지정, 다이얼로그테마, 키보드 가리기, 가로세로전환시 키보드가리기 

순서입니다. 중요한건 theme 정도가 있겠네요 

이렇게 하고 이 팝업을 호출하는 곳에서 액티비티 부르듯 

Intent intent = new Intent(detailView.this, WebDialog.class);

startActivity(intent);


이렇게 인텐트 시켜 버리면 


이렇게 이쁜 팝업창이 뜹니다. 뒤에 블러효과 뭔지 아시겠죠?

이렇게 쓰면 배드토큰익셉션도 덜 날 뿐더러 액티비티 이므로 따로 백키를 오버라이딩해서 

dismiss()로 꺼지게 해야할 필요없이 그냥 누르면 꺼집니다, 그리고 아까 만든

webDialog.java 에서 보면 액티비티를 상속받은 클래스이므로 여기다 터치리스너를 달던 

클릭리스너를 달던 아무이상없이 잘되더군요.  앞으로 유용하게 사용 할 것 같습니다 ^^

+ Recent posts