2017-08-11 14 views
0

私はAndroid開発には新しく、私は自分自身を教えるためにチェスアプリに取り組んできました。しかし、私は今、立ち往生しています。ImageButtonをプログラムでグリッドに塗りつぶすにはどうすればよいですか?

  1. ボタンは、ボタンの間にはギャップが(ありません
  2. グリッド空間が均等にボタン
  3. 間に分散されたグリッド全体を埋める:基本的に、私はあるようImageButtonsの8x8のグリッドを描画するための良い方法が必要です明確に#2)
  4. グリッドは正方形で、そのサイズは制御できます(画面サイズに基づいて自動的にサイズを変更できます)。

それとも、簡単に言えば、それは標準のチェスボードのようになります:)私は成功しませんいくつかのレイアウトを試してみた

"Chessboard"

私は(ボードを描画する必要があります)PlayGameActivityの内側に、以下の方法でのGridLayoutを使用しています:

public void onStart(){ 
    super.onStart(); 

    board = (GridLayout)findViewById(R.id.chessboard); 
    board.setColumnCount(8); 
    board.setRowCount(8); 

    for(int i = 0; i < 8; i++){ 
     for(int j = 0; j < 8; j++){ 
      ImageButton square = squares[i][j] = new ImageButton(this); 
      GridLayout.LayoutParams params = new GridLayout.LayoutParams(); 
      params.rightMargin = 0; 
      params.topMargin = 0; 
      params.height = params.WRAP_CONTENT; 
      params.width = params.WRAP_CONTENT; 
      params.setGravity(Gravity.FILL); 
      params.rowSpec = GridLayout.spec(i); 
      params.columnSpec = GridLayout.spec(j); 

      board.addView(square, params); 

      //board.addView(square); 
     } 
    }} 
現在、これは私が行うことができました最高です

そして、チェス盤は、このようなXMLで定義されています

<GridLayout 
    android:id="@+id/chessboard" 
    android:layout_width="353dp" 
    android:layout_height="353dp" 
    android:layout_marginBottom="104dp" 
    android:layout_marginEnd="8dp" 
    android:layout_marginLeft="8dp" 
    android:layout_marginRight="8dp" 
    android:layout_marginStart="8dp" 
    android:layout_marginTop="104dp" 
    android:background="#000000" 
    android:gravity="center_horizontal" 
    app:layout_constraintBottom_toBottomOf="parent" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintTop_toTopOf="parent" 
    tools:layout_constraintBottom_creator="1" 
    tools:layout_constraintLeft_creator="1" 
    tools:layout_constraintRight_creator="1" 
    tools:layout_constraintTop_creator="1"> 
</GridLayout> 

私はこの種の問題のために発見したすべてのソリューションは、Android XMLの形にされています。多分このようなアプローチに関する私の懸念は無知に基づくものですが、私は64の四角形をGridLayoutなどにコピーして貼り付けなければならないと理解しています。また、私はそのアプローチで画面サイズに基づいてどのようにサイズを変更するのか分かりません。理想的には、私は厳密にプログラム的な解決策を探しています(これは私の好みのUIデザインの方法です)。

答えて

0

私の提案はincludelink)を使用してXMLをモジュール化することです:

<include layout="@layout/titlebar"/> 

includeを使用すると、独自のファイルに一度XMLコードの断片を書き、それを複数回使用することができます。私はGridLayoutを他のレイアウトタイプのようにコントロールしないので、ほとんどの場合、GridLayoutを使用しないことをお勧めします。これは私のコードであれば、これは私がどうなるのかです:

  1. android:layout_weight="1"を持つ独自のXMLファイルにImageButton「四角」を作成します。
  2. layout="@layout/[your_image_button]"で8つのinclude Sをコピーして貼り付け、android:orientation="horizontal"を持つ独自のXMLファイルにLinearLayout "行" を作成android:layout_weight="1"、およびandroid:weightSum="8"
  3. GridLayoutを現在持っている外部LinearLayoutを作成します。これはandroid:orientation="vertical"android:weightSum="8"です。それから、コピーして貼り付けてください。で8 includeを貼り付けてください。

は、これを行うには多くの方法がありますが、この方法は、あなたのすべてが空間的にレイアウトされているどのようにコントロールの多くを与え、それのロジックはあなたがしているアプローチ「配列の配列」に非常に似ています現在、すべてを動的にレイアウトするために使用します。動的なJavaルートを使用する場合は、JavaでこのLinearLayoutベースのグリッドアプローチを行うことをお勧めします(ImageButtonをXMLで作成し、LayoutInflaterを使用してImageButtonのコピーを展開することもできます)。外側のforループでは、新しいLinearLayoutを作成し、それを外側のLinearLayoutに追加することができます。内側のforループで、ImageButtonを作成し、それを内側のLinearLayoutに追加します。

:行が異なる点についての良い点!そのため、純粋なXMLソリューションのクリーン性が低下します。純粋なXMLを使用する場合は、上記の手順2を2回実行します。他の時間は黒と白です。このアプローチはあなたのためにあまりにも面倒であれば、あなたは背景色を設定するのLinearLayoutの行とのImageButtonタイルをループによって動的に色を設定することができ

<include layout="@layout/your_imagebutton" 
    android:backgroundColor="#000" 
/> 

:黒瓦の場合、これは、次のようになります。 GridLayoutのアプローチよりも簡単に見つけることができると思います。

+0

プログラマチックなソリューションを動作させようと努力してきたことから、私はXMLソリューションを解決しようとしています。この場合、ボード内の四角形の数は変わらないので、他の解決策を追求する理由はそれほどありません。しかし、チェスボードでは、隣接するすべての正方形は反対の色です。私はあなたのメソッドでイメージボタンのグリッドを作る方法を見ていますが、あとで色を変える方法はありますか?つまり、色を変えるためにすべての行と行のすべての四角形にアクセスしますか? – TheRussianPatzer

+0

私はちょうど私の推薦で私の答えを編集しました。上記を参照。 – windedmoose

+0

私はついにXML版のソリューションを実装しました。私が元々思っていた解決策ではありませんが、実際にはかなりうまくいっています。 XMLは、あなたが提案したように断片化してしまった場合には、やってみると良いことです。ありがとうございます! – TheRussianPatzer

関連する問題