2011-02-05 4 views
31

Je n'arrive pas à ajouter un bouton à une mise en page que j'ai créée en XML. Voici ce que je veux atteindre:Ajout d'un bouton à une mise en page par programmation

//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())); 

} 

Je veux ajouter un Button à ce nouvel écran pour que celui-ci apparaît sous le graphique. J'ai essayé de créer une vue LinearLayout, puis créer un Button et l'ajouter à ce point de vue, mais je viens d'obtenir NullPointerException s ..

Toute aide serait appréciée. Merci

EDIT # 1

Voici ce que j'ai essayé d'utiliser qui a créé un NullPointerException et 'la force de fermeture':

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); 

} 

Et voici l'erreur 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) 

theres il ya bien plus de lignes à faire avec cette erreur dans logcat, pas sûr si vous le voulez?

EDIT # 2

donc j'ai essayé méthode bhups:

@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);   
} 

Cette méthode a produit la même erreur logcat comme ci-dessus, NullPointerException, indiquant qu'il avait quelque chose à voir avec la ligne n °. 27 qui est la ligne de code layout.addView. Des idées? Merci encore

+1

nous montrer ce que vous avez essayé et logcat vous êtes en cours d'exécution qui, alors nous essayons de savoir pourquoi vous NPE envisager de toute façon de créer une mise en page 'screen_temperature.xml' et l'utilisation que 'setContentView()'. vous pouvez ajouter en xml votre vue personnalisée en spécifiant le paquet entier aussi, au lieu de simplement le nom (ie: '') – bigstones

+0

créer une disposition linéaire (ll) et ajouter Objet de vue GraphTemp et objet de bouton à ll. Définissez ensuite la vue du contenu de l'activité sur ll. c'est-à-dire setContentView (ll); – bhups

Répondre

31

Cette ligne:

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

recherche l'id "de statsviewlayout" dans votre actuelle 'contentView'. Maintenant, vous avez défini que ici:

setContentView(new GraphTemperature(getApplicationContext())); 

Et je devine que la nouvelle « graphTemperature » ne définit rien avec cet identifiant.

C'est une erreur commune de penser que vous pouvez trouver n'importe quelle vue avec findViewById. Vous pouvez seulement trouver une vue qui est dans le XML (ou nommé par code et donné un identifiant).

Le nullpointer sera lancé parce que la mise en page que vous recherchez ne se trouve pas, si

layout.addView(buyButton); 

Lancers cette exception.

plus: Maintenant, si vous voulez obtenir ce point de vue à partir d'un XML, vous devez utiliser un gonfleur:

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

en supposant que vous avez votre LinearLayout dans un fichier appelé « yourXMLYouWantToLoad.xml »

+0

Pourriez-vous jeter un oeil à ma deuxième édition? Je l'ai posté à peu près au même moment où vous avez posté cette réponse. Je ne suis pas trop sûr de comprendre. La disposition "statsviewlayout" est déclarée dans un xml, si c'est ce que vous demandez? – mmmbaileys

+0

Ok, juste après avoir vu votre ajout là-bas. Ill donner un aller :-) merci – mmmbaileys

+0

Vous semblez faire encore ceci: 'layout = (LinearLayout) findViewById (R.id.statsviewlayout);' Tant que votre, en l'absence d'un meilleur mot, vue actuelle sur le screen (la chose que vous définissez dans 'setcontentview' ne contient pas cet identifiant, vous ne pouvez pas le faire.) Tant que le fichier XML contenant 'statsviewlayout' n'est pas défini avec' setcontentview', 'findviewbyid' renverra 'null' – Nanne

31

Si vous venez d'avoir inclus un fichier de mise en page au début de onCreate() à l'intérieur setContentView et que vous souhaitez obtenir cette mise en page pour ajouter de nouveaux éléments essayez programme ceci:

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

vous pouvez créer une nouvelle Button pour exemple et il suffit d'ajouter:.

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 obsolète est est renommé MATCH_PARENT dans API niveau 8 et supérieur. – GregD

+0

@GregD thx pour l'info! –

Questions connexes