2017-08-11 81 views
0

我是Android開發新手,所以我一直在研究一個國際象棋應用程序,以教我自己。但是,我現在卡住了。從本質上講,我需要一個很好的方式提請ImageButtons的8X8格這樣的:如何以編程方式使用ImageButton填充網格?

  1. 按鈕填滿整個電網
  2. 格柵間距的按鈕中均勻分佈
  3. 有按鍵之間沒有縫隙(澄清#2)
  4. 網格是方形的,它的大小可以控制(我希望能夠根據屏幕大小自動調整大小)。

或者,簡單地說,它應該看起來像一個標準的國際象棋棋盤:)

我試過幾個佈局沒有成功。目前,這是我已經能夠做到最好:

"Chessboard"

我使用PlayGameActivity內的下列方式(如果董事會應當制定)一個網格佈局:

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,因爲它們不會像其他一些佈局類型那樣給予您更多的控制。如果這是我的代碼,這是我會做什麼:

  1. 創建與android:layout_weight="1"自己的XML文件ImageButton「廣場」。
  2. 創建自己的XML文件中的LinearLayout 「行」 與android:orientation="horizontal"android:layout_weight="1"android:weightSum="8",然後複製並粘貼8個include s的layout="@layout/[your_image_button]"
  3. 創建一個外部LinearLayout您目前有你的GridLayout。這一個將有android:orientation="vertical"android:weightSum="8"。然後複製並粘貼8 include s與layout="@layout/[your_linear_layout_row]"

有很多方法可以做到這一點,但這種方式可以讓您對空間上的一切佈置有很多控制,而且它的邏輯與您所​​使用的「數組陣列」方法非常相似目前正在使用動態放置一切。如果你想要使用動態java路由,我的建議是在java中使用基於LinearLayout的網格方法(甚至可以在XML中創建ImageButton並使用LayoutInflater來擴充ImageButton的副本)。在外部for循環中,您可以創建一個新的LinearLayout並將其添加到外部LinearLayout;然後在內部for循環中創建ImageButton並將其添加到內部LinearLayout。

編輯:好點關於行是不同的!這使得純XML解決方案變得不那麼幹淨。如果你使用純XML,我只需要執行兩次上面的步驟2:一次使用白色然後黑色;另一次是黑色,然後是白色。對於黛瓦,這可能是這樣的:

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

如果這種做法是對你來說太麻煩了,你可以通過該行的LinearLayout和ImageButton的瓷磚循環設置背景顏色動態設置顏色。我想你會發現它比你的GridLayout方法更容易。

+0

由於我一直試圖讓程序化解決方案發揮作用,所以我只想解決XML解決方案。在這種情況下,董事會中的廣場數量不會改變,因此追求其他解決方案沒有多少理由。但是,在棋盤上,每個相鄰的方格都是相反的顏色。我看到如何用你的方法創建一個圖像按鈕的網格,但是有什麼方法可以在事後不改變顏色(即訪問行中的每一行和每個方塊來改變顏色)? – TheRussianPatzer

+0

我剛剛用我的建議編輯了我的答案。往上看。 – windedmoose

+0

我終於開始實施該解決方案的XML版本,並且它工作的很棒!這不是我原本以爲我想要的解決方案,但實際上結果非常好。如果你按照你的建議將事情分解成碎片,XML是一種很好的做事方式,所以謝謝! – TheRussianPatzer

相關問題