2011年6月18日土曜日

未解決 AdMobをIMEの下に隠したら消えた?

AdMobをIMEの下に隠したら消えた?

超絶的に適当なレイアウトだと消えるようです。
正直どうでもいいんですけど気になって気になって…

また消えること自体も別にいいんです。

消えた事自体を取得できなくて困ってます。

とりあえずこんなレイアウトとソース

main.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/lib/com.google.ads"
 android:layout_width="fill_parent" android:layout_height="fill_parent"
 android:id="@+id/adLayout"
 android:orientation="vertical">

 <EditText android:id="@+id/editText1" android:text="test"
  android:layout_width="fill_parent" android:layout_height="wrap_content">
  </EditText>

 <Button android:text="Button" android:id="@+id/button1"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"></Button>

</LinearLayout>

ソース
private WrapAdView  mAdView  = null;
private AdRequest  mAdRequest = null;

private LinearLayout mLayout  = null;
private Button   mButton  = null;

public void onCreate( Bundle savedInstanceState) {

 super.onCreate( savedInstanceState);
 setContentView( R.layout.main);

 mLayout = (LinearLayout) findViewById( R.id.adLayout);

 initAdmobMakeView();

 mButton = (Button) findViewById( R.id.button1);

 mButton.setOnClickListener( new OnClickListener() {

  public void onClick( View v) {

   // TODO 自動生成されたメソッド・スタブ
   initAdmobMakeView();
  }
 });
}


private void initAdmobMakeView() {

 if( mAdView == null){
  mAdView = new WrapAdView( this, AdSize.BANNER, "Publisher ID");
  mAdView.setAdListener( this);
  mLayout.addView( mAdView);
 }

 if( mAdRequest == null){
  mAdRequest = new AdRequest();
 }

 mAdRequest.addTestDevice( "hoge");
 mAdRequest.addTestDevice( AdRequest.TEST_EMULATOR);

 if( mAdRequest.isTestDevice( this)){
  Log.d( AdRequest.LOGTAG, "test");
  mAdView.loadAd( mAdRequest);
 }else{
  Log.d( AdRequest.LOGTAG, "not test");
 }
}

うん、こんなレイアウトのアプリはありえないね。

というのは置いといて…

おもむろにEditTextに改行を加えていくとこうなります。



AdViewが消えます。

その時Logcatにはこんな表示が

Not enough space to show ad! Wants: <480, 75>, Has: <480, 69>

ああ、表示領域が足りなくなったんですね。そらしゃーない。

んじゃー、表示できる領域がまた出来れば復活しますよね~



戻りません…

まあ再度adLoad呼べばいいんですが、そのタイミングがわかんないですよね。

ってことで AdListener をインプリメントすれば何かわかるんじゃないかな~

と思い、こんな感じに修正

public class Test extends Activity implements AdListener {

 /*中略*/

 public void onDismissScreen( Ad arg0) {

  Log.d( AdRequest.LOGTAG, "onDismissScreen");

 }


 public void onFailedToReceiveAd( Ad arg0, ErrorCode arg1) {

  Log.d( AdRequest.LOGTAG, "onFailedToReceiveAd");

 }


 public void onLeaveApplication( Ad arg0) {

  Log.d( AdRequest.LOGTAG, "onLeaveApplication");

 }


 public void onPresentScreen( Ad arg0) {

  Log.d( AdRequest.LOGTAG, "onPresentScreen");

 }


 public void onReceiveAd( Ad arg0) {

  Log.d( AdRequest.LOGTAG, "onReceiveAd");

 }
}

とりあえず何か返ってくるだろってことで期待しました。

が、消えるタイミングでは何も来ない…



えー、じゃあAdView拡張してなんかそれっぽいやつ(名前だけで適当に判断)Overrideしてイベント収集とか??

/**
 * とりあえずイベント収集
 */
class WrapAdView extends AdView {

 public WrapAdView( Activity activity, AdSize adSize, String adUnitId) {

  super( activity, adSize, adUnitId);
 }


 @Override
 public boolean dispatchPopulateAccessibilityEvent( AccessibilityEvent event) {

  Log.d( AdRequest.LOGTAG, "dispatchPopulateAccessibilityEvent:" + event);
  return super.dispatchPopulateAccessibilityEvent( event);
 }


 @Override
 public void dispatchWindowVisibilityChanged( int visibility) {

  Log.d( AdRequest.LOGTAG, "dispatchWindowVisibilityChanged:" + visibility);
  super.dispatchWindowVisibilityChanged( visibility);
 }


 protected void dispatchVisibilityChanged( View changedView, int visibility) {

  super.dispatchVisibilityChanged( changedView, visibility);
  Log.d( AdRequest.LOGTAG, "visibility:" + visibility);
 }


 protected void onWindowVisibilityChanged( int visibility) {

  super.onWindowVisibilityChanged( visibility);

  switch( visibility) {
  case VISIBLE:
   Log.d( AdRequest.LOGTAG, "VISIBLE");
   break;
  case INVISIBLE:
   Log.d( AdRequest.LOGTAG, "INVISIBLE");
   break;
  case GONE:
   Log.d( AdRequest.LOGTAG, "GONE");
   break;
  }

 }


 protected void onVisibilityChanged( View changedView, int visibility) {

  super.onVisibilityChanged( changedView, visibility);

  switch( visibility) {
  case VISIBLE:
   Log.d( AdRequest.LOGTAG, "VISIBLE");
   break;
  case INVISIBLE:
   Log.d( AdRequest.LOGTAG, "INVISIBLE");
   break;
  case GONE:
   Log.d( AdRequest.LOGTAG, "GONE");
   break;
  default:
   Log.d( AdRequest.LOGTAG, "ERR:" + visibility);
  }
 }
}

結果何も取得できず!!

( ´∀`)Σ⊂(゚Д゚ ) なんでやねん!

ちなみにレイアウト側を弄るとそもそもIMEの下に隠れるとかなくなりますが…

でもなんか釈然としない。

あー、やっぱりレイアウトに関してもっと勉強せんと駄目なんだろうなぁ…

ま、別にたまたま気がついただけで逃げ方は幾らでもありそうですが、

必ずディスプレイの下側にAdViewを配置して、IME表示時は隠れるようにしたい!!

とかになったらどーすんだろ。

IMEの表示非表示とかどうにかしてどうにかなるのかな…と思ってググったらぽいのがありました。

http://y-anz-m.blogspot.com/2010/12/androidonscreen-input-methods.html

上記を参考にして上手いことゴニョゴニョすれば何とかなりそうですね。

結論:やっぱりレイアウトに関して勉強すれば幾らでも回避できそう

メデタシメデタシ…

なのかな?

例の警告発生時(消えた事自体)のイベント取得方法知っている方居ましたら教えてください。

0 件のコメント:

コメントを投稿