2012-09-14 14 views
7

Tengo un LinearLayout que contiene un TextView, y siempre lo hará. También siempre habrá al menos un botón ubicado debajo de TextView, pero podría haber más de uno bajo ciertas circunstancias.Crear botones de Android programáticamente utilizando el diseño XML como plantilla

Puedo crear y agregar tantos botones como necesite programáticamente. También puedo configurar correctamente los parámetros/opciones relacionados con la apariencia que requiera para estos botones mediante programación.

El problema es que no sé cómo decirle a un botón creado mediante programación que debe usar un archivo de recursos XML, que contiene los parámetros de apariencia y diseño, en lugar de establecer estos parámetros mediante programación.

He visto preguntas con nombres similares y pasé tiempo jugando con la API en sí misma, fue en vano.

Editar:
Aquí está una aproximación de lo que estoy tratando de hacer que se espera dar explicaciones un poco más claras para mí:

private TextView textView; 
private SomeObject someObject; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
    View scrollView = inflater.inflate(R.layout.fragment_play_game, container, false); 
    textView = (TextView) scrollView.findViewById(R.id.game_data_text); 
    textView.setText(someObject.getTextForTextView()); 

    LinearLayout layout = (LinearLayout) scrollView.findViewById(R.id.game_data_container); 
    for (String optionText : someObject.getTextForButtons()) { 
     layout.addView(createOptionButton(optionText, layout)); 
    } 
    return scrollView; 
} 

private View createOptionButton(String optionText, LinearLayout layout) { 
    Button optionButton = new Button(this.getActivity()); 
    // set button layout/options here, somehow?? 
    optionButton.setText(optionText); 
    return optionButton; 
} 

Mi archivo de diseño XML para el fragmento es el siguiente (es este LinearLayout que estoy tratando de añadir botones a):

<?xml version="1.0" encoding="utf-8"?> 

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/game_data_container" 
     etc... > 

     <TextView 
      android:id="@+id/game_data_text" 
      etc... /> 

    </LinearLayout> 

</ScrollView> 

Además, si voy a crear un archivo de diseño de XML para el botón (permite llamarlo custom_button.xml) debería ser algo como esto ?:

<?xml version="1.0" encoding="utf-8"?> 
    <Button xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/play_game_option_button" 
     etc... /> 

Actualización:
Sólo para ampliar un poco en lo que MrFox @ está hablando, lo que hice para que funcione fue reemplazar esta línea:

Button optionButton = new Button(this.getActivity()); 

con éste:

Button optionButton = (Button) inflater.inflate(R.layout.play_game_option_button, layout, false); 

... que infla un archivo xml que solo contiene un diseño de botón (la plantilla del botón). En este caso, devuelve la vista raíz de ese archivo, que es solo el botón porque no hay ningún elemento superior sobre el botón en el archivo.

Sin embargo, si tuviera establecido el último valor booleano (attachToParent) en verdadero, habría devuelto el contenedor raíz en el que estará el botón (que es simplemente la variable 'layout' que se pasó a la llamada) .

Ahora puedo producir tantos botones como desee utilizando esta plantilla.

Respuesta

5

¿Ha pensado en hacer un diseño que sea solo el botón con los estilos XML aplicados y luego inflarlo en su diseño lineal?

algo como:

inflater.inflate (R.layout.StyledButton, MyLinearLayout, true);

+1

Gracias por la respuesta, he intentado jugar un poco con lo que su sugiriendo, pero yo realmente no entiendo cómo implementar lo que sugieres. He actualizado mi pregunta original con más información. – Rob

+0

usted y yo ambos –

+0

¡Gracias a @Rob por ampliar mi respuesta! –

1

xml para su botón debajo /res/layout/my_button_layout.xml

<Button xmlns:android="http://schemas.android.com/apk/res/android" 
    ... /> 

código en su actividad

myButton = (Button)inflate.inflate(R.layout.my_button_layout, null); 
myView.addView(myButton); 
Cuestiones relacionadas