2012-05-12 13 views
0

私はゲームのメニューをプログラミングしようとしていますが、今度はレベル選択をしたいと思っています。行ごとに5つのボタンがある3つの行が必要です。RelativeLayoutの位置ImageButton

for(int i=0; i<3; ++i){ 
     for(int j=0; j<5; ++j){ 
      ImageButton button = new ImageButton(this); 

      RelativeLayout.LayoutParams paramsBut = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
      paramsBut.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
      paramsBut.addRule(RelativeLayout.ALIGN_PARENT_TOP); 

      int marginLeft = (int)((float)(sizeLeftWidth/6) * (j+1)) + j*buttonSize; 
      int marginTop = (int)((float)(sizeLeftHeight/4) * (i+1)) + i*buttonSize; 
      paramsBut.leftMargin = marginLeft; 
      paramsBut.topMargin = marginTop; 

      button.setAdjustViewBounds(true); 
      button.setMaxWidth(buttonSize); 
      button.setMaxHeight(buttonSize); 
      button.setBackgroundDrawable(null); 

      Bitmap bmp = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.level),buttonSize,buttonSize,false); 
      Drawable d = new BitmapDrawable(bmp); 
      button.setImageDrawable(d); 

      layout.addView(button,paramsBut); 
     } 
    } 

RelativeLayout:

RelativeLayout layout = new RelativeLayout(this); 
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT); 
    layout.setLayoutParams(params); 

問題はボタンが右の位置ではなく、私は問題が余裕であると考えていることです。 私は余裕をもってそれをやっているのですか?コード全体がまったく愚かですか? (私のプログラミングスタイルを改善するヒントがあれば、いつでもうれしいよ^^)

答えて

0

RelativeLayoutの代わりにaddRule()の機能を使用するのではなく、単純なXMLファイルを使用していました。 JavaファイルでRelativeLayout構造全体を作成するのは苦労し、多くのコーディングが必要になります。これはxmlで簡単に行うことができます。あなただけの同じレイアウトのXMLを作成し、(それがルートレイアウトだ場合)RelativeLayoutのオブジェクトを取得するには、次の機能を使用する必要があります。

RelativeLayout relativeLayout=(RelativeLayout) View.inflate(R.layout.your_xml_here); 
0

あなたは、コードを通して、あなたのUIを初期化すべきではない、Androidは意向あなたはレイアウトファイルを使用しています。たとえば、res/layoutフォルダ内に "main.xml"という名前のファイルを作成し、次のXMLコードを使用できます(ImageButtonのIDは "myButton"です)。

を呼び出すあなたの活動ののonCreateメソッドで
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" android:layout_height="match_parent"> 
    <ImageButton android:id="@+id/myButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:marginLeft="10dp" android:marginRight="10dp" /> 
</RelativeLayout> 

setContentView(R.layout.main); 

そして、あなたは(IDは、XMLで指定されている)自分のイメージボタンの参照を取得:

また
ImageButton btn = (ImageButton)findViewById(R.id.myButton); 
btn.setBitmapImage(myImage); //you can use this 
btn.setBitmapResouce(R.drawable.drawable_file); //or this 

RelativeLayoutsの目的は、ビューの位置を別のビューとの相対的な位置にする必要があるため、android:layout_below = "@ + id/viewId"やandroid:layout_toRightOf = "@ + id/viewId"などのXML属性を使用できます。それ以外の場合は、LinearLayoutを使用することができます。これは、RelativeLayoutが必要ない場合は速度を上げる必要があります。

+0

私はLinearLayoutが私の目的にはもっと意味をなさないと思っていますが、xml(私はいくつかのthimesを使用しています)が助けになるとは思っていません。 XMLファイルでは、15個のボタンをドラッグ・アンド・ドロップしてコード内で見つけ、その属性を変更する必要があります。コードでそれらを作成するバージョンが良いですか、または私は考えて間違いがありますか? – Mister004

+0

XMLレイアウトファイルに慣れてしまうと、実際にはずっと簡単になり、UIの初期化に膨大なコードブロック(特に非常に大きなUI)を使用することはありません。独自のカスタムレイアウトを持つアイテムでListViewを生成するために、独自のリストアダプタを作成する場合と同様に、XMLレイアウトファイルも再利用できます。 Androidは確かにコードからUIを初期化するつもりはありません**。 – afollestad

+0

また、XMLを使用すると、すべての画面サイズでUIが機能するようになります。ビューの幅と高さにはpxを使用しないでください。dp(携帯電話からタブレットまで、さまざまな画面に表示されるべきUIのサイズに合わせて自動的にUIの縮尺を変更する)を使用する必要があります。 – afollestad

0
RelativeLayout layout = new RelativeLayout(this); 
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT); 
layout.setLayoutParams(params); 
layout.setGravity(Gravity.CENTER); //<<--- 

これは必要なものですか?

+0

レイアウトが中央にないことに気が付きませんでした。今はボタンがまだ偽の位置にありますが、代わりにLinearLayoutを使用しようとしています – Mister004