IT정보공유/Android

레이아웃을 동적으로 추가 하는 방법 - View.inflate

알지오™ 2017. 6. 19.

안드로이드 프로그래밍을 처음하다보니 이런저런 온갖 문제를 겪고 있습니다.

책이라도 한권 다 읽어보고 기초 부터 시작해야 하는데

성격이 급해서 그렇게는 못하고 책 몇 챕터 읽고 바로 실전 돌입해서

만들수 있는 수준에서 실전으로 이것저것 만들다 보니 이런저런 문제점들에 많이 시달리고 있네요.


각설하고, 오늘 만들어본 내용은 View를 상속받은 커스텀 뷰를 만들고(레이아웃 정의 파일이 없는 뷰 클래스)

그 커스텀 뷰 위에 AdMob 광고를 동적으로 추가해보고 싶었습니다.


레이아웃을 동적으로 추가 하는 방법 - View.inflate



레이아웃 XML이 정의되지 않은 뷰클래스에 레이아웃을 동적으로 잡는 방법은 모르겠어서

약간 잔머리를 굴려서 편법으로 해결을 했습니다.


빈 레이아웃 adslayout.xml을 하나 정의해 줍니다. (가로,세로 둘다 했음)

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


    <com.google.android.gms.ads.AdView
        android:id="@+id/adView2"
        ads:adSize="BANNER"
        ads:adUnitId="@string/banner_ad_unit_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout >


웬지는 모르겠는데, ads:adSize 속성이 먹질 않아서 엄청 고생했습니다. 한참을 걸려서 해결하긴 했는데 뭘 어떻게 해서 해결이 된건지 솔직히 아직도 정확히는 모르고, 대충 xmlns:ads="http://schemas.android.com/apk/res-auto" 하고 관련이 있긴 한데 이것도 솔직히 여러번 했어도 에러나고 그래서 한참 애를 먹어서... 정확하지가 않네요.




어쨌든, 빈 레이아웃을 하나 선언해 주고, 

메인 액티비티 onCreate() 함수 안에서 아래와 같이 뷰 인플래이트를 통해 레이아웃을 동적으로 생성해 주었습니다.






        LinearLayout ll = (LinearLayout) View.inflate( this, R.layout.adslayout, null ); //xml 레이아웃을 객체화 시켜주는 방법
        ll.addView(ecv, 1); //xml 없이 뷰를 상속받아서 만들 뷰클래스를 리니어레이아웃에 addView 함으로써 레이아웃 두개가 하나로 병함됨

        setContentView(ll); // 합쳐진 레이아웃을 뷰로 설정


ecv는 뷰를 상속 받은 클래스 이고, 아래 포스트에 소스가 공개되어 있으니 참고하실분은 링크로 이동해서
소스코드를 살펴보세요.

일단 이 방법의 문제점은 레이아웃 순서를 바꾸니, 

뷰클래스가 화면영역을 다 차지하면서 광고가 떠야하는 adView가 화면에 보이질 않았습니다.

그래서 보통 일반적인 광고 게재 위치인 하단이 아니라

상단에 광고가 자리잡게 됩니다.


아무리 하단으로 광고게재 위치를 바꿔보려고 해도 안되서 포기했습니다.


댓글

💲 추천 글