full - dialog fragment android
Actualización de una vista de texto dentro de un cuadro de diálogo personalizado mediante un botón (2)
Declara tus TextViews como definitivas. Todavía podrá configurar sus textos, solo significa que no podrá reasignar las referencias de variables. No haga alert.tv ya que TextView no es una variable de instancia de su diálogo, sino más bien del método con el que está creando su diálogo. Esta es la manera fácil. También podría declarar sus TextViews como variables de instancia de su Actividad y luego actualizarlas a través de un controlador.
alert.setTitle("Sell how many "+(masterRes.get(currentResIndex).getName())+"?");
alert.setContentView(R.layout.selldialog);
final TextView tvsellAll = (TextView) alert.findViewById(R.id.sellAllText);
final TextView tvsell10 = (TextView) alert.findViewById(R.id.sell10Text);
//etc etc more handles, including buttons
tvsellAll.setText("Sell All ("+String.valueOf(masterRes.get(currentResIndex).getHeld())+") - $"+String.valueOf(calcCost(masterRes.get(currentResIndex).getHeld())));
tvsell10.setText("Sell 10 - $"+String.valueOf(calcCost(10)));
// etc etc more setTexts
btnsell10.setOnClickListener( new OnClickListener() {
public void onClick(View v) {
if (v.isEnabled()) {
int y=masterRes.get(currentResIndex).getHeld();
masterRes.get(currentResIndex).setHeld(y-10);
held -= 10;
money += (calcCost(10));
updateScreen();
tvsellAll.setText("Sell All ("+String.valueOf(masterRes.get(currentResIndex).getHeld())+") - $"+String.valueOf(calcCost(masterRes.get(currentResIndex).getHeld())));
tvsell10.setText("Sell 10 - $"+String.valueOf(calcCost(10)));
tvsellAmt.setText("Sell Amount (0-"+String.valueOf(masterRes.get(currentResIndex).getHeld())+")");
}
}
});
Entonces, mi problema actual es que no puedo encontrar una forma elegante de actualizar un cuadro de diálogo cuando se presiona un botón. Puedo lograr el mismo resultado funcionalmente descartando () y show (), pero eso es feo.
Digamos que este diálogo tiene 3 botones, para vender widgets que tiene el jugador. Vender todos, Vender 10 y Vender X (cantidad ingresada con un EditarTexto). Me gustaría que el cuadro de diálogo persista si el jugador presiona Vender 10, sino también actualizar sus vistas de texto con el nuevo recuento de widgets.
Parte pertinente del diseño XML del diálogo personalizado:
<LinearLayout android:id="@+id/linearLayout3" android:layout_height="wrap_content" android:layout_width="match_parent">
<TextView android:id="@+id/sell10Text" android:layout_width="wrap_content" android:text="TextView" android:layout_height="wrap_content" android:layout_weight="2"></TextView>
<Button android:text="Sell 10" android:enabled="false" android:layout_width="wrap_content" android:id="@+id/sell10Button" android:layout_height="wrap_content" android:layout_weight="1"></Button>
</LinearLayout>
Parte pertinente de la creación del diálogo:
final Dialog alert = new Dialog(this);
alert.setTitle("Sell how many "+(masterRes.get(currentResIndex).getName())+"?");
alert.setContentView(R.layout.selldialog);
TextView tvsellAll = (TextView) alert.findViewById(R.id.sellAllText);
TextView tvsell10 = (TextView) alert.findViewById(R.id.sell10Text);
//etc etc more handles, including buttons
tvsellAll.setText("Sell All ("+String.valueOf(masterRes.get(currentResIndex).getHeld())+") - $"+String.valueOf(calcCost(masterRes.get(currentResIndex).getHeld())));
tvsell10.setText("Sell 10 - $"+String.valueOf(calcCost(10)));
// etc etc more setTexts
btnsell10.setOnClickListener( new OnClickListener() {
public void onClick(View v) {
if (v.isEnabled()) {
int y=masterRes.get(currentResIndex).getHeld();
masterRes.get(currentResIndex).setHeld(y-10);
held -= 10;
money += (calcCost(10));
updateScreen();
alert.tvsellAll.setText("Sell All ("+String.valueOf(masterRes.get(currentResIndex).getHeld())+") - $"+String.valueOf(calcCost(masterRes.get(currentResIndex).getHeld())));
alert.tvsell10.setText("Sell 10 - $"+String.valueOf(calcCost(10)));
alert.tvsellAmt.setText("Sell Amount (0-"+String.valueOf(masterRes.get(currentResIndex).getHeld())+")");
}
}
});
// etc etc other button handlers, alert.show() at the end
Ahora, obviamente, los setTexts dentro del botón no se pueden resolver, ya que no pueden ver la alerta que creé, simplemente ven OnClickListener.
Intenté manejar esto como lo hice con el actualizador updateScreen () de mi actividad principal, que es Runnable
, que es una larga lista de setTexts y / o invalida, y es runOnUiThread(updateScreen)
. Funciona muy bien para la actividad base.
Hice algunos copypasta y traté de hacer una actualizaciónSellScreen (), hacer que se enganche a las vistas de texto del diálogo personalizado, pero no puede resolver la clase de alerta ... Estoy algo perdido ahora.
¿Esto es posible incluso sin destrozar todo y simplemente crear una vista personalizada (que soy muy reacio a tratar de abordar esta nueva programación de Android ...)
En la actividad donde crea su diálogo, puede declarar variables privadas de diálogo, vistas de texto, etc., y luego estarán accesibles en cualquier lugar de la actividad.
dialogA = new Dialog(myActivity.this, android.R.style.Theme_Dialog);
dialogA.setContentView(R.layout.myDialog);
// ...
tv1 = (TextView) dialogA.findViewById(R.id.textView1);
Button b1 = (Button) dialogA.findViewById(R.id.button1);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String s1 = tv1.getText().toString();
Toast.makeText(myActivity.this, s1, Toast.LENGTH_SHORT).show();
dialogA.cancel();
}
});
dialogA.show();