Androidプログラミングの学習と言うことで、数独パズルを作り始めたのですが、最初の画面作成のところでいきなりつまっています。(笑)
TableLayoutを使ってみてびっくりしたのですが、テーブルのセルに線を引くための設定がないんですね。
で、色々と調べてみて、どうやらMarginとPaddingと使うことで、擬似的に線を引くことができるらしい。
ということで、さっそくやってみました。
<TableLayout android:id="@+id/tableLayout1" android:layout_width="286dp" android:layout_height="wrap_content" android:background="#000000" android:paddingLeft="2dp" android:paddingTop="2dp" > <TableRow android:id="@+id/tableRow1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="1dp" android:background="#000000" > <TextView android:id="@+id/textCell11" android:layout_width="30dp" android:layout_height="30dp" android:layout_marginRight="1dp" android:background="#ffffff" android:gravity="center" android:text="@string/label_1" android:textAppearance="?android:attr/textAppearanceLarge" android:textColor="#000000" />
とりあえず、高さや幅は決め打ちで作成しました。
全部書くと大きくなりすぎるので、構成がわかる最低限でXMLをカットしています。
TableLayoutの背景色を黒色に設定しておいて、左と上側のPaddingを設定します。
次に、TableRowの背景色も黒に設定して、こちらはmarginBottomで下側の幅を設定します。
最後に行に並べるTextViewは、背景色を白色に設定して、右側のPaddingを設定することで、黒線を表示できます。
数独パズルなので、3マスおきに幅を広げてやれば、それなりの画面が表示されます。(画面は途中ですが・・・)
で、途中でしんどくなったので、これはプログラムで直接書いた方が楽だと思い、急きょプログラミングを行うことに。
アクティビティのOnCreateイベントで、TableLayoutを動的に追加してやろうと、以下のようなプログラムを書いてみました。
/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.gameplay); createNumberPlaceField(); } /** * 数独パズルのフィールドを作成する */ private void createNumberPlaceField() { //テーブルレイアウトを作成する TableLayout tableLayout = new TableLayout(this); TableLayout.LayoutParams tableLayoutParams = new TableLayout.LayoutParams(); tableLayout.setLayoutParams(new LayoutParams(dpToPixel(286),LayoutParams.WRAP_CONTENT)); //tableLayoutParams.width = dpToPixel(286); //tableLayoutParams.height = LayoutParams.WRAP_CONTENT; tableLayout.setBackgroundColor(Color.BLACK); tableLayout.setPadding(dpToPixel(2), dpToPixel(2), 0, 0); addContentView(tableLayout, tableLayoutParams); //9行作成する for (int i=1; i<=9; i++) { TableRow.LayoutParams rowLayout = new TableRow.LayoutParams(); TableRow tableRow = new TableRow(this); tableRow.setBackgroundColor(Color.BLACK); tableRow.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); if (i%3==0) { rowLayout.bottomMargin = dpToPixel(2); } else { rowLayout.bottomMargin = dpToPixel(1); } tableLayout.addView(tableRow, rowLayout); //9列分TextViewを作成する for (int j=1; j<=9; j++) { TextView textView = new TextView(this); textView.setWidth(dpToPixel(30)); textView.setHeight(dpToPixel(30)); textView.setLayoutParams(new LayoutParams(dpToPixel(30), dpToPixel(30))); textView.setBackgroundColor(Color.WHITE); textView.setGravity(Gravity.CENTER); textView.setTextColor(Color.BLACK); textView.setTextAppearance(this, android.R.style.TextAppearance_Large); textView.setText(String.valueOf(j)); LinearLayout.LayoutParams textParam = new LinearLayout.LayoutParams(dpToPixel(30), dpToPixel(30)); if (j % 3 == 0) { textParam.setMargins(0, 0, dpToPixel(2), 0); } else { textParam.setMargins(0, 0, dpToPixel(1), 0); } tableRow.addView(textView, textParam); } } } private int dpToPixel(float dp) { DisplayMetrics metrics = getResources().getDisplayMetrics(); float fpixels = metrics.density * dp; int pixels = (int) (fpixels + 0.5f); return pixels; }
しかし、実際に動かしてみると、全くテーブルが表示されなくなってしまいました。(笑)
Androidプログラミングにまだ慣れてないので、どこか間違っているのかもしれません。
プログラミングだと、幅や高さの単位がdpからピクセルになるそうなので、dpをピクセルに変換するdpToPixelという関数を作って変換しています。
内容はいくつかのサイトを見て書いたものなので、これがあっているかどうか検証ができていません。
ドキュメント見て、コントロールの追加はaddContentViewで行なうのかなと思って書いたのですが、もしかしたら別のメソッドを使うのだろうか?
ただ、先週はあまり時間も取れなかったので、ここから全く進まずに終わりました。
今週は、とりあえず画面作成を目標にがんばってみたいと思います。
ていうか、今週、来週としばらくあまり時間が取れないような気がする。(言い訳)
コメント