2012-05-12 77 views
0

我正在嘗試爲遊戲編寫菜單,現在想要進行關卡選擇。它應該有三行,每行5個按鈕。RelativeLayout中的位置ImageButtons

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

我會使用一個簡單的xml文件,而不是使用addRule()函數RelativeLayout。在java文件中創建整個RelativeLayout結構是一件痛苦的事,並且涉及大量的編碼,這在xml中會更容易完成。你只需要爲同一個佈局的XML和使用下面的函數來獲得RelativeLayout的對象(如果它的根佈局):

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

你不應該初始化通過代碼的UI,Android的打算你使用佈局文件。例如,您可以使用以下XML代碼在res/layout文件夾內創建名爲「main.xml」的文件(注意ImageButton的「ID」爲「myButton」)。

<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> 

在你活動的onCreate方法調用:

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)。您也可以重新使用XML佈局文件,例如,如果您正在創建自己的列表適配器,以使用具有您自己的自定義佈局的項目填充ListView。 Android絕對不會**你打算從代碼初始化UI。 – afollestad

+0

另外,使用XML可以確保您的用戶界面可以在所有屏幕尺寸上工作。你不應該使用px來表示視圖的寬度和高度,你應該使用dp(它會自動將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