<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Android/組み込み系</title><link>http://blogs.wankuma.com/esten/category/2302.aspx</link><description>Android端末用アプリとか、組み込み系アプリとか、そんなの</description><managingEditor>片桐　継（Tugu Katagiri）</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>Android Studio で Junit を使いたいので、戦い続けて挫折して立ち返って立ち直った話</title><link>http://blogs.wankuma.com/esten/archive/2014/08/21/408431.aspx</link><pubDate>Thu, 21 Aug 2014 16:49:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2014/08/21/408431.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/408431.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2014/08/21/408431.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/408431.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/408431.aspx</trackback:ping><description>&lt;p&gt;最初、EclipseでJunit 4.11+Robolectricを使ってたんだけど、AndroidStudioに移植した時に、全部グリーン状態のソースを移植したのでテストコードは省いてたｗ&lt;/p&gt; &lt;p&gt;なので、機能追加のついでに、テストコードも移植しようと思ったんだけど、意外な展開が。&lt;/p&gt; &lt;div class="insertcode"&gt;&lt;pre&gt;&lt;code&gt;!!! JUnit version 3.8 or later expected:

java.lang.RuntimeException: Stub!&lt;br&gt;&lt;/code&gt;&lt;code&gt;＜中略＞
Process finished with exit code -3&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;素直にRobolectricを依存ライブラリに追加して実行して、&lt;font color="#c0504d"&gt;&lt;strong&gt;なにこれ？？？&lt;/strong&gt;&lt;/font&gt;というわけで色々と調査。で、判ったことは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Android StudioでRobolectric使うならプラグインいれましょう 
&lt;li&gt;クラスパスはJunit＞SDKの順番でライブラリ参照しましょう&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;あふー、gradleをいじる羽目になりましたですよorz　書き直すのメンドイなー。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://robolectric.blogspot.jp/" target="_blank"&gt;Robolectricスタッフのブログ&lt;/a&gt;や&lt;a href="https://groups.google.com/forum/#!forum/robolectric" target="_blank"&gt;GoogleGroup&lt;/a&gt;を見る限りだと、この辺りの問題はできたら解決したいなー的レベルらしくて、しばらくは手動でごにょごにょの世界のようです。&lt;font color="#c0504d"&gt;&lt;strong&gt;まぁAndroid Studio自身がbetaの立場だもんなー、正式版になってからなんだろうなぁ（遠い目）&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;で、やってみたこと。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;app/build.gradleにrobolectricの依存ライブラリ追加 
&lt;li&gt;ルートのbuild.gradleにrobolectricのプラグインのための依存ライブラリ追加 
&lt;li&gt;app/buid.gradleにrobolectircのプラグイン追加 
&lt;li&gt;ここで、いったんgladleをSync 
&lt;li&gt;ターミナルから、プロジェクトルートでgladle robolectric を実行し、必要なクラスがコンパイルされていることを確認 
&lt;li&gt;テストコードを書いて、ライブラリが追加出来ていることを確認 
&lt;li&gt;テストコードから生成されたクラスの出力先をクラスパスに追加 
&lt;li&gt;プロジェクトルートにある、.imlファイルの中にあるクラスファイルの読み込み順番を変更 
&lt;li&gt;gladlew androidTest を実行&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;さらっと書いたけど、&lt;font color="#9b00d3"&gt;２から５の間はgradleソースの読み込みだったので、簡単じゃなかったよorz &lt;/font&gt;　gradleソースはpom.xmlよりも何をやっているのかソースで追える分、楽と言えば楽だし、親切と言えば親切なんだけどね。やっててよかったgroovy。&lt;/p&gt;
&lt;p&gt;そして、何とかたどり着く9のフェーズ。&lt;strong&gt;&lt;font color="#ff0000"&gt;ここで恐怖のハマりポイント、自クラスをクラスパスにうまく追加できない、をやらかしてしまった。&lt;/font&gt;&lt;/strong&gt;いや、世界には、この方法で解決している人もいるので&lt;font color="#c0504d"&gt;&lt;strong&gt;（成功例がMacOSXだったりするのがとてもとても気になるけれどもｗ）&lt;/strong&gt;&lt;/font&gt;きっと、何かが悪いんだろう。&lt;/p&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;収穫はgradleソースが読めるようになった、ってことで、挫折orz&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;これに丸々二日ハマって、なんか疲れたんで、基本に立ち返ってみたんだ。&lt;/p&gt;
&lt;h1&gt;Android SDK　にテストフレームワークがあるのかな？&lt;/h1&gt;
&lt;p&gt;&lt;font color="#9b00d3"&gt;&lt;strong&gt;結論から言えば、ある、Junitがある。ただし、バージョンは3.8。&lt;/strong&gt;&lt;/font&gt;便利なassertもアノテーションも全滅のオールドタイプさん。まぁ悪いバージョンじゃないんだ、基本機能はガッチリ揃ってるし、実績も高いしさ。まさかとは思うけど、&lt;a href="http://mvnrepository.com/" target="_blank"&gt;Mavenリポジトリサイト&lt;/a&gt;で、Junit3.8のダウンロード数が廃れないのは、こいつのせいだったりしてねｗ　&lt;/p&gt;&lt;a href="http://developer.android.com/tools/testing/testing_android.html"&gt;Testing Fundamentals | Android Developers:&lt;br&gt;http://developer.android.com/tools/testing/testing_android.html&lt;/a&gt;&lt;br&gt;
&lt;p&gt;基本に立ち返って、もう一度、この記事を目皿にして読み直し、抜粋したポイントは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ディレクトリを作成する 
&lt;li&gt;テストしたいAndroidオブジェクトに対応したTestCaseを継承してテストコードを書く 
&lt;li&gt;Android Test を実行する&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;これだけ。じゃ、やってみようか、もちろん、最初はレッドのテストでね。&lt;/p&gt;
&lt;p&gt;まず、ディレクトリ作成&lt;/p&gt;
&lt;p&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://esten.dip.jp/blogimg/Android-Studio--Junit-_4EA0/image.png" width="216" height="127"&gt;&lt;/p&gt;
&lt;p&gt;デフォルト配色で、androidTest/javaフォルダが緑色になればOK。これは、テストクラスのあるパッケージディレクトリですよ、を指している色で、これが指定されていないと、後の作業がメンドクサイ、フォルダ見難いｗ&lt;/p&gt;
&lt;p&gt;このフォルダの指定は、モジュールの.imlファイルに記述されているので、検索してフォルダ表記が無かったら、それを記述追加してリビルドすれば環境ができているはず。できるだけ、いじらないでいたいなら、テストクラスとして指定されている別のフォルダがすでにあれば、それを新規作成すると後も綺麗に続けられるので楽。テストクラスのパッケージフォルダ記述が無いなら、仕方ないから追加ね。&lt;/p&gt;
&lt;p&gt;そして、テストクラスを新規作成。これはいつもの新規作成の手順でOK。&lt;/p&gt;
&lt;div class="insertcode"&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ApplicationTest &lt;span style="color: #0000ff"&gt;extends&lt;/span&gt; ApplicationTestCase&amp;lt;Application&amp;gt; {
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ApplicationTest() {
        &lt;span style="color: #0000ff"&gt;super&lt;/span&gt;(Application.&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;);
    }

    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; testAssertion(){
        assertEquals(1,3);
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;絶対レッドのテストｗ＜手抜きすぎｗ&lt;/p&gt;
&lt;p&gt;今回はアクティビティやコンテンツのテストではないので、ApplicationTestCaseを継承したけど、テストしたいものによって継承するテストクラスが異なるので、細かい事は前記述のサイトのリンクから参照で。(そのうち、まとめるとは思うけどｗ)&lt;/p&gt;
&lt;p&gt;クラスが書けたら、次は実行設定。私は、モジュール内のｘｘｘｘTestクラスのtestXXXXメソッドを総なめにした。細かくやりたい人はパッケージ事とかに分けると良いと思う。&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://esten.dip.jp/blogimg/Android-Studio--Junit-_4EA0/image_3.png" width="373" height="355"&gt;&lt;/p&gt;
&lt;p&gt;Android SDKのJunitは実行環境を必要とするのでエミュレーターは起動しておき、立ち上がりを確認したら、テストを実行してエミュレーターに環境割り当てをすると、テストモジュールがエミュレーターにアップロードされて……&lt;/p&gt;
&lt;p&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://esten.dip.jp/blogimg/Android-Studio--Junit-_4EA0/image_4.png" width="675" height="159"&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#ff0000" size="5"&gt;&lt;strong&gt;よっしあぁ！レッドすねぇぇくかもぉぉん♪&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;というわけで、立ち返ってからレッドになるまで、２時間だったというオチｗ&lt;/p&gt;
&lt;p&gt;&lt;font color="#c0504d"&gt;&lt;strong&gt;基本って大事だね！　痛感したわ。&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/408431.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>JavaとF#で、AndroidアプリのListAdapter を書いてみる。</title><link>http://blogs.wankuma.com/esten/archive/2014/08/19/404056.aspx</link><pubDate>Tue, 19 Aug 2014 08:58:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2014/08/19/404056.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/404056.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2014/08/19/404056.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/404056.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/404056.aspx</trackback:ping><description>&lt;p&gt;Androidアプリで、リストを画面に表示したい時、用意するソースは４つ。&lt;/p&gt; &lt;ul&gt; &lt;li&gt;リスト表示するためのListViewを含むレイアウトファイル  &lt;li&gt;リスト一行分の項目を定義したレイアウトファイル  &lt;li&gt;リスト表示するためのアクティビティクラス  &lt;li&gt;リスト一行分の項目を編集するためのリストアダプタクラス&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;この４つのファイルが必要。ちょっとメンドクサイｗ&lt;/p&gt; &lt;p&gt;でも、使い方を覚えれば簡単に色んなリストを作れるようになるので、ちょっと自慢できる、かも＜を&lt;/p&gt; &lt;p&gt;で、今回のお話の主人公は、リストアダプタクラス。&lt;/p&gt; &lt;p&gt;実はAndroidアプリの中ではお約束がとても多くて、このリストアダプタクラスなんかは典型的。&lt;font color="#9b00d3"&gt;&lt;strong&gt;リストを作りたい時には、一行分のことだけ作者は考えてればいいんだよ、という仕様になっていて、とてもシンプルにできている。&lt;/strong&gt;&lt;/font&gt;だから、作る側はそのお約束さえ守っていれば、後はAndroidさんの方で良しなにリストしてくれるの。&lt;/p&gt; &lt;p&gt;で、そのお約束なんだけど、次の事がリストアダプタクラスで定義出来ていれば動くみたい。&lt;/p&gt; &lt;ul&gt; &lt;li&gt;BaseAdapterクラスを継承していること（継承の継承でもOK）  &lt;li&gt;保持するリスト件数を返すgetCountメソッドがあること  &lt;li&gt;保持するリストの項目を返すgetItemメソッドがあること  &lt;li&gt;保持するリストのIDを返すgetItemIdメソッドがあること  &lt;li&gt;一行分のリスト項目を返すgetViewメソッドがあること&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;こうしてできた&lt;font color="#ff0000"&gt;アダプタクラスを目的のListViewのプロパティAdapterにセットしておくと、Androidアプリのフレームワークは、getCountして取れた件数だけ、getViewを回してリストを作成してくれるし、クリックされたリストのアイテム項目をgetItemやgetItemIdを使ってアクティビティに返すようにもしてくれる。&lt;/font&gt;うん、便利だね。&lt;/p&gt; &lt;p&gt;ポイントは、基リストの保持はアダプタでやっても良いし、別のクラスで持っても良いところ。リスト生成する間、リストアダプタクラスがインスタンスをもっている間、リストが維持できていればOKだから、意外と自由。一つの基リストを色んなアダプタでリスト項目に展開することだって可能。使いこなしたい機能の一つだなって思うよ。&lt;/p&gt; &lt;p&gt;そんなリストアダプタクラス、JavaとF#で作ってみた。&lt;/p&gt; &lt;p&gt;レイアウトはresult_item, 項目は数値だけの表示リストでidをresultとして名前を付けて作ってあるとしての例ね。&lt;/p&gt; &lt;p&gt;Javaだと&lt;/p&gt; &lt;div class="insertcode"&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ResultAdapter &lt;span style="color: #0000ff"&gt;extends&lt;/span&gt; BaseAdapter {
    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; List&amp;lt;Integer&amp;gt; list;
    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Context context;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ResultAdapter(Context context, List&amp;lt;Integer&amp;gt; list) {
        &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.context = context;
        &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.list = list;
    }
    @Override
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; getCount() {
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; list.size();
    }
    @Override
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Integer getItem(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; position) {
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; list.get(position);
    }
    @Override
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; getItemId(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; position) {
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; position;
    }
    @Override
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; View getView(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; position, View convertView, ViewGroup parent) {
        View view = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (convertView == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.result_item, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);
        } &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; {
            view = convertView;
        }
        Integer result = getItem(position);
        TextView resultView = (TextView) view.findViewById(R.id.result);
        resultView.setText(result.toString());
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; view;
    }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;F#だと&lt;/p&gt;
&lt;div class="insertcode"&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt; ResultAdapter(activity : Activity, list:int[]) =
    &lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt; BaseAdapter()
    &lt;span style="color: #0000ff"&gt;let&lt;/span&gt; _list : System.Collections.Generic.List&amp;lt;Java.Lang.Integer&amp;gt; =
        &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; System.Collections.Generic.List&amp;lt;Java.Lang.Integer&amp;gt;()
    &lt;span style="color: #0000ff"&gt;do&lt;/span&gt; &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; i &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; list &lt;span style="color: #0000ff"&gt;do&lt;/span&gt; _list.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Java.Lang.Integer(i))
    &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.get_Count() = _list.Count
    &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.GetItem(position) = _list.Item(position) :&amp;gt; Java.Lang.Object
    &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.GetItemId(position) = &lt;span style="color: #0000ff"&gt;int64&lt;/span&gt;(position)
    &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.GetView(position, view, parent) =
        &lt;span style="color: #0000ff"&gt;let&lt;/span&gt; item = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.GetItem(position) 
        &lt;span style="color: #0000ff"&gt;let&lt;/span&gt; view = 
            &lt;span style="color: #0000ff"&gt;match&lt;/span&gt; view &lt;span style="color: #0000ff"&gt;with&lt;/span&gt;
            | &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; -&amp;gt; activity.LayoutInflater.Inflate(Resource_Layout.ResultItem, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
            | x -&amp;gt; x
        view.FindViewById&amp;lt;TextView&amp;gt;(Resource_Id.result).Text &amp;lt;- item.ToString()
        view&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;命名規約の問題で若干差があるけど、こんな感じ。F#の場合、JavaのObject型を使わなくてはならない分キャストがメンドイけれど、まぁクラスの一部だと考えれば、ただの変換作業なので苦も無く。Androidのクラスライブラリ群がJavaととても親和性がある、というかJavaで作られてるというのがよく判るよね。他言語で作るとなると、Javaの型を無視して作るなんて出来ないんだもの。まぁ、JNIを書いてラップして、なら出来るのかもしれないけど、ちょっとなんだか、それも違うんじゃないかなぁとか思ったり。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/404056.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>シリアライズの偉大さを知ったｗ</title><link>http://blogs.wankuma.com/esten/archive/2014/08/15/396673.aspx</link><pubDate>Fri, 15 Aug 2014 21:02:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2014/08/15/396673.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/396673.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2014/08/15/396673.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/396673.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/396673.aspx</trackback:ping><description>&lt;p&gt;SerializableAttributeAndoridアプリの画面を切り替える時、画面同士の情報の引き渡しができる仕組みがあるの。この時に、仲介役となるIntentクラスはとても大切。&lt;/p&gt; &lt;p&gt;やりたかったことは、とあるクラスに格納された情報を、画面の受け渡しに使いたいって事だったんだけど、Javaだと次の方法で出来る。&lt;/p&gt; &lt;ul&gt; &lt;li&gt;受渡のためのクラスにSerializableを持たせる  &lt;li&gt;そのクラスを含むIntentを作成する  &lt;li&gt;StartActivityする&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;NextActivityが次に行きたいActivity、Serializedが自分で作った型だという想定で、サンプルコートだと、&lt;/p&gt; &lt;div class="insertcode"&gt;&lt;pre&gt;Serialized serialized = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Serialized();
String record_key = "&lt;span style="color: #8b0000"&gt;Key&lt;/span&gt;"
Intent intent = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Intent(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, NextActivity.Class);
intent.putExtra(record_key, serialized);
intent.setAction(Intent.ACTION_VIEW);
startActivity(intent);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;こんな感じ。ISerializableを持たせることで、情報を一つのクラスに取りまとめて渡せるので便利。&lt;/p&gt;
&lt;p&gt;そして、この部分で使ってるJavaDocは、&lt;/p&gt;&lt;a href="http://developer.android.com/reference/android/content/Intent.html#putExtra%28java.lang.String,%20java.io.Serializable%29"&gt;http://developer.android.com/reference/android/content/Intent.html#putExtra(java.lang.String, java.io.Serializable)&lt;br&gt;http://developer.android.com/reference/android/content/Intent.html#putExtra%28java.lang.String,%20java.io.Serializable%29&lt;/a&gt;&lt;br&gt;
&lt;p&gt;これ。確かに、putExtra( String, Serializable ) のメソッドが使えるように、作られている。&lt;/p&gt;
&lt;p&gt;で、これを今度は、F#で作る。調べたところ、C#でも同じようにクラスの宣言でISerializableを使うことができるので、出来るんだろうなと気楽に思ってた。さらに調べると、F#のtype宣言は[&amp;lt;SerializableAttribute&amp;gt;]を使うことで実現できるというところまで学習。&lt;/p&gt;
&lt;p&gt;ところが、ちょっと問題ｗ　C#やF#でいうISerializableは.NetFrameworkのものであって、Java.IOのそれではない。&lt;/p&gt;
&lt;p&gt;考えれば当たり前。&lt;/p&gt;
&lt;p&gt;そこをラップしてくれるなんていう便利なものがXamarinAPIにあればなー、なんて思って頑張ったけど、行き着いた答えがこれ。&lt;/p&gt;&lt;a href="http://developer.xamarin.com/guides/android/advanced_topics/java_integration_overview/working_with_jni/"&gt;Working With JNI | Xamarin&lt;br&gt;http://developer.xamarin.com/guides/android/advanced_topics/java_integration_overview/working_with_jni/&lt;/a&gt;&lt;br&gt;
&lt;p&gt;ラップは自分でしろ、そのためのJNIは用意してやるから（ニッコリ）と、読めたｗ&lt;/p&gt;
&lt;p&gt;つまり、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java.IO.ISerializableをJNIした継承インターフェイスを作る 
&lt;li&gt;継承インターフェイスとSerializableAttributeをもつクラスを作る 
&lt;li&gt;putExtraでそのクラスを受渡す&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;うーん、はまりそう。深い闇というか沼の入り口に立ってる予感。とすると、逃げ道を考える。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Json化して、テキストにした後、Intent.Extras.GetSerializableメソッドでシリアライズしてputExtra 
&lt;li&gt;受渡クラスを保持するシングルトンクラスを作成し、項目を特定するIDでputExitra&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;どちらも、JNIを使わなくても、できる形。Json使うのも魅力だけど、２の方法で作ってみた。受渡したいクラスをリストで保持するシングルトンのrecordServiceを作って、メソッドGetPositionでそのリストの場所を取得できるようにしておく。&lt;/p&gt;
&lt;div class="insertcode"&gt;&lt;pre&gt;let position : &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;16 = &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;16 recordService.GetPosition
let activity = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Intent(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, typeof&amp;lt;NextActivity&amp;gt;)
let extra : &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;16[] = [|position|]
activity.PutExtra(record_key, extra) |&amp;gt; ignore
activity.SetAction(Intent.ActionView) |&amp;gt; ignore
&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.StartActivity(activity)&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これで、とりあえず、やりたいことは実現できた。個人で好きにやってるから、こんな風なやり方したけどJson化する方がC#やJavaとの移植性が高い感じがするので、良いかもしれない。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/396673.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>Toastを焼いてみる</title><link>http://blogs.wankuma.com/esten/archive/2014/08/14/392692.aspx</link><pubDate>Thu, 14 Aug 2014 11:50:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2014/08/14/392692.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/392692.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2014/08/14/392692.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/392692.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/392692.aspx</trackback:ping><description>&lt;p&gt;Androidアプリで、好きなところ、Toastがあるところ。&lt;/p&gt; &lt;p&gt;Toastっていうのは、画面のメッセージで、下の方に出てくる、ちょっと角の円いメッセージ表示のやつね。&lt;/p&gt; &lt;p&gt;&lt;img src="http://developer.android.com/images/toast.png"&gt;&lt;/p&gt; &lt;p&gt;これ。&lt;/p&gt; &lt;p&gt;表示するのはとても簡単。&lt;/p&gt; &lt;p&gt;たとえば、Toastにエラーメッセージを表示したい、とする。エラーの内容はエラーコードをIDに割り付けておいて、IDを渡すだけで表示できるように、メソッド化しておけば便利だよね。そんなメソッドを書いた時、&lt;/p&gt; &lt;p&gt;Javaだと&lt;/p&gt; &lt;div class="insertcode"&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt; displayError(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; errorId) {
    Toast.makeText(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, errorId, Toast.LENGTH_LONG).show();
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;C#だと、&lt;/p&gt;
&lt;div class="insertcode"&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt; displayError(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; errorId) {
    Toast.makeText(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, errorId, ToastLength.Long).show();
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;F#だと、&lt;/p&gt;
&lt;div class="insertcode"&gt;&lt;pre&gt;member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.DisplayError(id:&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;) = 
    Toast.MakeText(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, id, ToastLength.Long).Show()&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;font color="#9b00d3"&gt;&lt;strong&gt;やってることは同じなのに、言語の違いで微妙な違いがあるのが面白いｗ&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;こういうのを楽しめるのがプログラミングの楽しい所の一つだと思ってるの。&lt;/p&gt;
&lt;p&gt;JavaからC#への移植は簡単だけど、JavaからF#への移植は意外と手間かかるってのが、この１メソッドの比較からでも判る。&lt;/p&gt;
&lt;p&gt;でも、間にC#を挟んで移植すると、もうちょっと楽になりそうな気がするね。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/392692.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>Xamarin Studio がバージョンアップしてるよ</title><link>http://blogs.wankuma.com/esten/archive/2014/08/14/392686.aspx</link><pubDate>Thu, 14 Aug 2014 08:50:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2014/08/14/392686.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/392686.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2014/08/14/392686.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/392686.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/392686.aspx</trackback:ping><description>&lt;p&gt;Xamarin studio が 5.2.1 にバージョンアップしてた。&lt;/p&gt; &lt;p&gt;２回目以降のデバッグ時に既存エミュレーターへアタッチできるように修正してくれたのが大きいｗ&lt;/p&gt; &lt;p&gt;地味に効いてたんだよなー、これ。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/392686.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>どうせやるなら、F#でやってみても良いよね？</title><link>http://blogs.wankuma.com/esten/archive/2014/08/06/367802.aspx</link><pubDate>Wed, 06 Aug 2014 10:51:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2014/08/06/367802.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/367802.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2014/08/06/367802.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/367802.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/367802.aspx</trackback:ping><description>&lt;p&gt;Xamarinで作ることのできるアプリケーションは、New Solutionすると一目瞭然。&lt;/p&gt; &lt;p&gt;&lt;img title="2014080501" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="2014080501" src="http://esten.dip.jp/blogimg/F_C620/2014080501.jpg" width="475" height="282"&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#ff0000" size="7"&gt;&lt;strong&gt;VB.NetでAndroidプログラミングさせろぉぉぉっ！&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;C#でやれるんなら、もういっちょプリコンパイラ挟むだけなのにorz&lt;/p&gt; &lt;p&gt;やらせてくれても良いじゃないのよぅぅ。&lt;/p&gt; &lt;p&gt;C#も嫌いじゃないが、ここはやっぱ、F#でやってみようというのが私。&lt;/p&gt; &lt;p&gt;&lt;font color="#ff0000"&gt;べ、別に、オライリーの表紙の鳥さんが可愛いからとか、そんな理由ぢゃないからね！&lt;/font&gt;&lt;font color="#0000ff"&gt;冠鶴と金魚と蛇も捨てがたいんだけどさｗ&lt;/font&gt;＜を&lt;/p&gt; &lt;p&gt;&lt;img title="2014080502" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="2014080502" src="http://esten.dip.jp/blogimg/F_C620/2014080502.jpg" width="272" height="359"&gt;&lt;/p&gt; &lt;p&gt;オライリーさんとこでオンライン書籍DLで買うと、安いのな。サンプルコードの解説やなんや、オライリーさんところの英語は読みやすいのでしんどくないし、わざわざ日本語版探すより、原書をオンラインDLで買う方がずっと安い。会員コード持ってクーポンコード使うとさらに安い時あるし、対応言語やプラットホームも種類多いし、&lt;strong&gt;何より、表紙の動物が可愛い&lt;/strong&gt;＜一番大事な所&lt;/p&gt; &lt;p&gt;というわけで、早速ソリューションを新規作成。&lt;/p&gt; &lt;p&gt;作るアプリは、Java＋AndroidStudioで作ったものと同じものを再作成、ということでｗ&lt;/p&gt; &lt;p&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://esten.dip.jp/blogimg/F_C620/image.png" width="537" height="322"&gt;&lt;/p&gt; &lt;p&gt;ほー。&lt;font color="#9b00d3"&gt;ファイル配置お作法はテンプレだし、だいたいのやディレクトリ構成も一緒&lt;/font&gt;だね。これはステキ。すぐに取り掛かれそうだ。&lt;/p&gt; &lt;p&gt;ちょっと寄り道して、参照ライブラリとかみてみようかな。&lt;/p&gt; &lt;p&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://esten.dip.jp/blogimg/F_C620/image_3.png" width="454" height="380"&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#ff0000"&gt;Linq発見！&lt;/font&gt;Jsonもいるね。というか、そうか、NUnit　になるんだよな、テストエンジン。&lt;/p&gt; &lt;p&gt;Linqに久々に触れるとか、.Netよ、私は帰ってきた！みたいな気持ちになるね、しみじみするｗ&lt;/p&gt; &lt;p&gt;さて、サイトのサンプルはC#なんだけど、そこはF#に読み替えつつ、このページをじっくり読んでから手をつけようと思うの。&lt;/p&gt;&lt;a href="http://developer.xamarin.com/guides/android/getting_started/"&gt;Getting Started | Xamarin&lt;br&gt;http://developer.xamarin.com/guides/android/getting_started/&lt;/a&gt;&lt;br&gt; &lt;p&gt;Androidアプリのキモとお作法についても記載があるので、おさらいしつつ、進めよう。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/367802.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>Xamarinをインストールしてみる</title><link>http://blogs.wankuma.com/esten/archive/2014/08/05/365965.aspx</link><pubDate>Tue, 05 Aug 2014 13:10:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2014/08/05/365965.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/365965.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2014/08/05/365965.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/365965.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/365965.aspx</trackback:ping><description>&lt;p&gt;ついでだ。今度はXamarinを触ってみよう。&lt;/p&gt; &lt;p&gt;というわけでインストールしてみる。&lt;/p&gt; &lt;p&gt;&lt;a href="http://xamarin.com/"&gt;Mobile App Development &amp;amp; App Creation Software - Xamarin&lt;br&gt;http://xamarin.com/&lt;/a&gt;&lt;br&gt;&lt;/p&gt; &lt;p&gt;ここのDownloadNowから環境にあったインストールexeを取ってくるだけ。&lt;/p&gt; &lt;p&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://esten.dip.jp/blogimg/Xamarin_A97A/image.png" width="392" height="330"&gt;&lt;/p&gt; &lt;p&gt;あとはインストーラにおまかせ。&lt;/p&gt; &lt;p&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://esten.dip.jp/blogimg/Xamarin_A97A/image_3.png" width="400" height="369"&gt;&lt;/p&gt; &lt;p&gt;いつもの感じですねー。nextをクリックして進めてく。&lt;/p&gt; &lt;p&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://esten.dip.jp/blogimg/Xamarin_A97A/image_4.png" width="402" height="371"&gt;&lt;/p&gt; &lt;p&gt;ライセンス許諾は英語。なるほど、５人までの使用がスターター・インディーズというライセンスのくくりの扱いなのね。&lt;/p&gt; &lt;p&gt;共用はライセンス違反だよ、とも書いてます。あと、どんなライセンス形態があるのかも説明してまする。&lt;/p&gt; &lt;p&gt;まぁ、ボッチのいじりなのでスターターライセンスでいいのかな？&lt;/p&gt; &lt;p&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://esten.dip.jp/blogimg/Xamarin_A97A/image_5.png" width="413" height="381"&gt;&lt;/p&gt; &lt;p&gt;で、AndroidSDKインストの場所設定。デフォルトはちょっとそれでいいの？的場所なので、Choose new location　で新しい場所を指定。つか、すでにAS使ってるからあるんだけど、パス指定だけでも良かったような……といって、下手に指定して環境壊されるのもいやなので、ここは無駄だなぁとか思いつつも、新しい場所にした。&lt;/p&gt; &lt;p&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://esten.dip.jp/blogimg/Xamarin_A97A/image_6.png" width="419" height="388"&gt;&lt;/p&gt; &lt;p&gt;こんだけ入れますぜ、確認。AndroidSDKは最新だけを入れるんだね。ってことはLか。むむむむ。&lt;/p&gt; &lt;p&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://esten.dip.jp/blogimg/Xamarin_A97A/image_7.png" width="421" height="391"&gt;&lt;/p&gt; &lt;p&gt;プログレス表示開始ー。あとは終わるのをまって、&lt;/p&gt; &lt;p&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://esten.dip.jp/blogimg/Xamarin_A97A/image_8.png" width="426" height="401"&gt;&lt;/p&gt; &lt;p&gt;さて、はじめますかーｖ&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/365965.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>Androidアプリケーションでジェスチャーを実装するためのお作法</title><link>http://blogs.wankuma.com/esten/archive/2014/07/31/353803.aspx</link><pubDate>Thu, 31 Jul 2014 11:20:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2014/07/31/353803.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/353803.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2014/07/31/353803.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/353803.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/353803.aspx</trackback:ping><description>&lt;p&gt;というのを知ったｗ&lt;/p&gt; &lt;p&gt;&lt;a href="http://making-interactive.htmlhttp://developer.android.com/training/custom-views/making-interactive.html"&gt;making-interactive&lt;br&gt;http://developer.android.com/training/custom-views/making-interactive.html&lt;/a&gt;&lt;br&gt;&lt;/p&gt; &lt;p&gt;ここに書いてあるんだけれど、&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Whether or not you use &lt;code&gt;&lt;a href="http://developer.android.com/reference/android/view/GestureDetector.SimpleOnGestureListener.html"&gt;GestureDetector.SimpleOnGestureListener&lt;/a&gt;&lt;/code&gt;, you must always implement an &lt;code&gt;&lt;a href="http://developer.android.com/reference/android/view/GestureDetector.OnGestureListener.html#onDown%28android.view.MotionEvent%29"&gt;onDown()&lt;/a&gt;&lt;/code&gt; method that returns &lt;code&gt;true&lt;/code&gt;. &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;片桐的超意訳によると&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;GestureDetcector.SimpleOnGestureListenerを使う時には、必ずonDown()メソッドでtrue返してねん&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;ってことらしい。&lt;font color="#ff0000"&gt;&lt;strong&gt;画面でジェスチャーを受け取る時、最初に発生するイベントがonDown()なのだそうで、ここからtrueが返ることで後続のイベントにeventオブジェクトを引き渡しつつ発火できるって仕組み。&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;イベント連鎖でジェスチャーを判断してるとか、面白いねー。&lt;/p&gt; &lt;h2&gt;閑話休題&lt;/h2&gt; &lt;p&gt;2014年の横浜恐竜博で恐竜ロボットの制作過程や実験なんかが展示されていたのだけれど、その中に、前に人が立つと、その動きに反応して動くドロマエオサウルスの展示があったの。&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;ノートPC＋キネクト→ロボットコントローラで構成されていたよ。&lt;/font&gt;フレームを認識して、反応させて、追いかけようとしたり、鳴いてみたり。将来、CGでもない、着ぐるみでもない恐竜コンテンツができそうな予感。個人的には、着ぐるみのモフモフ感と柔らかさは捨てがたいけれどもねｗ&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/353803.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>Androidアプリケーションの設定画面設計と実装についてまとめてみた。</title><link>http://blogs.wankuma.com/esten/archive/2014/07/30/353339.aspx</link><pubDate>Wed, 30 Jul 2014 12:39:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2014/07/30/353339.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/353339.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2014/07/30/353339.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/353339.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/353339.aspx</trackback:ping><description>&lt;h2&gt;そのまえに。&lt;/h2&gt; &lt;p&gt;フラグメント(Fragment)という用語が意外と大事って知った。&lt;/p&gt; &lt;p&gt;これは、画面の縦横制御や別個に動作する画面オブジェクトの制御にかかわるライブラリ群らしく、AndroidのバージョンHoneycombから追加されている機能。つまり、UIをプログラミングするにあたって、避けて通れない存在……と考えて良いみたい。&lt;/p&gt; &lt;p&gt;モデルやコントロール部分を作ってる間は考えなくてよかったんだけど、いざ、&lt;font color="#ff0000"&gt;画面の部分を作るとなると、この辺りきちんと考えて実装しないと、例外でストーンと落ちちゃうアプリができちゃう&lt;/font&gt;。&lt;font color="#a5a5a5"&gt;うむ、メンドクサイな＜を&lt;/font&gt;&lt;/p&gt; &lt;p&gt;一画面一機能で、メニューやダイアログはできれば使わないでいくと、Fragmentを実装しなくちゃ！的に追いつめられる感じではなさそうだけど。その一方で、&lt;strong&gt;&lt;font color="#0000ff"&gt;API使ってできるだけコードレスで楽ちんしたければ、Fragmentを意識して実装しつつ、APIコールもお作法に則っていきましょう、という事が基本&lt;/font&gt;&lt;/strong&gt;だってことを勉強した。&lt;/p&gt; &lt;p&gt;さて、設定画面作り、いってみよー。&lt;/p&gt; &lt;h2&gt;設定画面設計と実装の流れ。&lt;/h2&gt; &lt;p&gt;作業手順は次の通り&lt;/p&gt; &lt;ul&gt; &lt;li&gt;設定項目を洗い出す。  &lt;li&gt;項目のXMLファイルを実装  &lt;li&gt;項目を入力するためのXMLファイルを実装  &lt;li&gt;設定画面アクティビティの実装&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;まぁ、いつもの通り、っちゃぁそのままだ。&lt;/p&gt; &lt;h3&gt;設定項目を洗い出す&lt;/h3&gt; &lt;p&gt;設定項目洗い出しは設計のお話だけど、ここでのポイントは、&lt;font color="#0000ff"&gt;２階層のアウトラインでまとめておくこと&lt;/font&gt;。&lt;/p&gt; &lt;p&gt;たとえば、&lt;/p&gt; &lt;div class="insertcode"&gt; &lt;ul&gt; &lt;li&gt;一般  &lt;ul&gt; &lt;li&gt;画面の色&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;アカウント  &lt;ul&gt; &lt;li&gt;ユーザーID  &lt;li&gt;パスワード&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;ネットワーク  &lt;ul&gt; &lt;li&gt;プロキシの登録&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt; &lt;p&gt;とかいう感じで。小タイトル＆項目タイトル、中身の説明なんかあれば良い感じ。こうすることでそのままXMLにまとめて、APIからすんなり呼び出せるように実装できるよ。&lt;/p&gt; &lt;h3&gt;項目のXMLファイルを実装&lt;/h3&gt; &lt;p&gt;項目のタイトルや表示する説明書きが決まったら、それらを /res/values/pref_strings.xml にresources/stringとして実装。すでにあるstrings.xmlファイルでも良いんだけど、ファイルを分けておくと中身を管理しやすいと思う。といっても、好き好きだけど。&lt;/p&gt; &lt;p&gt;リストにしたいものがある場合には、ここで、選択肢の候補をresources/arrayで実装しておいてね。&lt;/p&gt; &lt;h3&gt;項目を入力するためのXMLファイルを実装&lt;/h3&gt; &lt;p&gt;実際に、どんな入力方式で項目を設定するのか、それを/res/xml/pref_xxxxx.xml　に実装。ここは肝。&lt;/p&gt; &lt;p&gt;入力形式には次の物があって、&lt;/p&gt; &lt;ul&gt; &lt;li&gt;テキスト  &lt;li&gt;リスト  &lt;li&gt;チェックボックス&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;が準備されてる。テキストは入力するときにダイアログが出るし、リストはあらかじめ作っておいた候補を選択、チェックボックスはON/OFFの形式ね。どの設定項目をどの方法で入力できるようにするかを決めて、実際にXMLに実装していくの。&lt;/p&gt;&lt;a href="http://developer.android.com/guide/topics/ui/settings.html"&gt;settings&lt;br&gt;http://developer.android.com/guide/topics/ui/settings.html&lt;/a&gt;&lt;br&gt; &lt;p&gt;サンプルはここに。&lt;/p&gt; &lt;h3&gt;設定画面アクティビティの実装&lt;/h3&gt; &lt;p&gt;ここまで準備できたら、次はアクティビティの実装。ここで、先述のフラグメントが登場。&lt;/p&gt; &lt;div class="insertcode"&gt; &lt;blockquote&gt; &lt;p&gt;If you're developing for Android 3.0 (API level 11) and higher, you should use a &lt;a href="http://developer.android.com/reference/android/preference/PreferenceFragment.html"&gt;PreferenceFragment&lt;/a&gt; to display your list of &lt;a href="http://developer.android.com/reference/android/preference/Preference.html"&gt;Preference&lt;/a&gt; objects. You can add a &lt;a href="http://developer.android.com/reference/android/preference/PreferenceFragment.html"&gt;PreferenceFragment&lt;/a&gt; to any activity?you don't need to use &lt;a href="http://developer.android.com/reference/android/preference/PreferenceActivity.html"&gt;PreferenceActivity&lt;/a&gt;.  &lt;p&gt;&lt;a href="http://developer.android.com/guide/components/fragments.html"&gt;Fragments&lt;/a&gt; provide a more flexible architecture for your application, compared to using activities alone, no matter what kind of activity you're building. As such, we suggest you use &lt;a href="http://developer.android.com/reference/android/preference/PreferenceFragment.html"&gt;PreferenceFragment&lt;/a&gt; to control the display of your settings instead of &lt;a href="http://developer.android.com/reference/android/preference/PreferenceActivity.html"&gt;PreferenceActivity&lt;/a&gt; when possible.  &lt;p&gt;Your implementation of &lt;a href="http://developer.android.com/reference/android/preference/PreferenceFragment.html"&gt;PreferenceFragment&lt;/a&gt; can be as simple as defining the &lt;a href="http://developer.android.com/reference/android/preference/PreferenceFragment.html#onCreate%28android.os.Bundle%29"&gt;onCreate()&lt;/a&gt; method to load a preferences file with &lt;a href="http://developer.android.com/reference/android/preference/PreferenceFragment.html#addPreferencesFromResource%28int%29"&gt;addPreferencesFromResource()&lt;/a&gt;. &lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt; &lt;p&gt;って書かれててね。片桐的超意訳すると、 &lt;/p&gt; &lt;div class="insertcode"&gt; &lt;blockquote&gt; &lt;p&gt;APIのレベル11以降で作るなら、XMLで作った設定オブジェクト表示にはPreferenceFragment使わないとダメー、ダメダメ。PreferenceActivityは使わなくて良いからさ、使いたいActivityにPreferenceFragmentを追加してやってよ。  &lt;p&gt;どんなアクティビティを作った時でも、フラグメントはアプリをよりフレキシブルにしてくれる便利もんだよ。だから、設定画面にはPreferenceActivity使うより、こっち使う事をオススメ。  &lt;p&gt;PreferenceFragmentのonCreateでaddPreferencesFromResouceメソッド使うだけで簡単にできちゃうんだ。そのメソッドがXMLファイルから設定項目読みだしてくれるよ。&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt; &lt;p&gt;的に、ご本家からは推奨されてる。  &lt;p&gt;実際に、そういう事なら、とかるーっく実装。&lt;/p&gt; &lt;div class="insertcode"&gt;&lt;pre&gt;&lt;b&gt;public class &lt;/b&gt;SettingsActivity &lt;b&gt;extends &lt;/b&gt;PreferenceActivity {

    @Override
    &lt;b&gt;protected void &lt;/b&gt;onCreate(Bundle savedInstanceState) {
        &lt;b&gt;super&lt;/b&gt;.onCreate(savedInstanceState);

        &lt;i&gt;// Display the fragment as the main content.
&lt;/i&gt;&lt;i&gt;        &lt;/i&gt;getFragmentManager().beginTransaction().replace(android.R.id.content,
                &lt;b&gt;new &lt;/b&gt;GeneralPreferenceFragment()).commit();
    }

    &lt;b&gt;public static class &lt;/b&gt;GeneralPreferenceFragment &lt;b&gt;extends &lt;/b&gt;PreferenceFragment {
        @Override
        &lt;b&gt;public void &lt;/b&gt;onCreate(Bundle savedInstanceState) {
            &lt;b&gt;super&lt;/b&gt;.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.pref_general);

        }
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Activityのクラスに、サブクラスとしてFragmentを実装し、それをonCreateで読みだすだけ。&lt;/strong&gt;うん、これだけだったわ。 &lt;font color="#9b00d3"&gt;&lt;strong&gt;テンプレに登録しておいても良いくらいだｗ&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/353339.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>Eclipseで作成するAndroidアプリケーションの問題？</title><link>http://blogs.wankuma.com/esten/archive/2014/07/25/346212.aspx</link><pubDate>Fri, 25 Jul 2014 17:14:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2014/07/25/346212.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/346212.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2014/07/25/346212.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/346212.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/346212.aspx</trackback:ping><description>&lt;p&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;色々と書いていたけれど、最後の最後で、どうしても、うまく行かなくなったの。&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#ff0000"&gt;プロジェクトからapkを作成すると、自作クラスが含まれない。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;怪しいとおもって、Eclipseから新規のandoroidアプリケーションプロジェクト作成からやり直したのだけれど、どうしても、うまくいかない。&lt;/p&gt; &lt;p&gt;&lt;font color="#ff0000"&gt;Unable to Instantiate Activity: ClassNotFound Exception を発生して、アプリケーションが起動できない。&lt;/font&gt; &lt;p&gt;で、クラスやソースのコーディングならともかく、プロジェクト構成の問題のようで、一日かけても解決できなかったの。&lt;/p&gt; &lt;p&gt;そこで、発想を変えてみた。&lt;/p&gt; &lt;p&gt;&lt;font color="#9b00d3"&gt;&lt;strong&gt;開発IDEをeclipseからAndroid Studio に変えて、プロジェクトを新規に作成して、コーディングソースをコピペで移植。&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font color="#ff0000" size="7"&gt;&lt;strong&gt;動いたーーーー！&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;デバッガも動くし、エミュレーターにも接続できるし、さくさくapkもビルドしてくれる。&lt;/p&gt; &lt;p&gt;問題は、Gitの実行エンジン「git.exe」を外部から登録する形なので、Eclipseプラグインでgitしていたようなことはできない、ってことくらい。&lt;/p&gt; &lt;p&gt;でもそれも、SouceTreeで解決。これ、内部実行Gitエンジンもってるので、インストする必要ないんだわ。&lt;/p&gt; &lt;p&gt;&lt;a href="https://www.atlassian.com/ja/software/sourcetree/overview"&gt;Git、Mercurial 対応 無料 DVCS Mac、Windowsクライアント | Atlassian&lt;br&gt;https://www.atlassian.com/ja/software/sourcetree/overview&lt;/a&gt;&lt;br&gt;&lt;/p&gt; &lt;p&gt;SouceTree　から、AndroidStudioで作成したプロジェクトをgitプロジェクト化したうえで、BitBucketにリモートするよう設定しておけば、Gitで管理できる状態にできる。うむ、便利だ。&lt;/p&gt; &lt;p&gt;さて、さくさく続きを作っていくぞー。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/346212.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>