2011-12-31 10 views
5

Me encuentro con un comportamiento extraño, sospecho que es un error, pero quizás estoy pasando por alto algo. Fragmentos de código al final de la publicación. Puedo publicar el .xml también, pero no creo que sea necesario entender el problema.EditText setText() establece el texto en varias vistas de EditText

Tengo un diseño lineal horizontal, al que agrego TableLayouts según el número de jugadores.

Las disposiciones de la tabla contienen varios campos, TextView, EditarTexto, botones, etc.

Cuando inicializar cada TableLayout, lo añado a la LinearLayout (a través de la inflación xml) y luego inicializar los campos.

Lo que pasa es que los campos EditText siempre se actualizan con la información de los últimos jugadores. Por lo que puedo decir, mi llamada a setText se está pasando a cada EditText.

estoy encontrando la EditarTexto usando findViewById en la matriz TableLayout (en realidad el abuelo ya que existe una TableRow.

El EditarTexto de identificación no son únicos en todo el árbol, pero son únicas desde la perspectiva disposición de la tabla.

Razones posibles: 1) Estoy obteniendo la vista de texto incorrecta incorrecta cuando findById: Esto no puede ser, sin embargo. Cambié mi código para publicar el ID de objeto para EditTextView. Obtengo IN TEXTVIEW y obtengo ID de objeto únicos. Publicando exactamente el mismo myEditText.toString() en un EditText y obtengo un valor de repetición de la última ID de objeto utilizada. Para Reiterate, usar exactamente la misma lógica de findView funciona siempre que el campo sea un TextView, y muestra el comportamiento de setText "múltiples" siempre que sea un EditText.

2) Cuando cambio el campo de un EditText a un TextView en el xml, y luego simplemente cambio mis lanzamientos de EditText a TextView, todo se comporta como se esperaba.

3) Los intentos de búsqueda similares realizados en mis onClickListeners se comportan como se esperaba.

4) Intenté agregar la vista al diseño lineal antes de la inicialización y después del mismo comportamiento. Me preguntaba si era una orden de operaciones para los objetos subyacentes, ya que funcionaba en los oyentes, pero todavía me falta algo.

PREGUNTAS: 1) ¿Esto le parece un error a alguien más? 2) ¿Soluciones alternativas sugeridas?
3) Alguna idea de por qué funciona en mis oyentes cuando estoy buscando mi objeto de nivel superior, pero no en mi código de inicialización, donde explícitamente tengo mi objeto de nivel superior (el objeto de nivel superior es el TableLayout que inflé.

fragmentos de código:

onCreate código de inicialización:

TableLayout tl = (TableLayout)inflater.inflate(R.layout.playerpanel, llayout, false); 
InitializePlayer(player1,tl); 
llayout.addView(tl); 

InitializePlayer fragmentos - donde rompen cosas:

public void InitializePlayer(Player p, TableLayout tl) 
{ 
    players.add(p); 
    tl.setTag(p); 
    //INITIALIZE LISTENERS HERE - SNIPPED FOR READABILITY 

    TextView scoreLabel = (TextView)tl.findViewById(R.id.currentScore); 
    EditText curPoints = (EditText)tl.findViewById(R.id.scoreEntry); 
    curPoints.setText(p.getScore()); 


    EditText playerEntry = (EditText)tl.findViewById(R.id.playerName); 
    playerEntry.setText(tl.toString()); 

    //CONFIRMING UNIQUE OBJECTS HERE should actually be p.getScore() 
    scoreLabel.setText(playerEntry.toString()); 
    ListView lv = (ListView)tl.findViewById(R.id.listView); 
    lv.setAdapter(new ArrayAdapter<String>(this,R.layout.list_item, p.getTurns())); 

OnClickCode que hace el trabajo:

private OnClickListener addButtonListener = new OnClickListener() { 
    public void onClick(View v) { 
     // get all the objects I care about 
     TableRow tr = (TableRow)v.getParent(); 
     TableLayout tl = (TableLayout)tr.getParent(); 
     EditText ev = (EditText)tl.findViewById(R.id.scoreEntry); 
     Player pl = (Player)tl.getTag(); 

     TextView scoreLabel = (TextView)tl.findViewById(R.id.currentScore); 

     pl.addScore(ev.getText().toString()); 
     scoreLabel.setText(pl.getScore()); 
     ListView lv = (ListView)tl.findViewById(R.id.listView); 
     ArrayAdapter aa = (ArrayAdapter)lv.getAdapter(); 
     aa.notifyDataSetChanged(); 
     InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.hideSoftInputFromWindow(v.getWindowToken(), 0); 

     EditText playerEntry = (EditText)tl.findViewById(R.id.playerName); 
     playerEntry.setText(playerEntry.toString()); 


    } 
}; 

Respuesta

9

I tenía un problema similar, los valores estaban replicando cuando el dispositivo cambia de orientación. Descubrí que EditText está guardando su estado y restaurándolo en función de la identificación.Este proceso estaba llenando los mismos valores después de que ya había establecido los valores correctos en los widgets.

La solución que encontré fue establecer android:saveEnabled="false" en la entrada del widget en el XML.

+0

¡Me salvaste el día! Muchas gracias –

1

Es como dijo Victor: La propiedad de texto de EditText se restaura en función de la ID. Esto ocurre en onRestoreInstanceState. Si hay varios EditTexts con el mismo ID, todos están configurados.

Otra solución es establecer o sobrescribir los valores después de que Android los haya configurado. Esto está en onResume o en on RestoreInstanceState, después de llamar a super.onRestoreInstanceState. (En caso de una Actividad. No compruebe si hay Fragmentos)

Establecer los valores en onCreate es demasiado temprano. Se sobrescribirán en este caso.