スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

移転しました

移転しました


ようやく移転完了ですよ~ Goobye FC2
スポンサーサイト

android:onClickに関するmemo











完全に私的メモです。

元ネタはこちら
http://groups.google.com/group/android-group-japan/browse_thread/thread/1aa53a356930e039

読んでて良かった、グループのメール(ダイジェスト)w
まあ、真面目に読みだしたの最近ですけど…
でも結構困ったときに、まずAndroid関連のグループのメールに検索かけると何とかなりますよね。

私も同じことを疑問に持ったことがありましたが、「まあそういうもんだろ」で終わってました。
質問者と回答者に感謝♪



以下memo


<Button
android:id="@+id/button1"
android:onClick="hoge" />


ってリーソスに書くと、ソース側で


public void hoge(View v) {
// クリック時の処理
}


と書けるのは知ってた。





んじゃー、2個ボタンあったらどーするの?


<Button
android:id="@+id/button1"
android:onClick="hoge1" />

<Button
android:id="@+id/button2"
android:onClick="hoge2" />



public void hoge1(View v) {
// クリック時の処理
}
public void hoge2(View v) {
// クリック時の処理
}


もちろんこれでも動く。





でもこう書けるよね。


<Button
android:id="@+id/button1"
android:onClick="hoge" />

<Button
android:id="@+id/button2"
android:onClick="hoge" />



public void hoge1(View v) {
// クリック時の処理
switch( v.getId()){
case R.id.button1:
// button1の処理
break;
case R.id.button2:
// button2の処理
break;
}
}






改めてソース読めば、そりゃそうだって内容ですよね。
id割り振ってんだからそれで分けられるだろと。
でも見るまで気がつかなかった…。

ID以外にもあえて分岐条件に使ったら何か面白いものが書けそうな気もしますね。

テーマ : プログラミング
ジャンル : コンピュータ

tag : android

電飾をちょっと修正した











バイクの電飾をチョコット弄りました。

一人エレクトリカルパレードまでもう少し?

1.png



今回は点滅もします。
既製品(エーモン工業フラッシュサーキットTypeB)を使ってw



しかもリモコン操作出来るようにしました!
既製品(エーモン工業ワイヤレススイッチセット)を使ってwww



エーモン工業ヽ(´ー`)ノバンザーイw

てか今値段見たら、アキバで買わんでもよかったな…
ああ、でもLEDテープ(青)買い足しが目的だったから…うん…


動画でみるとこんな感じ。




あとはリモコン(というか単なるスイッチ)を後ろのケースの中に貼りつければ完璧じゃね?

とか思ったんですが…


ACC ON じゃないとつかないようにしたんですね。


まあしたというか、これまでの配線を引き継いだというか…


何が問題って…



  • ケースの鍵は、バイクの鍵と一緒のキーホルダーに付いている
  • ACC ON じゃないと付かない、つまりバイクの鍵は刺さっていないとならない
  • バイクの鍵とケースの鍵は同時に別の位置に存在できない(キーホルダー的に)



ケースの中にスイッチ入れたら、どうやってONにするんでしょうね…


考えてなかった…


まあケースの鍵を2個持ち歩く…?






あ、次こそはウインカーLED化…

それとオレンジと緑のLED除去…かな…

テーマ : バイク
ジャンル : 車・バイク

tag : GSX1250F

未解決 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に改行を加えていくとこうなります。

admob02.png

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


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

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

メデタシメデタシ…
なのかな?


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

テーマ : プログラミング
ジャンル : コンピュータ

tag : admob android サンプルソース

AdMobテストモードを使ってみた



前回はとりあえず表示だけしてみました。
だけど表示位置の確認やそもそもの動作確認したいですよね。
というかそれしないと駄目だろ。

という開発者のためのテストモードです。

てかさー、AdMobさんさー、もっとテストモードに関して分かりやすく書いてくれよ…

前回と全く同じ環境ですが、一応動作確認環境を書いておきます

端末:X06HT(Desire)
OS:2.2(公式っつーかrootも取ってない)
AdMobSDK:Ver 4.1.0

特にAdMobのSDKのバージョンが古いと、全くもって導入方法が変わるので注意





使用API

・AdRequest.addTestDevice or setTestDevices
・AdView.loadAd





XMLベースの場合

残念ながらXMLだけでレイアウトも書いてテストモードで動作ってのは出来なそうです。
そんなに追っかけてないから嘘かもしれませんがw

http://code.google.com/intl/ja/mobile/ads/docs/android/banner_xml.html#lookupandload
さて、自前でロードする(loadAdを呼んで広告表示させる)場合、上記の Lookup and Load 項目にあるように
・ads:loadAdOnCreate="true"
を削除するか false を指定する必要があります。

それが完了したらとりあえず下記のようなソースを書きます。
下のソース上では、レイアウトが記載されたxmlはmain.xmlという前提です。
当然パブリッシャーIDもxml上に書かれています。

	public void onCreate( Bundle savedInstanceState) {

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

		initAdmobLoadResView();

	}


	private void initAdmobLoadResView() {

		AdView adView = (AdView) findViewById( R.id.adView);
		AdRequest adRequest = new AdRequest();

		adRequest.addTestDevice( AdRequest.TEST_EMULATOR); // ※

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

	}


上記をとりあえず動作させ、Logcatを見ると…
「エミュレータ」ならとりあえず 「test」という文字列が表示されるでしょう。
(まあエミュレータの重さにうんざりしているので、確認してないんですけど。)
そして広告がテスト広告になっているのが確認できるかと思われます。


じゃあ、実機だとどうなのか…

多分普通に広告が表示されるか、表示に失敗して何も起きないかどっちかです。
Logcat的にはこんな感じ

admob01.png

で、Logcat上のこんな部分に注目しましょう。
To get test ads on this device, call adRequest.addTestDevice("hogehoge");

なにやら変なIDっぽいものが書いてあります。

これをおもむろにコピーして上記ソースの※部分を
・AdRequest.TEST_EMULATOR → "hogehoge"
に置き換え。
またここで得たhogehogeは端末毎で異なるようです。多分。
少なくとも会社の人の端末借りたら「not test」って返ってきましたし。

ついでに
		if( adRequest.isTestDevice( this)){
			Log.d( AdRequest.LOGTAG, "test");
			adView.loadAd( adRequest);
		}else{
			Log.d( AdRequest.LOGTAG, "not test");
		}

としておくと安全面でいいかも

なお、最初に上記のようなソースにしなかったのには理由が。
loadAdを呼ばないと上記のLogcatが表示されないんですね。

最初からこの状態だと「not test」が表示されるだけで後は何も起こりません。


ちなみに…
addTestDeviceのjavadocはこんな感じです。

public void addTestDevice(String testDevice)
Causes test ads to be returned to a device. Look at logcat while requesting an ad to see how to return test ads to a device. There will be a log message with the code needed to add the current device to the list of test devices. For example:


(String testDevice)

この部分「だけ」をみて、TelephonyManagerつかってgetDeviceID呼べばいいのか?
とか思って実際にそんなソース書いてテストモードに移行できずに悩んでいたのは秘密


で、肝心のドキュメントはこちら
http://code.google.com/intl/ja/mobile/ads/docs/android/intermediate.html#addtestdevice
実にソースを含め5行でまとまっています。
5行でね…




レイアウト自前実装の場合はもう書かなくてもいいですよね。
loadAdの前にaddTestDeviceを呼んでやればOKです。
てかさー、testDeviceのIDですか?
取得できるようなAPIとか開けておいて欲しいです…




おまけ debuggable trueの場合のみテストモード

実際やるとしたらこんなソースになるんでしょうか。

	public void onCreate( Bundle savedInstanceState) {

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

		initAdmobLoadResView();

	}


	private void initAdmobLoadResView() {

		AdView adView = (AdView) findViewById( R.id.adView);
		AdRequest adRequest = new AdRequest();
		
		// debuggable が trueの場合
		if( ApplicationInfo.FLAG_DEBUGGABLE == (ApplicationInfo.FLAG_DEBUGGABLE & getApplicationInfo().flags) ){

			adRequest.addTestDevice( "hogehoge");

			if( adRequest.isTestDevice( this)){

				Log.d( AdRequest.LOGTAG, "test");
				adView.loadAd( adRequest);

			}else{

				Log.d( AdRequest.LOGTAG, "not test");
			}
			
		}else{
			adView.loadAd( adRequest);
		}
	}




次回は
・適当に配置したら色々困って解決策募集中
です。

2011/06/15現在答え見つかってないので、誰か教えてくださいな。


テーマ : プログラミング
ジャンル : コンピュータ

tag : android サンプルソース

プロフィール

駄猫

Author:駄猫

Twitter
その他
最新記事
カテゴリ
月別アーカイブ
検索フォーム
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。