2011年9月11日日曜日

Google+招待

だいぶGoogle+慣れました。
個人的には情報共有にはすごくいい!
でも、サークルで繋がる友達が少ないのが微妙なんですよね。
Androidアプリの評価を見るとまだまだ招待欲しい人多いみたいで。

ということで、招待して欲しい人がいたら、連絡下さい。
gmailアドレスと、簡単な自己紹介付けて下記まで。

masa.tam81@gmail.com

招待枠に制限があるので、自己紹介で面白そうな人、
繋がりたい人優先で招待させて頂こうと思います。

2011年9月7日水曜日

Android Tabを入れ子(ネスト)にする

タブをネストしたいときってあると思います。
アプリ作ってた時に参考にしたアプリがネストしてて、確かに情報的にそうなるよな、と思った。でも、作ってみたら、どうやるんだろ、と。

初めてタブを作った時にググったら、TabActivityを使うのと使わないのがあって、じゃあ、TabActivityで作ったタブの中で、使わない方法のタブ作りを、と思いました。

でも、なんか上手くいかなくて、調べてたら、タブの中にActivityを入れる方法が。
あ、これでTabActivityの中にTabActivity入れればいいんじゃないか、と。

サンプル。
メインのxml

    
 
 
 
 
 
         
  

    


ネストしたタブ

    
 
 
 
 
     
     
 
 
     
   
 
     


で、Activity
TabSampleActivity.java
ポイントは
tab2.setContent(new Intent(this, NestTabActivity.class));
インテントを入れること。

import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabHost.TabSpec;

public class TabSampleActivity extends TabActivity implements OnTabChangeListener{
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        TabHost tabHost = getTabHost();  
        // Tab が切り替わったときに呼ばれるコールバックを登録  
        tabHost.setOnTabChangedListener(this);  
      
        /********** Tab その1 **********/  
        // TabSpec の作成  
        TabSpec tab1 = tabHost.newTabSpec("tag1");  
        // インジケーターの設定  
        tab1.setIndicator("tab1");  
        // Tab にコンテンツを設定  
        tab1.setContent(R.id.content1);  
        // TabHost に Tab を追加  
        tabHost.addTab(tab1);  

        /********** Tab その2 **********/  
        // TabSpec の作成  
        TabSpec tab2 = tabHost.newTabSpec("tag2");  
        // インジケーターの設定  
        tab2.setIndicator("tab2");  
        // Tab にActivityを設定  
        tab2.setContent(new Intent(this, NestTabActivity.class));  
        // TabHost に Tab を追加  
        tabHost.addTab(tab2);  

    }

 @Override
 public void onTabChanged(String tabId) {
  
 }
}

ネストするタブ
import android.app.Activity;
import android.app.TabActivity;
import android.os.Bundle;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabHost.TabSpec;

public class NestTabActivity extends TabActivity implements OnTabChangeListener{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nesttab);
        
        TabHost tabHost = getTabHost();  
        // Tab が切り替わったときに呼ばれるコールバックを登録  
        tabHost.setOnTabChangedListener(this);  
      
        /********** Tab その1 **********/  
        // TabSpec の作成  
        TabSpec tab1 = tabHost.newTabSpec("tag1");  
        // インジケーターの設定  
        tab1.setIndicator("tab1");  
        // Tab のコンテンツの設定  
        tab1.setContent(R.id.content2);  
        // TabHost に Tab を追加  
        tabHost.addTab(tab1);  

        /********** Tab その2 **********/  
        // TabSpec の作成  
        TabSpec tab2 = tabHost.newTabSpec("tag2");  
        // インジケーターの設定  
        tab2.setIndicator("tab2");  
        // Tab のコンテンツの設定  
        tab2.setContent(R.id.content3);  
        // TabHost に Tab を追加  
        tabHost.addTab(tab2);  

    }

 @Override
 public void onTabChanged(String tabId) {
  
 }
}

これでオッケー。

もちろんActivityなのでAndroidManifest.xmlでActivityの指定が必要。
# だいたい最初入れ忘れて例外吐くw

AndroidManifest.xml


    

    
        
            
                
                
            
        
        

    


できたのはこんな感じ。


だいぶ素っ気ないので、レイアウトは変更しましょう。タブとか背景とか。
実際のアプリではこんな感じで使いました。


メインのタブはアイコン付き、ネストしたタブは文字だけにするとまとまりが良いかもしれません。

2011年9月6日火曜日

夏の想い出

フェス行きまくりました。














ロッキンジャパン 茨城













ライジングサン 北海道













ARABAKI 宮城

やっぱ、音楽ないと夏越せないです。

2011年8月22日月曜日

android Tabを必要な時だけ表示する

Tabを使ったアプリで必要な時だけタブを出す方法。


まずはタブを追加
※ 前提として、既にタブが2つ設定されている

TabHost mTabHost = getTabHost();
TabSpec tab3 = mTabHost.newTabSpec("TAG3");
tab3.setIndicator"tab3");
tab3.setContent(R.id.content3);
mTabHost.addTab(tab3);

これでタブが表示される。
次はタブの削除

	@Override
	public void onTabChanged(String tabId) {
		if(mTabHost.getTabWidget().getTabCount() >= 3
				&& mTabHost.getCurrentTab() != 2) {
			Log.d("tabChanged", "remove tab");
			mTabHost.getTabWidget().removeViewAt(2);
		}
	}

追加された状態かをチェックして、他のタブにフォーカスが移ったら
TabWidgetからremoveViewすればOK。

2011年8月19日金曜日

proguardの注意

一昨日、あまりに売れないから放置してたアプリでエラーが出てることを知りました。2週間放置しちゃって、買ってくれた方ごめんなさい…。

原因は難読化のproguardが悪さをして、xmlのandroid:onClickで指定したメソッドが見つからないことでした。多分、エミュレーターや実機に実行してテストしてる人が多いと思うけど、exportした時だけ発生する現象なのでご注意下さい。

回避策は

-keepclassmembers class * extends andriod.app.Activity {
   public void *(android.view.View);
}

をproguard.cfgに追記する。
そうすると、対象部分は難読化されないため、xmlの指定で見つけられます。

*部分は具体的なクラス名、メソッド名でもOK。
下記を参考にしました。
http://stackoverflow.com/questions/6666292/android-onclick-events-and-pro-guard

2011年8月4日木曜日

SVGをBufferedImageに変換する方法、拡大縮小する方法

ソース書きたいとこだけど、会社で使うので書けない…
ということで、参考にしたサイトを紹介。
http://bbgen.net/blog/2011/06/java-svg-to-bufferedimage/

英語だけど、開発者ならわかるはず!
拡大縮小は渡すwとhを変えればオッケー。
ほとんど画質に影響ありません。

ただ、不思議な拡大縮小で、縦横比維持で小さい方の倍率に合わせて拡大縮小して、余ったスペースは横は左、縦は下に余白になる。試したのが透過のだったから、透過領域が広がってました。

ご参考までに!

2011年8月3日水曜日

検索に復帰

新しいアドレスが反映されました!
古いの消えてたから、反映に時間がかかる模様。

GoogleのWeb検索の追加とかもしたけど、それだけだと旧は残るだろうから。ボットの巡回周期の問題とかかな。