2013-04-27 28 views
2

//第一我有這種方法,下面是我的問題我該如何引用尚未在xml文件中創建的視圖?

public void addrows(){ 

    TableRow fila; 
    tabla = (TableLayout)findViewById(R.id.tabla); 
    TextView txtNombre; 


    for(int i = 0;i<id;i++){ 

     String x[] = helper.leer(); 

     layoutFila = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, 
       TableRow.LayoutParams.WRAP_CONTENT); 
     caja= new CheckBox(this); 

     fila = new TableRow(this); 
     fila.setLayoutParams(layoutFila); 


     txtNombre = new TextView(this); 

     txtNombre.setId(i); 


     txtNombre.setTextSize(17); 
     txtNombre.setText(x[i]); 
     txtNombre.setGravity(Gravity.LEFT); 

     // txtNombre.setLayoutParams(layoutTexto); 
     caja.setText(""); 
     caja.setId(i); 
     fila.addView(txtNombre); 
     fila.addView(caja); 
     tabla.addView(fila); 
    } 
    } 

我知道的是,當onCreate()方法啓動的複選框對象被創建,然後我分配一個數字ID從0到的任何地方進行循環停止,但後來在程序中我需要檢索點擊複選框,所以首先我需要的ID,但日食不會讓我把數字ID,請幫助!並對不起我的英語我是Android和英語的菜單

this.CheckBox =(CheckBox)this.findViewById(R.id。?);

+0

爲什麼你應該知道要檢查的對象的編號?另外,addrows應該是addRows,對於java的良好實踐。 – 2013-04-27 22:29:18

回答

1

正如您可能在View中看到的,類文檔ID在您搜索的樹中應該是唯一的。

您爲TextView和複選框設置相同的ID。

如果您知道您將在創建後將所有內容都保存在數組中,而不是稍後使用findViewById嘗試檢索它們。

但更好的解決方案是爲他們設置onClick事件監聽器並跟蹤檢查/取消選中它們。

In @ HalR's answer您可以閱讀如何爲您的複選框設置onCheckedChanged事件偵聽器。 Folowing他的解決方案將有一個檢查複選框的ArrayList。

下一步,您必須增加正確TextView的值,所以您需要將CheckBoxes和TextViews耦合在一起。

我認爲最好的方法是將TextBox的值設置爲TextBox的值。

因此,在用戶提交後,您可以遍歷複選框列表getTag,並在findViewById中使用它來獲取TextView並更新其值。

Id(IDentifier的縮寫)是一個整數,用於唯一標識元素,您可以在findViewById中使用它來獲取視圖元素。您可以閱讀more about ID in this answer

標籤作爲您可以在getTag documentation讀取View元素與一些額外的數據相關聯。它需要作爲參數對象類型,所以你不僅設置標籤的任何數字。在你的情況下你可以設置ChechBox的標籤爲TextView而不是它的id,它也可以工作。

+0

感謝您的幫助:),但這是我試圖做的事情:首先我有一個tableview,其中取決於用戶輸入它將填寫一個名稱和一個複選框,所以可以說用戶添加2個名稱,所以在我的數據庫將是2行,列名稱(文本)和asist(int),所以當用戶進入mainActivity時,表格佈局將有2個textview和2個複選框(我需要id),如果用戶選中2個複選框例如,然後點擊我創建的按鈕,應用程序必須添加1字段asist取決於檢查的複選框,可能只有2,像這個例子或更多 – 2013-04-27 23:21:37

+0

所以我需要檢索所有信息的複選框一次全部檢查 – 2013-04-27 23:23:16

+0

更新了我的回答 – Gustek 2013-04-27 23:54:38

0

你正在手動設置你的id到行的索引,這是我不認爲我會做的。我通常使用setTag()來識別我的對象。

我認爲使用偵聽器來檢測複選框何時被檢查會更容易,並且您可以在檢查發生時跟蹤更改。

使用這樣的事情:

在你的活動中,創建一個ArrayList的

ArrayList<CheckBox> checkedBoxes = new ArrayList<CheckBox>(); 

然後在您的創作:

caja= new CheckBox(this); 

caja.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { 
     int index = buttonView.getId();//pulling back the number you set originally, if that is what you like. I would get the tag I had set, and maybe do something here. 
     //do something in here! 
     if (buttonView.isChecked()) { 
      //including this checkbox in the list of checked boxes 
      checkedBoxes.addObject(buttonView); 
     } else { 
      //take it out of the list of checked boxes 
      checkedBoxes.removeObject(buttonView); 
     } 
    } 
}; 

上標識的一些信息VS標籤

標識是一個數字值,用於標識視圖層次結構中的視圖。如果您在佈局中使用某些東西,比如將一個視圖與另一個視圖對齊,他們會查找並期望具有特定ID的視圖。因此,在佈局中,您將擁有android:id="@+id/bigBox",並且會創建與bigBox關聯的某個編號。當您找到該視圖時,需要findViewById()這是它正在尋找的數字。當你手動設置這些數字時,你似乎在尋求麻煩。如果您將視圖的ID設置爲2,那麼您應該能夠通過myView = findViewById(2)找到它。

標記是一個很好的小對象指針,您可以將其與您的視圖一起傳遞。很多時候,這將是一個行號:

Integer saveMe = new Integer(i); 
    checkBox.setTag(saveMe); 

或者它甚至可以是一個指向你的原始數據對象,您用來創建該行。如果你在使用接觸所產生的每一行,你可以使用

myRow.setTag(contact)

後來當你點擊該行,你只想用

contact = (Contact)myRow.getTag()

,你將有你的原始聯繫回來。它的方式比保留行或複選框或者發信人的大數組更清潔。只要使用監聽器來檢測你什麼時候做事,那是一種更好的方式。

噢,如果你確實有一個由你的CheckBox觸發的onClick(View view),該視圖就是你的CheckBox。

CheckBox theBoxIJustChecked = (CheckBox)view; 

你不需要用id來查看它。它就在那裏。

+0

謝謝! :D !!!! – 2013-04-28 02:56:42

+0

對不起,我幾乎明白,所以讓我再問你一個問題。 setTag()和setId()之間有什麼區別?以及如何檢索標籤?例如對於id是:txtNombres =(TextView)findViewById(j);非常感謝! – 2013-04-28 04:10:43

+0

以上編輯答案 – HalR 2013-04-28 04:57:20

0

如果你想這樣做比你應該做適當的操作即:

for(int i = 0; i < n; ++i){ 
    ... 
    ...(CheckBox))this.findViewById(i); 
    ... 
} 

它應該爲你工作

但是要小心,因爲如果你有這樣的觀點,樹中同一個ID比findViewById(我)的意見數量可以返回一個意想不到的結果,如與給定id返回鑑於樹的第一視圖(它可以是不的複選框類型可導致ClassCastException異常)

更新在回覆評論

如果你想使某種邏輯連接複選框,TextView中有幾個選項:

  1. 你可以做一個有點像以下(假設有複選框和TextViews數量的限制)功能:

代碼:

private static int CHECK_BOX_MAX_NUMBER = 10000; 

public void int getTextVieIdByCheckBoxId(int checkBoxId){ 
    if(checkBoxId >= CHECK_BOX_MAX_NUMBER){ 
     // you can throw an exception here for example 
    } 
    return CHECK_BOX_MAX_NUMBER + checkBoxId; 
} 

然後你應該設置ID對您的TextViews與該功能。

checkBox.setId(i); 
textView.setId(getTextVieIdByCheckBoxId(i)); 
.... 
// add Views to your layout 
.... 
(CheckBox)this.findViewById(i); 
TextView)this.findViewById(getTextVieIdByCheckBoxId(i)); 

2.我覺得有一點點準確的方法: 只需使用setTag()複選框實例,以便創建互連內設置appropreate的TextView。在thiscase你必須存儲所有在某些列表或陣列創建的複選框:

List<CheckBox> checkBoxList = new ArrayList<CheckBox>(); 

for(int i = 0; i < n; ++i){ 
    ... 
    CheckBox checkBox = new CheckBox(); 
    TextView textView = new TextView(); 
    checkBox.setTag(textView); 
    checkBoxList.add(checkBox); 

} 

然後你就可以達到你想要的東西是這樣的:

int textBoxListSize = checkBoxList.size(); 
for(int i = 0; i < textBoxListSize; ++i){ 
    CheckBox checkBox = checkBoxList.get(i); 
    if(chechkBox.isChecked()){ 
     TextView textView = (TextView)checkBox.getTag(); 
     //do whatever with textView 
    } 
} 

在這裏你不需要生成的ID和擔心可能會發生的碰撞

+0

感謝,這是我迄今爲止:公共無效pasarlista(查看args1){ \t \t 爲\t(INT J = 0;Ĵ 2013-04-27 23:53:38

+0

請檢查更新的不重要 – 2013-04-28 07:56:39

相關問題