2017-08-11 105 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

相关问题