Pulsante aggiungi per un layout a livello di programmazione

Ho problemi con l’aggiunta di un pulsante per un layout che ho creato in XML. Ecco cosa voglio ottenere:

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

}

Voglio aggiungere un Button per questa nuova schermata, in modo che verrà visualizzato sotto il grafico.
Ho cercato di creare un LinearLayout vista, quindi creare un Button e aggiungere a questo punto di vista, ma ottengo solo NullPointerExceptions..

Qualsiasi aiuto sarebbe apprezzato. Grazie

EDIT#1

Ecco quello che ho provato, che ha creato un NullPointerException e “force close”:

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

}

Ed ecco il logcat di errore:

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)

c’è abviously più linee a che fare con questo errore nel logcat, non è sicuro se si vuole?

EDIT#2

Così ho provato bhups metodo:

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

Questo metodo ha prodotto lo stesso logcat errore come sopra, NullPointerException, che indica qualcosa che aveva a che fare con la linea no. 27 che è il layout.addView riga di codice. Tutte le idee? Grazie ancora

  • ci mostrano che cosa hai provato e il logcat si ottiene in esecuzione e che, quindi, cerchiamo di scoprire perché si ottiene npe. e ‘ comunque da considerare la creazione di un screen_temperature.xml layout e l’utilizzo che in setContentView(). è possibile aggiungere in xml visualizzazione personalizzata specificando l’intero pacchetto, al posto del proprio nome (ie: <my.package.MyCustomView android:id.../>)
  • creare un layout lineare (ll) e aggiungere GraphTemp visualizzare l’oggetto e ‘ oggetto pulsante per ll. Quindi impostare la visualizzazione del contenuto dell’attività di ll. cioè la chiamata a setcontentview(ll);
InformationsquelleAutor mmmbaileys | 2011-02-05



2 Replies
  1. 32

    Questa linea:

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

    Cerca il “statsviewlayout” id corrente ‘contentview’. Ora che hai impostato qui:

    setContentView(new GraphTemperature(getApplicationContext()));

    E sto cercando di indovinare che le nuove “graphTemperature” non impostare nulla con quell’id.

    È un errore comune pensare che si può solo trovare qualsiasi vista con findViewById. Si può solo trovare una visione che è in XML (o nominato dal codice e dato un id).

    Il nullpointer sarà gettato perché il layout che stai cercando non è presente, in modo

    layout.addView(buyButton);

    Genera l’eccezione.

    aggiunta:
    Ora, se si vuole ottenere che vista da un XML, è necessario utilizzare un inflater:

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

    supponendo che il linearlayout in un file chiamato “yourXMLYouWantToLoad.xml”

    • Potresti dare un’occhiata al mio secondo modifica? Ho postato è praticamente lo stesso tempo che hai postato questa risposta. Io non sono troppo sicuro di aver capito. Il layout “statsviewlayout” è dichiarata in un file xml, se è questo che stai chiedendo?
    • Ok dopo aver visto la tua aggiunta ci. Ill dare un andare 🙂 grazie
    • A te sembra di fare questo ancora: “layout = (LinearLayout) findViewById(R. id.statsviewlayout);` Come lungo come il tuo, per mancanza di una parola migliore, vista corrente sullo schermo (la cosa si imposta in setcontentview non containt questo id, non si può fare questo. Fintanto che l’xml che contiene il ‘statsviewlayout’ non è impostato utilizzando setcontentview il ‘findviewbyid` tornerà null
    • haha, stiamo commentando/lettura tra loro revisioni/integrazioni sembra 😉
    • Yeah! Ok, quindi ho deciso di eliminare il “layout = (LinearLayout) findViewById(R. id.statsviewlayout);” riga di codice e si cambia quello che hai detto. Funziona, senza errori o altro. Unico problema è che, come mostra il grafico che occupa tutto lo schermo del dispositivo (sto usando un emulatore), non sono sicuro se il pulsante è in realtà c’è sotto il grafico..Per risolvere questo posso solo modificare il linearlayout per una scrollview o cosa? Grazie ancora Nanne! Edit scusate, volevo aggiungere una scrollview linear layout..
    • si potrebbe circondano tutto il pezzo con una scrollview. Ma per controllare se il pulsante c’è, magari utilizzare la gerarchia-visualizzatore di controllare e testare? developer.android.com/guide/developing/tools/…
    • Ehi preso a lavorare!! 😀 grazie mille Nanne
    • no prob, non esitate a premere il bello e verde ‘accettare’ segno di spunta se pensi che la mia risposta helpt 🙂
    • Ha farà! Sono nuovo di stackoverflow comunità ;-D

  2. 33

    Se hai appena hanno incluso un file di layout, all’inizio di onCreate() all’interno setContentView e si desidera ottenere questo layout per aggiungere nuovi elementi a livello di programmazione provare questo:

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

    quindi è possibile creare un nuovo Button, per esempio, e basta aggiungere:

    Button bt = new Button(this);
    bt.setText("A Button");
    bt.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
                                        LayoutParams.WRAP_CONTENT));
    linerLayout.addView(bt);
    • FILL_PARENT è deprecato si è rinominato MATCH_PARENT in API Level 8 e superiori.
    • thx per le info!

Lascia un commento