Androidで数値入力用のカスタムWidgetを作成しようと思い、ボタンをTableLayoutへ配置するようにしたのですが、カスタムWidgetをレイアウトファイルにセットしても表示がされない…。
環境は以下の通りです。
OS:Windows 7(64bit)
JDK:1.6
Android Debug Bridge version:1.0.26
Eclipse: Helios Service Release 1
API:Device API version is 7 (Android 2.1-update1)
いろいろ調べたところ、原因はわかりません(というか調べ切れていません)が、AttributeSetを引数として使用していないことが原因だったようです。
1: public class NumInputButtonWidget extends TableLayout {
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum2"> 2:</span>  </pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum3"> 3:</span> <span style="color:#008000;">/**</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum4"> 4:</span> <span style="color:#008000;"> * @param context</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum5"> 5:</span> <span style="color:#008000;"> * @param attrs</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum6"> 6:</span> <span style="color:#008000;"> */</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum7"> 7:</span> <span style="color:#0000ff;">public</span> NumInputButtonWidget(Context context, AttributeSet attrs) {</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum8"> 8:</span> <span style="color:#0000ff;">super</span>(context, attrs);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum9"> 9:</span>  </pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum10"> 10:</span> <span style="color:#008000;">// 初期化処理</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum11"> 11:</span> init(context,attrs);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum12"> 12:</span> }</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum13"> 13:</span>  </pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum14"> 14:</span> <span style="color:#008000;">/**</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum15"> 15:</span> <span style="color:#008000;"> * @param context</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum16"> 16:</span> <span style="color:#008000;"> */</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum17"> 17:</span> <span style="color:#0000ff;">public</span> NumInputButtonWidget(Context context) {</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum18"> 18:</span> <span style="color:#0000ff;">this</span>(context, null);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum19"> 19:</span> }</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum20"> 20:</span>  </pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum21"> 21:</span> <span style="color:#008000;">/**</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum22"> 22:</span> <span style="color:#008000;"> * @param context</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum23"> 23:</span> <span style="color:#008000;"> */</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum24"> 24:</span> <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">void</span> init(Context context,AttributeSet attrs) {</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum25"> 25:</span>  </pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum26"> 26:</span> <span style="color:#0000ff;">int</span> rowNum = 0;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum27"> 27:</span>  </pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum28"> 28:</span> <span style="color:#0000ff;">if</span>(attrs !=null) {</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum29"> 29:</span> <span style="color:#0000ff;">for</span>(<span style="color:#0000ff;">int</span> i=7;i > -3;i-=3) {</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum30"> 30:</span> TableRow tableRow = getButtonTableRow(i, context, attrs);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum31"> 31:</span> addView(tableRow,<span style="color:#0000ff;">new</span> LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum32"> 32:</span>  </pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum33"> 33:</span> setColumnStretchable(rowNum, true);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum34"> 34:</span> rowNum++;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum35"> 35:</span> Log.v(<span style="color:#006080;">"Debug"</span>,<span style="color:#006080;">"i = "</span> + i);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum36"> 36:</span> }</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum37"> 37:</span> }</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum38"> 38:</span> }</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum39"> 39:</span>  </pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum40"> 40:</span> <span style="color:#0000ff;">private</span> TableRow getButtonTableRow(<span style="color:#0000ff;">int</span> num, Context context, AttributeSet attrs) {</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum41"> 41:</span> TableRow tableRow = <span style="color:#0000ff;">new</span> TableRow(context,attrs);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum42"> 42:</span>  </pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum43"> 43:</span> Button button1 = <span style="color:#0000ff;">new</span> Button(context,attrs);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum44"> 44:</span> button1.setTextSize(10f);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum45"> 45:</span> tableRow.addView(button1);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum46"> 46:</span>  </pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum47"> 47:</span> Button button2 = <span style="color:#0000ff;">new</span> Button(context,attrs);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum48"> 48:</span> button1.setTextSize(10f);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum49"> 49:</span> tableRow.addView(button2);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum50"> 50:</span>  </pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum51"> 51:</span> Button button3 = <span style="color:#0000ff;">new</span> Button(context,attrs);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum52"> 52:</span> button1.setTextSize(10f);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum53"> 53:</span> tableRow.addView(button3);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum54"> 54:</span>  </pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum55"> 55:</span> <span style="color:#0000ff;">if</span>(num <= 0) {</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum56"> 56:</span> button1.setText(<span style="color:#006080;">"0"</span>);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum57"> 57:</span> button2.setText(<span style="color:#006080;">"C"</span>);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum58"> 58:</span> button2.setTextColor(Color.RED);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum59"> 59:</span> </pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum60"> 60:</span> button3.setText(<span style="color:#006080;">"→"</span>);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum61"> 61:</span> }<span style="color:#0000ff;">else</span> {</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum62"> 62:</span> button1.setText(String.valueOf( num));</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum63"> 63:</span> button2.setText(String.valueOf(num + 1));</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum64"> 64:</span> button3.setText(String.valueOf(num + 2));</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum65"> 65:</span> }</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum66"> 66:</span>  </pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum67"> 67:</span> <span style="color:#0000ff;">return</span> tableRow;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum68"> 68:</span> }</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum69"> 69:</span> }</pre>
具体的には18行目のcontextしか引数をとらないコンストラクタを当初は
super(context)
としていたのですが、上記の通り変更しました。その上で、24行目のinitメソッドについてもAttributeSetを引数として取得するように変更。initメソッド内で生成するインスタンスについてはすべてAttributeSetを引数として使用するようにしたところ正常に表示されるようになりました。
ちなみに、レイアウトファイルにボタンなどが表示されない場合には次のエラーが表示されていました。
Parser is not a BridgeXmlBlockParser!
Googleで検索したのですが、該当する内容に適切な投稿などを得ることはできませんでした。カスタムWidgetを作成されている方のソースと自分のソースを比較することで何とかたどり着けました。
ちなみに、もともとはGoogleAndroidプログラミング入門のOXゲームの部分を参考に作成しようとしたのですがうまくいきませんでした。とはいうものの、カスタムWidgetをどのように作ればよいのかという示唆があったのでとても助かりました。