공백(스페이스) 을 없애야 되는 때가 있습니다. 예를들어
파싱을 해왔는데 " 안녕하세요 " 라고 데이터가 들어있다 그럼
그걸 찍었을 때 그대로 저렇게 앞뒤로 공백이 있는 것을 그냥 사용하게 되면 양쪽으로
잉여 공간이 있어서 보기 싫겠죠 . 그 때
이렇게 하시면 앞뒤 공백이 자동으로 없어지고 "안녕하세요" 요렇게 딱 찍힙니다.
'Android' 카테고리의 다른 글
안드로이드] Application 종료시키기 (0) | 2011.07.27 |
---|---|
안드로이드] 버튼 누를 시 버튼 이미지 바꾸기 (9) | 2011.07.26 |
안드로이드] 팝업뷰 보다 깔끔한 팝업모양 액티비티 만들기 (14) | 2011.07.19 |
안드로이드] 팝업뷰 띄우기 (0) | 2011.07.18 |
안드로이드] 현재 Activity 와 Context 얻는 방법 (6) | 2011.07.14 |
이번에 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
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
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);
두번째로 이것은 그냥 취향인데 이 팝업이 뜨면 뒷 배경이 블러 효과가 납니다. 뿌옇게 이쁘게..
위 방법으로 안되면
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
layoutParams.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND;
layoutParams.dimAmount = 0.7f;
getWindow().setAttributes(layoutParams);
이방법도 있습니다.
무튼,해당 액티비티의 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 에서 보면 액티비티를 상속받은 클래스이므로 여기다 터치리스너를 달던
클릭리스너를 달던 아무이상없이 잘되더군요. 앞으로 유용하게 사용 할 것 같습니다 ^^
'Android' 카테고리의 다른 글
안드로이드] 버튼 누를 시 버튼 이미지 바꾸기 (9) | 2011.07.26 |
---|---|
안드로이드] trim(); 의 기능 (0) | 2011.07.20 |
안드로이드] 팝업뷰 띄우기 (0) | 2011.07.18 |
안드로이드] 현재 Activity 와 Context 얻는 방법 (6) | 2011.07.14 |
안드로이드] 현재 액티비티, 다른 액티비티 종료하기 (15) | 2011.06.27 |
팝업뷰는 딱히 그 뷰에서 복잡한걸 하기보다는 흔히 로그인 창이나,
비교적 간단한 정보등을 띄우고 닫는 그런 뷰입니다.
먼저 필요한 세가지를 선언합니다.
private LinearLayout detail_layout; private PopupWindow pw; private View pv;
레이아웃과 팝업윈도우, 그리고 뷰가 필요합니다. 레이아웃은 꼭 리니어가 아니라도 현재
팝업이 뜰 화면의 레이아웃이면 됩니다. 예를 들어 메인액티비티의 로그인화면을 띄운다면
메인페이지를 구성하는 xml 에서 제일 밖을 싸고있는 레이아웃을 지정합니다.
값을 대입해보면
detail_layout = (LinearLayout)findViewById(R.id.detail_layout); pv = View.inflate(getApplicationContext(), R.layout.webpopup, null); pw = new PopupWindow(pv,400,400,false);
이렇게 됩니다. 레이아웃은 말씀드렸다시피 팝업창이 뜰 액티비티의 xml에 제일 밖을 싸고있는
레이아웃이고, pv에는 세가지 파라미터가 들어가는데 첫번째는 Context, 두번째는
팝업레이아웃, 세번째는 뷰그룹입니다.
두번째의 팝업레이아웃은, 팝업창의 레이아웃으로 팝업으로 뜰 화면을 xml로 만들어줘야합니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/linearLayout1"
android:layout_width="fill_parent" android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<WebView android:id="@+id/webPopup" android:layout_width="wrap_content"
android:layout_height="wrap_content"></WebView>
</LinearLayout>그리고 그렇게 만든 view를 pw에 넣는데, pw에는 네가지 파라미터가 들어갑니다.
첫번째는 팝업으로 뜰 뷰, 두번째 세번째는 그 뷰의 가로 세로 사이즈, 마지막 네번째는 현재 팝업의
focusable 로 정확한 정보는 api를 뒤져봐야겠지만 개인적으로 써보니 이걸 true로 하면 포커스가
안잡혀서 Back버튼에 dismiss() 걸어놔도 안꺼지더군요, false로 해놓으니 백키가 먹어서 꺼지네요
추가로 백버튼을 알아보면
public boolean onKeyDown(int keyCode, KeyEvent event){ if(keyCode == KeyEvent.KEYCODE_BACK){ pw.dismiss(); } return true; }백 키를 오버라이딩하여 사용할 시에 저렇게 return true를 사용하면 팝업창만꺼지고
대신 팝업끈 후 뒤에 남은 액티비티는 백키로 꺼지지가 않습니다.
하지만 return super.onKeyDown(keyCode, event);
이렇게 바꾸면 뒤에 액티비티가 꺼지지만 팝업뜬 상태에서 백키를 누를 시
팝업꺼지고 뒤에 액티비티도 연달아 꺼져버립니다.. 그래서 불리언 값을 하나 놓고
팝업이 떠있냐 안떠있냐를 체크하여 리턴값을 다르게 주었습니다.
private boolean popup_on; public boolean onKeyDown(int keyCode, KeyEvent event){ if(keyCode == KeyEvent.KEYCODE_BACK){ try { popup_on = pw.isShowing(); if(popup_on){ pw.dismiss(); popup_on = false; }else{ return super.onKeyDown(keyCode, event); } } catch (Exception e) {;} } return true; }이렇게 하였습니다. 팝업이 뜨는 버튼리스너안에 저 popup_on 을 트루로 바꿔주면 됩니다.
'Android' 카테고리의 다른 글
안드로이드] trim(); 의 기능 (0) | 2011.07.20 |
---|---|
안드로이드] 팝업뷰 보다 깔끔한 팝업모양 액티비티 만들기 (14) | 2011.07.19 |
안드로이드] 현재 Activity 와 Context 얻는 방법 (6) | 2011.07.14 |
안드로이드] 현재 액티비티, 다른 액티비티 종료하기 (15) | 2011.06.27 |
안드로이드] 리스트 알아보기 (0) | 2011.06.25 |