2012年11月22日木曜日

[Android]コードからmarginの設定をする

メモ。

LayoutParamsのsetMarginで設定する。


 
            LayoutParams params = new LayoutParams(0, LayoutParams.MATCH_PARENT, 1);
            params.setMargins(5, 5, 5, 5);

情報元
How to set margin of ImageView using code, not xml

2012年11月15日木曜日

[Android]2.3以前でPreferenceScreenにテーマが適用されない不具合の対処

ひょっとしたら今更感があるネタなのですが、ハマったのでメモ。

2.3以前のOSだとPreferenceScreenを入れ子にしたPreferenceを生成するとテーマが正しく適用されないバグがあるみたいです。

Issue 4611: Background from PreferenceActivity is not applied to sub-PreferenceScreen

つまり、下記のようなXMLをPrefereceActivityに読み込ませると子のPreferenceScreenにはテーマが正常に適用されません。

preference.xml


 



    
        
        
    



最初のPreferenceはちゃんと表示されますが、
メニュー2を表示させようとすると、こうなります。
対策として上記リンクのコメント20に書かれていた対策を実施しました。
具体的には子のPreferenceScreenはxmlを分けて、Intent呼び出しでもう1つPreferenceActivityを生成して表示するようにします。
なのでPreferenceActivityではIntentの中身を見て読み込むxmlを切り替えます。

preference.xml


 



    
         
        



preference2.xml


 



    
    



MainActiviy.jara


 
package jp.inara.sample.preferencebug;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Intent intent = new Intent(this, MyPreferenceActivity.class);
        intent.setData(Uri.parse("preferences://preference1"));
        startActivity(intent);
        return true;
    }
       
}

MypreferenceActivity.java


 

package jp.inara.sample.preferencebug;

import android.os.Bundle;
import android.preference.PreferenceActivity;

public class MyPreferenceActivity extends PreferenceActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getIntent().getData().toString().equals("preferences://preference2")) {
            addPreferencesFromResource(R.xml.preference2);
        } else {
            addPreferencesFromResource(R.xml.preference);
        }
    }

}

こんな感じにするとちゃんと子のPreferenceScreenが表示されるようになります。
気をつけなくちゃいけないのは、PreferenceActivityを呼び出すところでIntentにDataをセットし忘れないようにすることですかね。

2012年10月31日水曜日

[Android]ViewPagerに追加したFragmentのインスタンスを取得する

調べたのでメモ。

と言ってもここに書いてある事をやっただけ。
Update data in ListFragment as part of ViewPager

ここの2番めのFragmentStatePagerAdapter#instantiateItemを使う方法でいけました。

最も投票されているViewPagerが自動的に設定する、Tagを使ってFragmentを取ってくる回答はFragmentPagerAdapterを使っている場合は使えるけど、FragmentStatePagerAdapterを使っている場合はダメみたいです。

まぁどのみちAPIが勝手に設定しているTagを利用するのはちょっと怖いですよね。いつ変わるか分からないし。

ちなみに任意のページのFragmentではなくて、現在表示しているページのFragmentを取得したいのであればこんなふうにすればいけました。


       ViewPager pager = (ViewPager) getActivity().findViewById(R.id.pager);
       FragmentStatePagerAdapter sAdapter = (FragmentStatePagerAdapter) pager.getAdapter();
       HistoryListFragment f2 =(HistoryListFragment) sAdapter.instantiateItem(pager, pager.getCurrentItem());
ViewPager#getCurrentItemで現在表示しているページのpositionを取得しただけですが。

2012年10月23日火曜日

[Android]DialogFragmentにListFragmentを表示することはできない

調べてみたのですが、現状だとできなそう。

結局DialogFragment内のonCreateDialogでAlertDialogを作成して、AlertDialogのsetViewでListViewを設定する事にしました。

せっかく作ったListFragmentが再利用できなくてがっかり・・・。
ローディング中の表示とかデータが無いときのメッセージとかを1から作るのめんどくさいんですよね。

もし何かいい方法があったら教えて下さいー。

2012年10月5日金曜日

[Android]育レコのバージョンアップをしました


ワンタッチで育児記録が行えるアプリ、育レコのバージョンアップをしました。

育レコ - Google Play の Android アプリ

今回のバージョンアップでは記録に対して簡単なメモを残せるようにしました。
おっぱいを飲んだけどいつもの半分だったとか、お出かけした場所を記録したりとかができます。

メモの付け方は記録をつけた後に数秒間表示されるメモボタンをクリックしてください。

不具合等何かありましたら教えて下さい。

ではではー。

2012年9月24日月曜日

[Android]MediaCodecAPIを使って動画の音声のみを再生

以前、横浜AndroidPF部の勉強会に参加した時にMediaCodecAPIのお話をお聞きしました。
詳しくはこちらのブログ→横浜Androidプラットフォーム部第23回勉強会 #yapf : 手ぎつねメモ

MediaCodecAPIはAndroid 4.1(Jelly Bean)から追加され、動画周りの処理が簡単にできるようになったとの事でした。

という訳で、動画処理とかやったことない自分でも動画処理ができるか試してみました。
以前から動画の音声だけを再生したかったんですよね。


2012年9月3日月曜日

[Ruby]Ruby技術者認定試験を受けてきました。



受けてきました。

結果は80/100点で合格でした。
合格ラインが75点なので結構ギリギリですかね。

特に今すぐどこかでRubyを使うという訳ではないのですが、
スクリプト言語を1つ覚えたかったのと、サーバー側のアプリケーションを
作成する時はきっとRuby On Railsを使うだろうなーということでRubyのお勉強を
してました。

で、せっかく勉強したので受けてみた、という感じです。

ちなみにRubyのお勉強は定番ともいえる、「たのしいRuby」で行いました。



サンプルコードも多く、StringやArrayといった主要な組込みライブラリの解説もあるためはじめてRubyを触るには最適ですね。
実際にサンプルコードを動かしながら読み進めていくとより理解できると思います。(自分はそのように進めました)

試験対策は公式ガイド本を使いました。


教科書 + 問題集といった構成になっています。教科書の部分は正直たのしいRubyを読んでいればそれほど必要はないかもしれません。
問題集部分は100問、試験2回分の問題が用意されているので、ここの問題をこなせば実際のテストでどんな問題が出題されるかだいたいつかむ事ができると思います。

さて、せっかくRubyを覚えたのでこれから色々と面倒な作業はどんどんスクリプト化していきたいなぁと思っています。

とはいっても目的はWebアプリケーションなのでRoRも早く勉強しないと・・・

2012年7月18日水曜日

[fragment][android]FragmentにFragmentをXMLからinflateする事はできない

はまりました。
Fragment内でFragmentを定義したレイアウトXMLをinflateしようとしたのですが、下記のような例外が発生。

java.lang.IllegalArgumentException: Binary XML file line #67: Duplicate id 0x7f050008, tag null, or parent id 0x0 with another fragment for HistoryListFragment

原因が良く分からなかったのでグーグル先生に聞いてみると以下のスレッドを発見。


Fragments within Fragments


どうやら去年の時点ではFragment内にFragmentを配置することはサポートされていないようです。そんな使い方は推奨しないということでしょうか。

なんでそんな事をしたかというと、ViewPager内にFragmentPagerAdapterを使ってListFragmentを表示していたのですが、固定ヘッダが表示したくなったんですよね。

元のListFragmentをいじりたくなかったので、固定ヘッダとListFragmentを持つFragmentを作って、そのFragmentをFragmentPagerAdapterに渡すようにしました。
その結果、上記例外発生となりました。

ListFragmentを普通のFragmentに置き換えるしかないんですかねー。面倒だ。

2012年7月5日木曜日

[Android][Fragment][Loader][ArrayAdapter]ListFragmentにLoaderを使ってArrayAdapterからリストを表示する

ListFragmentにデータを表示する際、単純にリストのデータを表示したい場合は、ArrayAdapterを使って表示すると思いますが、データが大量にある場合にはやっぱりバックグラウンドでやるべきですよね。

最近はバックグラウンドでの読み込みはLoaderを使ってやるのが良いみたいなのでLoaderを使ってみました。


2012年6月28日木曜日

[Android][Eclipse]複数の開発マシンでデバッグキーを共有する

忘れないようにメモ。

同じデバイスに複数の開発マシンからデバッグビルドでアプリを上書きインストールすると、
開発マシンごとに証明書が違うのでアプリのアップデートが出来ません。

アップデートするには一度アプリのアンイストールが必要になります。

これ面倒だったんですけど、今日タオ本読んでたら書いてありました。

共有するデバッグ用の証明書を用意すれば、それをEclipseに設定してやれば良いみたいです。

Eclipseのメニューから、「Preference」→「Android」→「Build」でビルドのメニューを開いて、「Custom Debug keystore」に共通のデバッグ用証明書を設定するだけ。

なんとも簡単ですね。
次の開発からはこれで少し幸せになれそうです。

2012年6月14日木曜日

ブログを移行しました

fluxflexがサービス終了すると言うことなので、ブログを移行しました。
とりあえずドメインが使えそうなところという事でbloggerにしてみました。

以前の記事はせっかくなのでインポートしてみました。
 Wordpressから記事をエクスポートして、ここでblogger用に変換してインポートしました。

インポートはできたのですが、コードの部分が見づらいですね。
 syntaxhiliterのスクリプトは入れたのですが、インポートした記事にはうまく反映されてくれませんでした。
というか、インポートした記事のHTML見るとすごいことになってます。 

まぁ、前の記事はひとまず見れるだけよしとして、あのままにしておきますかね。
あ、がんばって更新も再開していきたいです。

2012年3月5日月曜日

Galaxy Nexusを購入しました

Glaxy Nexus

なんだか最近Galaxy Nexusの値段が急落していたので、これを機に購入しました。

地元の携帯ショップで9,400円で購入できました。

2012年2月4日土曜日

[Android]タスクアプリ「What's Today's Task ?」をバージョンアップしました

お久しぶりです。

長らくブログをサボっていました。

アプリ開発もサボっていました。

全部Skyrimのせいだということにしたい・・・。

と、本題ですが、タスクアプリ 「What's Today's Task ?」をバージョンアップしました。

What's Today's Task ? - Android マーケットのアプリ

変更点は続きから。