2011-10-28 31 views
5

Encontré una muestra SwipeSample sencilla que cambié para permitirme crear nuevos diseños xml e inflar el diseño principal para mostrarlos. Lo que quería hacer también era poder agregar diseños programáticamente para el proceso de barrido.La mejor manera de inflar la vista mediante programación

Tengo el diseño main.xml y un red.xml y yellow.xml que son una distribución lineal simple con una vista de texto establecida en un color sólido.

El siguiente código funciona pero no creo que sea correcto o la mejor manera de hacer lo que intento. Si alguien puede sugerir una mejor manera que sería muy apreciada.

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    //Create a layout with a solid blue background programmatically 
    TextView tv1 = new TextView(this); 
    tv1.setText("Blue"); 
    tv1.setBackgroundColor(Color.BLUE); 
    tv1.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

    LinearLayout ll = new LinearLayout(this); 
    ll.setOrientation(LinearLayout.VERTICAL); 
    ll.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    ll.addView(tv1); 
    //Create a layout with a solid green background programmatically 
    TextView tv2 = new TextView(this); 
    tv2.setText("Green"); 
    tv2.setBackgroundColor(Color.GREEN); 
    tv2.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

    LinearLayout ll2 = new LinearLayout(this); 
    ll2.setOrientation(LinearLayout.VERTICAL); 
    ll2.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    ll2.addView(tv2); 
    //inflate the flipper view and add the yellow and red xml layouts and also the 2 programmatically created layouts 
    fSpace = (ViewFlipper)findViewById(R.id.flipper); 
    inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    inflater.inflate(R.layout.yellow, fSpace); 
    inflater.inflate(R.layout.red, fSpace); 
    fSpace.addView(ll); 
    fSpace.addView(ll2); 

} 

Respuesta

2

La forma en que se inflan y R.layout.yellow R.layout.red es de hecho la manera correcta de hacerlo. Es posible que pueda simplificar su código moviendo una gran cantidad a xml. ¿Supongo que tv1 es solo una muestra? si no, podría entrar en main.xml. Incluso puede encontrar una forma de crear amarillo y rojo con una sola inflación ... dependiendo de lo que esté haciendo.

La creación de vistas mediante programación es, en su mayor parte, un poco tediosa.

4

Si tiene un diseño complejo que desea crear mediante programación, puede ser más fácil tener el diseño preinstalado en xml y luego simplemente inflarlo y agregarlo en tiempo de ejecución.

Crear vista en XML

Aquí es un diseño xml de prefabricados de muestra que se encuentra en la carpeta de diseño. La tuya puede ser cualquier cosa, una vista única o un diseño complejo completo.

diseño/my_view.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/LinearLayout1" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/TextView1" 
     android:text="This is a TV"/> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/TextView2" 
     android:text="How are you today?"/> 
</LinearLayout> 

Haga un contenedor para su vista

tener un lugar que poner su vista en su diseño de la actividad. Podrías tener algo como esto.

<FrameLayout 
    android:id="@+id/flContainer" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

</FrameLayout> 

inflar la vista

Uso obtener una referencia al contenedor, infle su vista desde XML, y después añadirlo al contenedor.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    FrameLayout container = (FrameLayout) findViewById(R.id.flContainer); 
    View inflatedLayout= getLayoutInflater().inflate(R.layout.my_view, null, false); 
    container.addView(inflatedLayout); 

} 

Hacerlo de esta manera mantiene su código mucho más limpio.

Consulte también:

Cuestiones relacionadas