数独パズルの画面作成に苦戦

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マスおきに幅を広げてやれば、それなりの画面が表示されます。(画面は途中ですが・・・)

パズル画面1

で、途中でしんどくなったので、これはプログラムで直接書いた方が楽だと思い、急きょプログラミングを行うことに。
アクティビティの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で行なうのかなと思って書いたのですが、もしかしたら別のメソッドを使うのだろうか?
ただ、先週はあまり時間も取れなかったので、ここから全く進まずに終わりました。
今週は、とりあえず画面作成を目標にがんばってみたいと思います。

ていうか、今週、来週としばらくあまり時間が取れないような気がする。(言い訳)

コメント

PAGE TOP
タイトルとURLをコピーしました