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
電飾をちょっと修正した
バイクの電飾をチョコット弄りました。
一人エレクトリカルパレードまでもう少し?

今回は点滅もします。
既製品(エーモン工業フラッシュサーキット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に改行を加えていくとこうなります。
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
上記を参考にして上手いことゴニョゴニョすれば何とかなりそうですね。
結論:やっぱりレイアウトに関して勉強すれば幾らでも回避できそう
メデタシメデタシ…
なのかな?
例の警告発生時(消えた事自体)のイベント取得方法知っている方居ましたら教えてください。
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的にはこんな感じ
で、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現在答え見つかってないので、誰か教えてくださいな。





