2011-10-08 55 views
0

可能重複:
android: how to elegantly set many button IDs管理幾個EditTexts Android中

大家。

我試圖建立我的第一個Android應用程序來做一些RMS(均方根)誤差計算。爲此,我需要多個實驗點輸入,這是在EditTexts中手動完成的。所以我在一個佈局中有40個EditTexts。問題是當它涉及到管理他們,我有這樣的事情:

public class InsertarData extends Activity implements OnClickListener { 
EditText x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17; 
EditText y1,y2,y3,y4,y5,y6,y7,y8,y9,y10,y11,y12,y13,y14,y15,y16,y17; 
float [] datosX; 
float [] datosY; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.insertardatos); 
    x1=(EditText)findViewById(R.id.x1Et); 
    x2=(EditText)findViewById(R.id.x2Et); 
    x3=(EditText)findViewById(R.id.x3Et); 
    x4=(EditText)findViewById(R.id.x4Et); 
    x5=(EditText)findViewById(R.id.x5Et); 
    x6=(EditText)findViewById(R.id.x6Et); 
    x7=(EditText)findViewById(R.id.x7Et); 
    x8=(EditText)findViewById(R.id.x8Et); 
    x9=(EditText)findViewById(R.id.x9Et); 
    x10=(EditText)findViewById(R.id.x10Et); 
    x11=(EditText)findViewById(R.id.x11Et); 
    x12=(EditText)findViewById(R.id.x12Et); 
    x13=(EditText)findViewById(R.id.x13Et); 
    x14=(EditText)findViewById(R.id.x14Et); 
    x15=(EditText)findViewById(R.id.x15Et); 
    x16=(EditText)findViewById(R.id.x17Et); 
    x17=(EditText)findViewById(R.id.x17Et); 

    y1=(EditText)findViewById(R.id.y1Et); 
    y2=(EditText)findViewById(R.id.y2Et); 
    y3=(EditText)findViewById(R.id.y3Et); 
    y4=(EditText)findViewById(R.id.y4Et); 
    y5=(EditText)findViewById(R.id.y5Et); 
    y6=(EditText)findViewById(R.id.y6Et); 
    y7=(EditText)findViewById(R.id.y7Et); 
    y8=(EditText)findViewById(R.id.y8Et); 
    y9=(EditText)findViewById(R.id.y9Et); 
    y10=(EditText)findViewById(R.id.y10Et); 
    y11=(EditText)findViewById(R.id.y11Et); 
    y12=(EditText)findViewById(R.id.y12Et); 
    y13=(EditText)findViewById(R.id.y13Et); 
    y14=(EditText)findViewById(R.id.y14Et); 
    y15=(EditText)findViewById(R.id.y15Et); 
    y16=(EditText)findViewById(R.id.y16Et); 
    y17=(EditText)findViewById(R.id.y17Et); 

    Button continuar=(Button)findViewById(R.id.continuarBtn); 
    continuar.setOnClickListener(this); 

} 

@Override 
public void onClick(View e) { 
    switch(e.getId()){ 
     case R.id.continuarBtn:{ 
     datosX=new float[17]; 
     datosX[0]=Float.parseFloat(x1.getText().toString()); 
     datosX[1]=Float.parseFloat(x2.getText().toString()); 
     datosX[2]=Float.parseFloat(x3.getText().toString()); 
     datosX[3]=Float.parseFloat(x4.getText().toString()); 
     datosX[4]=Float.parseFloat(x5.getText().toString()); 
     datosX[5]=Float.parseFloat(x6.getText().toString()); 
     datosX[6]=Float.parseFloat(x7.getText().toString()); 
     datosX[7]=Float.parseFloat(x8.getText().toString()); 
     datosX[8]=Float.parseFloat(x9.getText().toString()); 
     datosX[9]=Float.parseFloat(x10.getText().toString()); 
     datosX[10]=Float.parseFloat(x11.getText().toString()); 
     datosX[11]=Float.parseFloat(x12.getText().toString()); 
     datosX[12]=Float.parseFloat(x13.getText().toString()); 
     datosX[13]=Float.parseFloat(x14.getText().toString()); 
     datosX[14]=Float.parseFloat(x15.getText().toString()); 
     datosX[15]=Float.parseFloat(x16.getText().toString()); 
     datosX[16]=Float.parseFloat(x17.getText().toString()); 

     datosY[0]=Float.parseFloat(y1.getText().toString()); 
     datosY[1]=Float.parseFloat(y2.getText().toString()); 
     datosY[2]=Float.parseFloat(y3.getText().toString()); 
     datosY[3]=Float.parseFloat(y4.getText().toString()); 
     datosY[4]=Float.parseFloat(y5.getText().toString()); 
     datosY[5]=Float.parseFloat(y6.getText().toString()); 
     datosY[6]=Float.parseFloat(y7.getText().toString()); 
     datosY[7]=Float.parseFloat(y8.getText().toString()); 
     datosY[8]=Float.parseFloat(y9.getText().toString()); 
     datosY[9]=Float.parseFloat(y10.getText().toString()); 
     datosY[10]=Float.parseFloat(y11.getText().toString()); 
     datosY[11]=Float.parseFloat(y12.getText().toString()); 
     datosY[12]=Float.parseFloat(y13.getText().toString()); 
     datosY[13]=Float.parseFloat(y14.getText().toString()); 
     datosY[14]=Float.parseFloat(y15.getText().toString()); 
     datosY[15]=Float.parseFloat(y16.getText().toString()); 
     datosY[16]=Float.parseFloat(y17.getText().toString()); 

     } 
     } 
    } 

} 

該「工程」(它需要經過datosX和datosY到另一個活動要完成,但在此之前,我需要知道的。無論EditTexts是否爲空,我都無法想象在每個parseFloat之前執行類似if(edittext.getText()。toString()!= null)的操作。

是否有更好的方法來管理大量EditText並知道如果它們是空的或沒有?我雖然有一組EditText並做類似的事情:

EditText editarray[17]; 
editarray[0]=(EditText)findViewById(R.id.edittext0); 

這是這樣做嗎?

非常感謝您的閱讀和提前回答。對不起我的英語不好。

回答

1

怎麼這樣呢?

EditText xE, yE; 

float x, y; 

int[] xIds = { R.id.x1et, R.id.x2et, /*...etc*/ }; 
int[] yIds = { R.id.y1et, R.id.y2et, /*...etc*/ }; 

for(int i = 0; i < xIds.length && i < yIds.length; i++) { 
    xE = (EditText)findViewById(xIds[i]); 
    yE = (EditText)findViewById(yIds[i]); 
    try { 
     x = Float.parseFloat(xE.getText().toString()); 
     y = Float.parseFloat(yE.getText().toString()); 
     //do whatever you need with the data here 
    } catch (NumberFormatException e) { 
     //Either there was an invalid input, or field was empty 
     //You can add extra logic here to check them for empty fields 
     //or just exit the loop here 
    } 
} 
+0

我想我會這樣做,它只是我需要和想要做的事情,但我不知道如何設置陣列。 你們真棒,謝謝! – danielrozo

1

這些EditText控件是否在彼此之下?如果是這樣,我會使用一個ListView,併爲每個EditText有一個單獨的行。然後,在列表的適配器中處理這麼多EditTexts會更容易。它也需要更少的內存,因爲ListView是虛擬化的。但我猜UI的使用會很糟糕。

+0

是的,它們是不同的。我有他們就像你說的,一個TableLayout和2 EditText爲每行,兩列,每個X和Y. 我想知道是否有更好的方法來解析所有的EditTexts成浮動 - 並知道從中EditText開始變爲空 - 謝謝! – danielrozo

+0

+1提及內存管理 – slayton

1

您可以通過使用資源獲取視圖的ID,這樣可以更輕鬆地管理多個視圖。是的,數組似乎是一個很好的解決方案來管理這樣的編輯文本。

訪問你的第一個editText,假設你給了editText的id爲edittext0那麼你可以通過它訪問它。

int idsArray[40]; 
for(int i=0; i<40; i++){ 
    String textString = "edittext" + Integer.toString(i); 
    int editId = getResources.getIdentifier(textString, "id", getPackageName()); 
    // store the id's in an array 
    idsArray[i] = editId; 
} 

您可以使用相同的方法訪問您的editText。

EditText et = (EditText) findViewById(idsArray[i]); 

訪問佈局中的每個編輯文本,然後檢查editText是否有數據。

HTH。

1

您還可以重複佈局的孩子,並確定哪些是EditText上

佈局與您的EditText小部件:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/layout" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<EditText 
    android:id="@+id/text1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello" 
    /> 
<EditText 
    android:id="@+id/text2" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello" 
    /> 
<Button 
    android:id="@+id/button" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 
</LinearLayout> 

迭代:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    LinearLayout layout = (LinearLayout)findViewById(R.id.layout); 

    for (int i = 0; i < layout.getChildCount(); i++) { 
     View child = layout.getChildAt(i); 
     Log.i("tag", child.getClass().getCanonicalName()); 
    } 
}