2013-04-24 60 views
0

我試圖在運行時更新/填充xml。 textViews顯示正常,但似乎無法在第一個項目後正確定位它們(​​請參閱else語句)。它是因爲getId()不被識別或者我完全錯誤?以編程方式構建xml相對佈局

for(int x=1; x<13; x++){ 
    String prompt="PROMPT_"+String.valueOf(x); 
    String promptValue = myTacorCursor.getString(myTacorCursor.getColumnIndex(prompt)); 
    //if not empty draw a row 
    if (!promptValue.equals("")){ 
     //insert new rows into layout 
     RelativeLayout myLayout = (RelativeLayout) findViewById(R.id.RelativeLayout1); 
     TextView promptLabel = new TextView(this); 
     promptLabel.setTextAppearance(this, android.R.style.TextAppearance_DeviceDefault_Large); 
     promptLabel.setText(myTacorCursor.getString(myTacorCursor.getColumnIndex("PROMPT_"+String.valueOf(x))));     
     promptLabel.setId(1); 
     ((RelativeLayout) myLayout).addView(promptLabel); 

     RelativeLayout.LayoutParams mLayoutParams1=(RelativeLayout.LayoutParams)promptLabel.getLayoutParams(); 
     mLayoutParams1.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
     if (i==1){ 
      mLayoutParams1.addRule(RelativeLayout.BELOW,R.id.textView7); 
      Log.w("ID is:", String.valueOf(promptLabel.getId())); 
     } else{     
      mLayoutParams1.addRule(RelativeLayout.BELOW,promptLabel.getId()); 
      Log.w("ID is:", String.valueOf(promptLabel.getId())); 
     } 
    i++; 
    } 
} 

我試圖顯示:

(textView)LABEL xx R.id.textview7 
<-- here would be the inserted columns --> 
(text view) prompt 1 
(text view) prompt 2 
(text view) prompt 3 
... etc ...' 
+0

這將是很有用的,如果你說你想要在屏幕上顯示。 – 2013-04-24 13:14:00

回答

0

動態設置ID是可以的。只是更注意一些,你的代碼工作。

  1. 只要您在for循環中,最好只在一個位置增加索引。
  2. 你變了,你需要將其設置回的ViewLayoutParams後:promptLabel.setLayoutParams(layoutParams)

試試這個。它應該工作:

public class MainActivity extends Activity { 

    private static final int BASE_ID = 1; 
    private static final int ITEMS_COUNT = 13; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     RelativeLayout rootLayout = (RelativeLayout) findViewById(R.id.root); 

     for (int index = BASE_ID; index < ITEMS_COUNT; index++) { 
      String prompt = "PROMPT_" + String.valueOf(index); 
      // if not empty draw a row 
      // insert new rows into layout 
      TextView promptLabel = new TextView(this); 
      promptLabel.setTextAppearance(this, 
        android.R.style.TextAppearance_DeviceDefault_Large); 
      promptLabel.setText(prompt); 
      promptLabel.setId(index); 
      rootLayout.addView(promptLabel); 

      RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) promptLabel 
        .getLayoutParams(); 
      layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
      if (index == BASE_ID) { 
       layoutParams.addRule(RelativeLayout.BELOW, R.id.top); 
       Log.d("ID is:", String.valueOf(index)); 
      } else { 
       layoutParams.addRule(RelativeLayout.BELOW, index - 1); 
       Log.d("ID is:", String.valueOf(index - 1)); 
      } 
      promptLabel.setLayoutParams(layoutParams); 
     } 
    } 
} 
+0

完美!現在一切都說得通了。 – user2224135 2013-04-26 08:10:37

0

你不需要編程構建整個佈局。將其定義在單獨的佈局xml文件中,然後使用佈局充氣器來充氣。之後將它添加到你想要的地方。

我從未見過id以編程方式分配,但我的建議是你可以像往常一樣在xml中定義它們。

PS:Here是一個很好的例子,解釋如何使用LayoutInflater

+0

我可以看到你從哪裏來,我試圖實現它,但我有同樣的問題,因爲我希望它儘可能動態。問題:如果我將使用LayoutInflater,那麼我可以直接覆蓋textView的ID,還是必須在xml中創建13個textView實例,因爲可能會有1,2或13個提示。 – user2224135 2013-04-24 15:51:35

+0

@ user2224135你爲什麼瞄準使用ID而不是標籤?我知道你可以通過程序控制標籤。 – 2013-04-24 16:19:02

+0

這是爲了更好的控制和數據處理,因爲我有許多可能的佈局變化。看到解決問題的riwnodennyk答案。您的建議想法也適用 – user2224135 2013-04-26 08:08:44