web-dev-qa-db-fra.com

Ajouter un bouton à une mise en page par programmation

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 NullPointerExceptions ..

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

34
mmmbaileys

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"

32
Nanne

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);
33
Alex Cio