2011-08-25 138 views
19

如何在幾行中逐一創建按鈕列表? 我做了這個: 如何以編程方式將按鈕逐個添加到佈局中?

LinearLayout layout = (LinearLayout) findViewById(R.id.linear_layout_tags); 
    for (int i = 1; i < 10; i++) { 
     Button btnTag = new Button(this); 
     btnTag.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
     btnTag.setText("Button " + i); 
     btnTag.setId(i); 
     layout.addView(btnTag); 
     ((Button) findViewById(i)).setOnClickListener(this); 
    } 

,得到了只有一行:

I got this
如何去編程下一行?

+0

我的第一個想法是改變ListView的自定義SimpleCursorAdapter中的getView(),但可能更容易以編程方式放置按鈕。所以,我在這裏問。可能有人決定了這個問題。 – Sviatoslav

+0

我可以爲你解答,但問題已關閉:/ –

+1

@ B.Young:重新打開。 –

回答

37

問題是您的按鈕不會自動換行到屏幕的下一部分。您必須具體告訴Android您希望如何定位視圖。您可以使用ViewGroups(例如LinearLayout或RelativeLayout)來執行此操作。

LinearLayout layout = (LinearLayout) findViewById(R.id.linear_layout_tags); 
layout.setOrientation(LinearLayout.VERTICAL); //Can also be done in xml by android:orientation="vertical" 

for (int i = 0; i < 3; i++) { 
    LinearLayout row = new LinearLayout(this); 
    row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 

    for (int j = 0; j < 4; j++ { 
     Button btnTag = new Button(this); 
     btnTag.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
     btnTag.setText("Button " + (j + 1 + (i * 4)); 
     btnTag.setId(j + 1 + (i * 4)); 
     row.addView(btnTag); 
    } 

    layout.addView(row); 
} 

我假設R.id.linear_layout_tags是你的XML這項活動的父的LinearLayout。

基本上你在這裏做的是你正在創建一個LinearLayout,它將成爲一行以容納你的四個按鈕。然後按鈕被添加,並且每個按鈕被分配一個數字作爲它們的ID。一旦添加了所有按鈕,該行就會添加到您的活動佈局中。然後它重複。這只是一些僞代碼,但它可能會起作用。

哦,下次一定要花費更多的時間在你的問題......

https://stackoverflow.com/questions/how-to-ask

+1

當我們知道3個按鈕總是排成一行時,這段代碼就很好。但是當按鈕中的文本來自「Cursor」(來自數據庫)時該怎麼辦?按鈕的寬度可以是這樣的,只有兩個按鈕可以放在一行中。所以第三個按鈕必須放在下一行。我怎樣才能刪除一些按鈕時,點擊它。 可能是因爲這個,我必須在自定義的'SimpleCursorAdapter'中改變'getView()'。 我想要這樣的smth:[鏈接](http://min.us/mrqgNnw5P) – Sviatoslav

+0

感謝您的例子!我會建議通過LayoutParams.MATCH_PARENT – Dax

8

這就好比1分的答案,但沒有必要使XML文件。

public class mainActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     LinearLayout layout = new LinearLayout(this); 
     layout.setOrientation(LinearLayout.VERTICAL); //Can also be done in xml by android:orientation="vertical" 

     for (int i = 0; i < 3; i++) { 
      LinearLayout row = new LinearLayout(this); 
      row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 

      for (int j = 0; j < 4; j++) { 
       Button btnTag = new Button(this); 
       btnTag.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
       btnTag.setText("Button " + (j + 1 + (i * 4))); 
       btnTag.setId(j + 1 + (i * 4)); 
       row.addView(btnTag); 
      } 

      layout.addView(row); 
     } 
     setContentView(layout); 
     //setContentView(R.layout.main); 
    } 
} 
+0

更改LayoutParams.FILL_PARENT,謝謝,很高興知道有人通過編程理解。 –

+0

非常感謝! +1爲setContentView(佈局) – Benny

0

我有這個問題,在UI上放置的視圖數量是在運行時設置的。所以我決定我只需要一行中的四個視圖,並相應地修改上面的代碼。另外,我總是充滿了最後一排隱形編輯文本,以便在最後一排的意見也有同樣的寬度與上面的行中的觀點:

 // 1.0f is the weight! 
     LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f); 
     layoutParams.setMarginEnd(10); 

     for (int i = 0; i < Math.ceil(discipline.getSeries_count()/4.0); i++) { 
      LinearLayout layoutRow = new LinearLayout(MyActivity.this); 
      layoutRow.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); 

      // add only four edit texts to row and move to next line afterwards 
      for (int j = 0; j < 4; j++) { 
       etSeries = new EditText(MyActivity.this); 
       etSeries.setInputType(InputType.TYPE_CLASS_NUMBER); 
       int iIndex = (j + 1 + (i * 4)); 
       etSeries.setText(getResources().getString(R.string.series) + " " + iIndex); 
       etSeries.setId(iIndex); 
       etSeries.setId(i); 
       etSeries.setSelectAllOnFocus(true); 
       etSeries.setLayoutParams(layoutParams); 
       etSeries.setVisibility(iIndex > discipline.getSeries_count() ? View.INVISIBLE : View.VISIBLE); 
       layoutRow.addView(etSeries); 
      } 
      layoutSeries.addView(layoutRow); 
     } 
1

這將有助於

private void addingParticipantinFrame() { 
     TableRow row; 
     final int screenWidth = dpToPx(getResources().getConfiguration().screenWidthDp); 
     add_button_particiapants.setVisibility(View.VISIBLE); 
     if (arrrItemSelcted != null && arrrItemSelcted.size() > 0) { 

      arrrItemSelcted.remove(0); 
      int i = 0; 
      int j = 0; 
      int width = (screenWidth - (arrrItemSelcted.size())*4)/arrrItemSelcted.size(); 

      while (i<arrrItemSelcted.size()) { 
       j = i + 4; 
       row = new TableRow(mParentActivity); 
       TableRow.LayoutParams lp = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT); 
       row.setLayoutParams(lp); 
       row.setWeightSum(4); 
       while ((i<j)&&(i<arrrItemSelcted.size())) { 
        Button iBtn = new Button(mParentActivity); 
        iBtn.setGravity(Gravity.CENTER_HORIZONTAL); 
        iBtn.setMinimumWidth(100);//I set 100px for minimunWidth. 
        iBtn.setWidth(width); 
        iBtn.setText(Integer.toString(i + 1)); 
        iBtn.setId(i + 1); 
        row.addView(iBtn, 4 + i - j); 
        i++; 
       } 
       add_button_particiapants.addView(row); 
      } 



      } 
     } 
相關問題