TabHost mehrere Activitys

  • 13 Antworten
  • Neuester Beitrag
Diskutiere TabHost mehrere Activitys im Android App Entwicklung im Bereich Betriebssysteme & Apps.
G

Gingerbread

Fortgeschrittenes Mitglied
Habe versucht weitere Activities zu einem Tab hinzuzufügen, so dass trotzdem im Header die Tab leiste noch angezeigt wird. Jedoch bekomme ich immer eine NullPointerException.

Also mein TabHost ist in einer Activity deklariert und funktioniert auch.

Aufrufen der ArchiveGroup: (FirstActivity)
Code:
                       public void onClick(View v) {
				// TODO Auto-generated method stub
			
				Intent i = new Intent(getApplicationContext(), ArchiveGroup.class);
				i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
				View view = ArchiveGroup.group.getLocalActivityManager().startActivity("Show", i).getDecorView();
				ArchiveGroup.group.setContentView(view);
			}
Inhalt der ArchiveGroup:
Code:
public class ArchiveGroup extends ActivityGroup {

    public static ArchiveGroup group;
    private ArrayList<View> history;

    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        this.history = new ArrayList<View>();
        group = this;
        
        View view = getLocalActivityManager().startActivity("name", 
                new Intent(this, SecondActivity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
        
        setContentView(view);
    }
    
   

}
Die Activity die angezeigt werden soll (SecondActivity.class) enthält nur ganz normalen Code. Die NullPointerException tritt auch schon vor dem aufruf auf, nämlich schon beim onClick in der FirstActivity.
Wo liegt der Fehler?
 
M

Mss

Ambitioniertes Mitglied
Mit so wenigen Informationen zur Exception bzw. Code ist es schwierig zu sagen. Debugge den Code, dann siehst du auch wo genau die Exception auftritt.

Ich vermute es liegt daran, dass der Zugriff auf group in OnClick die NullPointerException auslöst, da noch group zu diesem Zeitpunkt noch keine Instanz zugewiesen ist. :winki: Dies geschieht erst bei startActivity().
 
G

Gingerbread

Fortgeschrittenes Mitglied
Also das spuckt Logcat aus:

java.lan.NullPointerException
at [...].onClick(...)
at android.view.View.performClick(View.java:2408)
at android.view.View$PerformClick.run(View.java:8816)
at android.os.Handler.handleCallback(Handler.java: 587)
at android.os.Handler.dispatchMessage(Handler.java: 92)
at android.os.Looper.loop(Looper.java: 123)
at android.app.ActivityThread.main(Activity.Thread.java: 4627)
at java.lan.reflect.Mehtod.invokeNative(Native Method)
at java.lan.reflect.Method.invoke(Method.java:521)


Rest ist glaub ich unwichtig

Die Exception tritt direkt auf, wenn auf den Button in der FirstActivity gedrückt wird.
 
M

Mss

Ambitioniertes Mitglied
at [...].onClick(...) ist wichtig, welche Zeile wird da in den Klammern angezeigt?;)
 
G

Gingerbread

Fortgeschrittenes Mitglied
Da steht dann onClick(FirstActivity.java: 29)
Jedoch befindet sich in Zeile 29 der FirstActivity gar kein Coder mehr.

Edit: Habe vergessen die Imports mitzuzählen. Ich glaube es handelt sich um folgende Zeile:

ArchiveGroup.group.setContentView(view);
 
Zuletzt bearbeitet:
M

Mss

Ambitioniertes Mitglied
Lass dir doch die Zeilen Nr in Eclipse anzeigen.
Window -> Preferences -> General -> Editors -> Text Editors Häkchen bei "Show line number" setzen.:winki:

Welche Zeile ist nun 29?
 
G

Gingerbread

Fortgeschrittenes Mitglied
Also es handelt sich um folgende Zeile:

Code:
View view = ArchiveGroup.group.getLocalActivityManager().startActivity("Show", i).getDecorView();
 
M

Mss

Ambitioniertes Mitglied
Wie schon vermutet, liegt es daran, dass der Zugriff auf group in OnClick die NullPointerException auslöst, da noch group zu diesem Zeitpunkt noch keine Instanz zugewiesen ist. Dies geschieht erst bei startActivity().

Teste mal

Code:
View view = getLocalActivityManager().startActivity("Show", i).getDecorView();
 
G

Gingerbread

Fortgeschrittenes Mitglied
Wenn ich das einfach
View view = ArchiveGroup.group.getLocalActivityManager().startActivity("Show", i).getDecorView();

durch
Code:
View view = getLocalActivityManager().startActivity("Show", i).getDecorView();
ersetze bekomme ich eine Fehlermeldung von Eclipse, dass ich die Methoe getLocalActivityManger() erst erstellen sollte.
 
M

Mss

Ambitioniertes Mitglied
Sry, ich meinte:
Code:
View view = ArchiveGroup.getLocalActivityManager().startActivity("Show", i).getDecorView();
 
G

Gingerbread

Fortgeschrittenes Mitglied
bekomme jetzt eben die Fehlermeldung, dass getLocalActivityManager() keine statische Methode sei.
cannot make a static reference to the non-static method getLocalActivityManager() from the type ArchiveGroup
 
G

Gingerbread

Fortgeschrittenes Mitglied
Wie löst ihr denn das Problem, im TabHost die obere Tableiste noch zu behalten, wenn ihr ein neues Activity öffnen wollt?
 
G

Gingerbread

Fortgeschrittenes Mitglied
Habe hier mal ne generelle Verständnisfrage:
(Habe mich am Beispiel von http://united-coders.com/nico-heid/...oup-within-tabhost-to-show-different-activity orientiert)

Also ich habe eine Activity Tabhost
Hier definiere ich die einzelnen Tabs die haben möchte.

Dann wird z.B. auf ArchiveGroup.class weitergeleitet:
Was passiert dann hier genau?

ArchiveActivity
Ist dies dann einfach die Zweite Activity, die dargestellt werden soll?
 
G

Gingerbread

Fortgeschrittenes Mitglied
Ich habe es jetzt nochmal wie auf
Android: TabActivity Nested Activities | Henrik Larsen Toft
gemacht. Und ich bekomme schon wieder eine NullPointerException an der gleichen Stelle. Hier der Code:

Die FirstGroup.class
Code:
public class FirstGroup extends ActivityGroup {

	public static FirstGroup group;
	
	private ArrayList<View> history;
	
	@Override
    protected void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		this.history = new ArrayList<View>();
		group = this;
		
		
		View view = getLocalActivityManager().startActivity("CitiesActivity", new  
                Intent(this,CitiesActivity.class)  
                .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))  
                .getDecorView();  
		replaceView(view);  
		
	}
	
	public void replaceView(View v) {  
        // Adds the old one to history  
       history.add(v);  
        // Changes this Groups View to the new View.  
       setContentView(v);  
      }  
	
	public void back() {  
        if(history.size() > 0) {  
            history.remove(history.size()-1);  
            setContentView(history.get(history.size()-1));  
        }else {  
            finish();  
        }  
    }
	
    public void onBackPressed() {  
        FirstGroup.group.back();  
        return;  
    }  
}
Und schließlich die CitiesActivity.class
Code:
public class CitiesActivity extends ActivityGroup {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.cities);
        
        
        Button bu = (Button)findViewById(R.id.bu_1);
        bu.setOnClickListener(new OnClickListener() 
        {
			
			@Override
			public void onClick(View v) 
			{
				// TODO Auto-generated method stub
				Intent i = new Intent(CitiesActivity.this, ShowCities.class); 
				
				[COLOR="Red"]View view = FirstGroup.group.getLocalActivityManager()[/COLOR]  
		        .startActivity("Show Cities", i  
		        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))  
		        .getDecorView();  
		  
		        // Again, replace the view  
		        FirstGroup.group.replaceView(view);  
			
			}
		}
        )
        ;
    }
    }
Die Exception tritt wieder an gleicher Stelle auf. Woran liegt es?