2013-05-09 56 views
3

我的目標是顯示一個棋盤。我有一個活動,它顯示一個菜單並加載一個擴展GridView的「ChessView」實例。我創建了一個自定義的GridView,因爲我希望有一個完全致力於其顯示的類。所以這個類有它自己的layout.xml等等Android的 - 自定義的GridView帶獨立XML

GameActivity.java:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_game); 


     //init a game 
     CChess.getInstance().init(); 

     //creating the chessboard 
     ChessView lChessView = (ChessView) findViewById(R.id.chessView); 

    } 

activity_game.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/background" 
    tools:context=".GameActivity" > 

    <project.chess.view.ChessView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/ChessView"  > 
    </project.chess.view.ChessView> 

</RelativeLayout> 

ChessView.java:

public class ChessView extends GridView { 

    public ChessView(Context pContext, AttributeSet pAttrs) { 
     super(pContext, pAttrs); 

     GridView.inflate(pContext, R.layout.view_chess, null); 

     this.setAdapter(new ChessAdapter(pContext)); 
    } 
} 

view_chess.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"  > 

    <GridView 
     android:id="@+id/gridView" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:numColumns="8" 
     android:gravity="center" 
     > 
    </GridView> 

</LinearLayout> 

ChessAdapter.java:

public class ChessAdapter extends BaseAdapter 
{ 
    private Context mContext; 

    public ChessAdapter (Context pContext) 
    { 
     this.mContext = pContext; 
    } 

    @Override 
    public int getCount() 
     { 
      return 64; 
     } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     ImageView lImageView; 
     if (convertView == null) { 
      lImageView = new ImageView(mContext); 
      int size = parent.getWidth()/8; 
      lImageView.setLayoutParams(new GridView.LayoutParams(size,size)); 

     //background black or white depending of the position 
     int col = position/8 %2; 
     if (col == 0) 
     { 
      if (position%2 == 0) 
       lImageView.setBackgroundColor(Color.WHITE); 
      else 
       lImageView.setBackgroundColor(Color.BLACK); 
     } 
     else 
     { 
      if (position%2 == 0) 
       lImageView.setBackgroundColor(Color.BLACK); 
      else 
       lImageView.setBackgroundColor(Color.WHITE); 
     } 

     //load images 
     CPiece p = CChess.getInstance().getPiece(position/8, position%8); 


     if(p != null) 
      lImageView.setImageResource(mContext.getResources().getIdentifier(p.toString(), "drawable", mContext.getPackageName())); 
    } else { 
     lImageView = (ImageView) convertView; 
    } 


    return lImageView; 
    } 
    } 

結果是:我的64個方格僅1列的所有與圖像(在我的CChess的init()是確定)。要清楚,我想要一個像所有標準棋盤一樣的8x8網格。

前幾天,我把所有這些東西在一個活動,而我的自定義視圖,而只是一個簡單的GridView和一切都正常工作。我已經打破它,因爲我已經決定要在不同的班級

我敢肯定,我忘帶了什麼東西像吹氣的地方分開我的代碼,但我不明白它是如何工作以及它的作用。我已經解析了谷歌幾個小時,但我找不到答案。

你能幫助我嗎?非常感謝你閱讀我,對不起我的英語

回答

1

我認爲這個問題與本LayoutInflator在ChessView.java

從該類

刪除此行沒有需要充氣的GridView在該類

GridView.inflate(pContext, R.layout.view_chess, null); 

,並設置在activity_game.xml文件中的列數和重力象棋視圖。

android:layout_width="wrap_content" 
android:numColumns="8" 

我覺得這對你的作品。

+0

謝謝!它現在有效。有沒有辦法讓activity_game.xml不必設置列數?我的意思是,我認爲這是ChessView job或view_chess.xml工作來做到這一點,而不是他們的「父母」。我所需要做的就是在我的活動中沒有任何其他參數的情況下調用ChessView以獲得我的棋盤。不知道是不是我很清楚 – Steel 2013-05-09 14:00:13

+0

在國際象棋視圖可以提SetColumnCount(8)它的工作原理,那麼你不想提及它在activity_game.xml文件。這裏view_chess.xml文件不是必需的。 – 2013-05-10 06:47:48

+0

完美!正是我想要的。非常感謝 !我想知道一些事情:我的view_chess.xml現在是無用的,但如果我想在那裏添加一些靜態配置,我怎麼能把它鏈接到我的ChessView.java?我只是好奇 – Steel 2013-05-12 11:34:23