2012-01-08 17 views
7

Widziałem wiele osób informujących, że możesz ustawić setContentView poza metodą oncreate, ale nigdzie nie znalazłem przykładu. Teraz, gdy próbuję użyć setContentView, moja aplikacja po prostu zawiesza się. Oto mój kod źródłowy:Czy mogę użyć setContentView poza metodą oncreate?

AlarmActivity.java:

package com.alarm.example; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.Button; 
import android.widget.RelativeLayout; 

public class AlarmActivity extends Activity{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Button buton = new Button(this); 
     buton.setId(101); 
     buton.setText("New alarm"); 
     buton.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT)); 
     RelativeLayout layout1 = new RelativeLayout(this); 
     layout1.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    layout1.addView(buton); 
    setContentView(layout1); 

    Button nou =(Button)findViewById(101); 
    nou.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v){ 
      New_ala nou1=new New_ala(); 
      nou1.nou_alarma(); 
      } 
     }); 
    } 
} 

New_ala.java:

package com.alarm.example; 

public class New_ala extends AlarmActivity{ 
public void nou_alarma() { 
setContentView(R.layout.timepicker);   
} 
} 

TimePicker.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 


    <TimePicker 
     android:id="@+id/timePicker" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 

    <LinearLayout 
     android:layout_height="wrap_content" 
     android:layout_width="fill_parent" 
     android:layout_alignParentBottom="true"> 

     <Button 
     android:id="@+id/picker_save" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:text="Save"> 
     </Button> 

     <Button 
     android:id="@+id/picker_cancel" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:text="Cancel"> 
     </Button> 
</LinearLayout> 

</LinearLayout> 

na więcej szczegółów, można użyć setContentView (R.layout.timepicker) wewnątrz metody oncreate bez żadnych problemów, więc problem polega na tym, że setContentView nie działa poprawnie w klasie New_ala.java. Czy ktoś może mi pomóc?

Kod po ustawieniu intencję: AlarmActivity:

package com.alarm.example; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
public class AlarmActivity extends Activity{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     startActivity(new Intent(this, NewAlarmActivity.class)); 
     } 
    } 

NewAlarmActivity:

package com.alarm.example; 
import android.os.Bundle; 
public class NewAlarmActivity extends AlarmActivity{ 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.timepicker); 
} 
    } 
+1

"Moja aplikacja ulega awarii", proszę napisać do LogCata z wyjątkiem – Guillaume

Odpowiedz

3

Najlepszym sposobem na to jest mieć wiele działań: zamiast nou1.nou_alarma(); utwórz intencję i rozpocznij nową aktywność z nowym układem.

startActivity(new Intent(this, NewAlarmActivity.class)); 

A w sposobie NewAlarmActivityonCreate, ustawić widok zawartości do R.layout.timepicker

+0

Dziękuję za odpowiedź. Stworzyłem nową aktywność, ale kiedy uruchomię program w emulatorze, ekran staje się czarny i nic się nie dzieje. Ten kod po edycji jest w opisie mojego pytania – vicciu

+0

Jeśli chcesz, abyśmy zbadali awarię, musisz opublikować zawartość LogCat, która pokazuje wyjątek. – Guillaume

+0

Znalazłem problem. Program był zawsze czarny, ponieważ nie było warunku do rozpoczęcia nowego zamiaru i zaraz po rozpoczęciu nowego zamiaru wrócił do głównej metody i tak dalej. Teraz rozwiązałem problem i działa on doskonale. Wielkie dzięki. – vicciu

-4

setContentView() Metoda może być wywołana tylko raz w działalności. Jeśli chcesz całkowicie zmienić układ, w którymś momencie powinieneś wybrać ViewFlipper lub mieć 2 układy w działaniu i pokazać tylko jedną z nich w danym czasie, dzwoniąc odpowiednio: view.setVisibility(View.GONE); i view.setVisibility(View.VISIBLE);.

+11

Pierwsza część jest po prostu błędna. 'setContentView' można nazwać dowolną liczbę razy. –

9

Możesz wywołać funkcję setContentView za każdym razem, gdy uruchomisz wątek zdarzenia (UI). Pamiętaj, że kiedy to zrobisz, wszystkie pola zainicjalizowane przez wywołanie findViewById będą musiały zostać zresetowane.

Powiązane problemy