2011-02-05 25 views
31

Tengo problemas para agregar un botón a un diseño que he creado en XML. Esto es lo que quiero lograr:Agregar botón a un diseño programáticamente

//some class 
else { 
     startActivity(new Intent(StatisticsScreen.this, ScreenTemperature.class)); 
} 
//// 

//ScreenTemperatureClass 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    //this is where I call another class that 
    //displays a nice graph 
    setContentView(new GraphTemperature(getApplicationContext())); 

} 

Quiero añadir un Button a esta nueva pantalla de modo que va a aparecer debajo del gráfico. He intentado crear una vista LinearLayout, a continuación, crear una Button y añadirlo a este punto de vista, pero apenas consigo NullPointerException s ..

sería apreciada Cualquier ayuda. Gracias

editar # 1

Esto es lo que he intentado usar que crea un NullPointerException y 'Forzar cierre':

Button buybutton; 
LinearLayout layout; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(new GraphTemperature(getApplicationContext())); 

    layout = (LinearLayout) findViewById(R.id.statsviewlayout); 
    Button buyButton = new Button(this); 
    buyButton.setText(R.string.button_back); 
    buyButton.setLayoutParams(new LayoutParams(
     ViewGroup.LayoutParams.WRAP_CONTENT, 
      ViewGroup.LayoutParams.WRAP_CONTENT)); 
    layout.addView(buyButton); 

} 

Y aquí está el error Logcat:

ERROR/AndroidRuntime(293): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.weatherapp/com.weatherapp.ScreenTemperature}: java.lang.NullPointerException 
ERROR/AndroidRuntime(293):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
ERROR/AndroidRuntime(293):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
ERROR/AndroidRuntime(293):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
ERROR/AndroidRuntime(293):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 

¿Hay más líneas que ver con este error en logcat, no estoy seguro si lo quiere?

editar # 2

así que traté bhups método:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    GraphTemperature GT = new GraphTemperature(getApplicationContext());    
    layout = (LinearLayout) findViewById(R.id.statsviewlayout); 
    Button buyButton = new Button(this); 
    buyButton.setText(R.string.button_back); 
    buyButton.setLayoutParams(new LayoutParams(
     ViewGroup.LayoutParams.WRAP_CONTENT, 
      ViewGroup.LayoutParams.WRAP_CONTENT)); 
    layout.addView(GT); // line 27 
    layout.addView(buyButton);  
    setContentView(layout);   
} 

Este método produce el mismo error Logcat que el anterior, NullPointerException, indicando que era algo que ver con la línea no. 27 que es la línea de código layout.addView. ¿Algunas ideas? Gracias de nuevo

+1

nos muestran lo que intentaste y la logcat te ejecución que, por lo que intentamos averiguar por qué se obtiene NPE de todas formas considerar la creación de un layout 'screen_temperature.xml' y el uso que, en 'setContentView()'. usted puede agregar en xml su vista personalizada especificando también el paquete completo, en lugar de solo el nombre (es decir: '') – bigstones

+0

crear un diseño lineal (ll) y agregar GraphTemp ve el objeto y el objeto del botón a ll. Luego configure la vista de contenido de la actividad en ll. es decir, setContentView (ll); – bhups

Respuesta

31

Esta línea:

layout = (LinearLayout) findViewById(R.id.statsviewlayout); 

busca el id "statsviewlayout" en su actual 'contentView'. Ahora que ha establecido que aquí:

setContentView(new GraphTemperature(getApplicationContext())); 

y supongo que el nuevo "graphTemperature" no establece nada con ese ID.

Es un error común pensar que puede encontrar cualquier vista con findViewById. Solo puede encontrar una vista que esté en el XML (o designada por código y con una identificación).

El NullPointer serán echados porque el diseño que está buscando no se encuentra, por lo

layout.addView(buyButton); 

Lanza esa excepción.

además: Ahora bien, si usted quiere conseguir que vista desde un XML, debe utilizar un inflador:

layout = (LinearLayout) View.inflate(this, R.layout.yourXMLYouWantToLoad, null); 

asumiendo que usted tiene su LinearLayout en un archivo llamado "yourXMLYouWantToLoad.xml"

+0

¿Podría echar un vistazo a mi segunda edición? Lo publiqué prácticamente al mismo tiempo que publicaste esta respuesta. No estoy muy seguro de entender. El diseño "statsviewlayout" se declara en un xml, si eso es lo que estás preguntando? – mmmbaileys

+0

Ok, justo después de ver su adición allí. Voy a darle una oportunidad :-) Gracias – mmmbaileys

+0

Parece que todavía está haciendo esto: 'layout = (LinearLayout) findViewById (R.id.statsviewlayout);' Siempre y cuando, por falta de una palabra mejor, la vista actual en el pantalla (lo que estableces en 'setcontentview' no contiene esta identificación, no puedes hacer esto. Mientras que el xml que contiene el 'statsviewlayout' no se establece usando' setcontentview' el 'findviewbyid' devolverá 'null' – Nanne

31

Si sólo se ha incluido un archivo de diseño a principios de onCreate() dentro setContentView y quiere conseguir este diseño para añadir nuevos elementos mediante programación intente esto:

ViewGroup linearLayout = (ViewGroup) findViewById(R.id.linearLayoutID); 

continuación, puede crear un nuevo Button de ejemplo, y sólo tiene que añadir que:.

Button bt = new Button(this); 
bt.setText("A Button"); 
bt.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
            LayoutParams.WRAP_CONTENT)); 
linerLayout.addView(bt); 
+3

FILL_PARENT está en desuso, se renombra MATCH_PARENT en API Nivel 8 y superior. – GregD

+0

@GregD thx para la información! –

Cuestiones relacionadas