2012-01-08 17 views
7

He visto a muchas personas decir que puede establecer setContentView fuera del método oncreate, pero no encontré en ningún lado un ejemplo. Ahora, cuando intento usar setContentView, mi aplicación simplemente falla. Aquí está mi código fuente:¿Puedo usar setContentView fuera del método oncreate?

AlarmActivity.java:

package com.alarm.example; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.Button; 
import android.widget.RelativeLayout; 

public class AlarmActivity extends Activity{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Button buton = new Button(this); 
     buton.setId(101); 
     buton.setText("New alarm"); 
     buton.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT)); 
     RelativeLayout layout1 = new RelativeLayout(this); 
     layout1.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    layout1.addView(buton); 
    setContentView(layout1); 

    Button nou =(Button)findViewById(101); 
    nou.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v){ 
      New_ala nou1=new New_ala(); 
      nou1.nou_alarma(); 
      } 
     }); 
    } 
} 

New_ala.java:

package com.alarm.example; 

public class New_ala extends AlarmActivity{ 
public void nou_alarma() { 
setContentView(R.layout.timepicker);   
} 
} 

TimePicker.xml:

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


    <TimePicker 
     android:id="@+id/timePicker" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 

    <LinearLayout 
     android:layout_height="wrap_content" 
     android:layout_width="fill_parent" 
     android:layout_alignParentBottom="true"> 

     <Button 
     android:id="@+id/picker_save" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:text="Save"> 
     </Button> 

     <Button 
     android:id="@+id/picker_cancel" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:text="Cancel"> 
     </Button> 
</LinearLayout> 

</LinearLayout> 

En más detalle, puedo usar setContentView (R.layout.timepicker) dentro del método oncreate sin ningún problema, por lo que el problema es que setContentView no funciona correctamente dentro de la clase New_ala.java. ¿Alguien puede ayudarme?

El código después de establecer la intención: AlarmActivity:

package com.alarm.example; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
public class AlarmActivity extends Activity{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     startActivity(new Intent(this, NewAlarmActivity.class)); 
     } 
    } 

NewAlarmActivity:

package com.alarm.example; 
import android.os.Bundle; 
public class NewAlarmActivity extends AlarmActivity{ 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.timepicker); 
} 
    } 
+1

"Mi aplicación simplemente falla", publique el LogCat con la excepción – Guillaume

Respuesta

3

La mejor manera de hacerlo es tener múltiples actividades: en lugar de nou1.nou_alarma();, crear una intención y comenzar una nueva actividad con el nuevo diseño.

startActivity(new Intent(this, NewAlarmActivity.class)); 

Y en el método de NewAlarmActivityonCreate, establezca la vista de contenido que R.layout.timepicker

+0

Gracias por su respuesta. Creé la nueva actividad, pero cuando ejecuto el programa en el emulador, la pantalla se pone negra y no pasa nada. Este código después de la edición se encuentra en la descripción de mi pregunta – vicciu

+0

Si desea que investiguemos un bloqueo, debe publicar el contenido del LogCat, que muestra la excepción – Guillaume

+0

Encontré el problema. El programa siempre era negro porque no había ninguna condición para comenzar el nuevo intento y justo después de que comenzara el nuevo intento volvía al método principal y así sucesivamente. Ahora resolví el problema y funciona brillantemente. Muchas gracias. – vicciu

-4

El método setContentView() puede ser llamado una sola vez por la actividad. Si desea cambiar completamente el diseño en algún momento, debe ir a ViewFlipper o tener 2 diseños en la actividad y mostrar solo uno de ellos en un momento dado llamando al view.setVisibility(View.GONE); y view.setVisibility(View.VISIBLE); respectivamente.

+11

La primera parte es simplemente incorrecta. 'setContentView' se puede llamar un número arbitrario de veces. –

9

Puede llamar a setContentView cada vez que se ejecuta en el subproceso de evento (UI). Tenga en cuenta que cuando lo haga, deberá reiniciar cualquier campo inicializado llamando al findViewById.

Cuestiones relacionadas