J'ai du mal à ajouter un bouton à une mise en page que j'ai créée en XML. Voici ce que je veux réaliser:
//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 qu'il apparaisse sous le graphique. J'ai essayé de créer une vue LinearLayout
, puis de créer une Button
et de l'ajouter à cette vue, mais je reçois simplement NullPointerException
s ..
Toute aide serait appréciée. Merci
MODIFIER # 1
Voici ce que j'ai essayé d'utiliser qui a créé un NullPointerException
et une 'fermeture forcée':
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 évidemment plus de lignes à voir avec cette erreur dans logcat, vous ne savez pas si vous le voulez?
MODIFIER # 2
J'ai donc essayé la 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 que ci-dessus, NullPointerException
, indiquant que cela avait quelque chose à voir avec la ligne no. 27 qui est le layout.addView
ligne de code. Des idées? Merci encore
Cette ligne:
layout = (LinearLayout) findViewById(R.id.statsviewlayout);
Recherche l'identifiant "statsviewlayout" dans votre 'contentview' actuelle. Vous avez maintenant réglé cela ici:
setContentView(new GraphTemperature(getApplicationContext()));
Et je suppose que le nouveau "graphTempérature" ne définit rien avec cet identifiant.
C'est une erreur courante de penser que vous pouvez simplement trouver n'importe quelle vue avec findViewById. Vous ne pouvez trouver qu'une vue qui est dans le XML (ou nommée par code et avec un identifiant).
Le pointeur nul sera jeté car la mise en page que vous recherchez est introuvable, donc
layout.addView(buyButton);
Lève cette exception.
ajout: Maintenant, si vous voulez obtenir cette 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 disposition linéaire dans un fichier appelé "yourXMLYouWantToLoad.xml"
Si vous venez d'inclure un fichier de mise en page au début de onCreate()
dans setContentView
et que vous souhaitez obtenir cette mise en page pour ajouter de nouveaux éléments par programmation, essayez ceci:
ViewGroup linearLayout = (ViewGroup) findViewById(R.id.linearLayoutID);
alors vous pouvez créer un nouveau Button
par exemple et l'ajouter simplement:
Button bt = new Button(this);
bt.setText("A Button");
bt.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
linerLayout.addView(bt);