Nach Fragment geht ActionBar verloren

T

TesterAndroid

Neues Mitglied
0
Hallo zusammen,

nachdem ich nun diverse Tutorials konsultiert habe in denen seltsamerweise nur einmal eine ActionBar gesetzt wird.

Frage ich mich langsam ob ich im falschen Film bin.

Meine Fragments rufen jeweils eine Activity auf und sobald die erste Activity geladen wurde geht meine ActionBar verloren.

Die Frage ist nun relativ einfach wie kann über alle meine Fragment Activities hinweg eine ActionBar anzeigen welche das aktuelle Fragment in Form des ausgewählten Tabs anzeigt?
 
Irgendwo ist der Dreher drinnen. Ein Fragment kann nicht für sich selbst existieren. Wenn die Activity deiner App geladen wird, wird die onCreate-Methode aufgerufen. Innerhalb dieser Methode kannst du der Activity ein Layout zuweisen mithilfe der setContentView-Methode.
Code:
setContentView(R.layout.activity_main);
Innerhalb dieses Layouts kannst du nun ein Fragment platzieren.
Code:
<fragment
  android:id="@+id/fragment_main"
  android:name="de.package.FragmentMain"
  android:layout_width="match_parent"
  android:layout_height="match_parent" />
Durch diese deklaration wird nun der Lifecycle des Fragments "FragmentMain" das z.B. von der Klasse Fragment abgeleitet ist gestartet. Es werden also nacheinander die Methoden onAttach, onCreate, onCreateView, ... aufgerufen. Hier ähnelt der Lifecycle des Fragments sehr stark einer Activity. Gelangt die Activity nun in den Hintergrund, wird die onPause Methode usw. der Activity aufgerufen, wodurch auch das auf der Activity sitzende Fragment abgebaut wird und dessen onPause-Methode usw. aufgerufen wird.
Ein Fragment sitzt in solch einem Szenario also immer auf einer Activity die zumindest das Grundgerüst der ActionBar verwaltet. Diese kann mit Hilfe der Mehtode onCreateOptionsMenu ein definiertes Menü in die ActionBar laden. Allerdings kann auch das gerade aktive Fragment MenuItems hinzufügen - ebenfalls mit Hilfe der Methode onCreateOptionsMenu.
Dadurch hat man die Möglichkeit in einem mehrspaltigen Layout mit zwei oder mehr Fragments MenuItems hinzuzufügen. Wäre ja auch Witzlos mehrere ActionBars in einem View anzuzeigen.

Die Frage ist nun relativ einfach wie kann über alle meine Fragment Activities hinweg eine ActionBar anzeigen welche das aktuelle Fragment in Form des ausgewählten Tabs anzeigt?
Ich habe keine Ahnung was du mir damit Sagen möchtest. Wenn du wissen willst wie du Fragments innerhalb einer Activity austauschen kannst, ohne das die ActionBar verschwindet kann ich nur nochmal wiederholden.
Die Activity "Verwaltet" die ActionBar. Wird ein Fragment innerhalb dieses Layouts getauscht, beeinflusst dies die ActionBar nicht, es sei denn, sie leisten einen Beitrag an der ActionBar z.B. in Form zusätzlicher MenuItems. Wird nun das Fragment innerhalb dieser Activity getauscht, bleibt die ActionBar an Ort und stelle, da mit der beherbergenden Activity ja nichts geschieht. Hoffe es leuchtet ein.
Fragments sind am Anfang ein wenig verwirrend, da viele unterschiedliche Dateien beteiligt sind und abgearbeitet werden. Lies dir unter android.com im Developer-Portal unter den API-Guides die Themen Activities und Fragments gründlich durch, sonst läufste noch länger gegen die Wand.
 
Zuletzt bearbeitet:
Also ich glaube ich erkläre das mal kurz mithilfe von Code

Folgende FragmentActivity wird durch eine Activity X gestartet:
Code:
package de.ingmbh.sphinx.api2d.online.viewer.android.activities;

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.view.Menu;
import de.ingmbh.sphinx.api2d.online.viewer.android.R;
import de.ingmbh.sphinx.api2d.online.viewer.android.activities.listener.MyTabsListener;
import de.ingmbh.sphinx.api2d.online.viewer.android.fragment.PanelFragment;
import de.ingmbh.sphinx.api2d.online.viewer.android.fragment.TriggerFragment;
public class FragmentTabActivity extends Activity {       
    private ActionBar actionbar;
        
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return createTabMenu();
    }

    public boolean createTabMenu(){
        //ActionBar
        actionbar = getActionBar();
        actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionbar.setTitle(R.string.app_name);

        Tab tab = actionbar.newTab()
            .setText(R.string.lang_panel)
            .setTabListener(new MyTabsListener<PanelFragment>(
                    this, "panel", PanelFragment.class));
        
        actionbar.addTab(tab);
        
        tab = actionbar.newTab()
        .setText(R.string.lang_trigger)
        .setTabListener(new MyTabsListener<TriggerFragment>(
                this, "trigger", TriggerFragment.class));
        
        actionbar.addTab(tab);
        
        return true;
    }
    
    public ActionBar getActionbar() {
        return actionbar;
    }
}

Dann eine Impl von Fragment die wiederrum eine Activity startet
Code:
package de.ingmbh.sphinx.api2d.online.viewer.android.fragment;

import de.ingmbh.sphinx.api2d.online.viewer.android.activities.SphinxViewerAndroidActivity;
import de.ingmbh.sphinx.online.common.vo.Project;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;


public class PanelFragment extends Fragment {
    Project project;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        project = (Project) this.getActivity().getIntent().getSerializableExtra("project");
        System.out.println();
    }

    @Override
    public void onStart() {
        super.onStart();
        Intent myIntent = new Intent(getActivity().getApplicationContext(), ViewAndroidActivity.class).putExtra("project", project);
        startActivity(myIntent); 
    }    
}

Mein Listener der die Fragments austauscht
Code:
package de.ingmbh.sphinx.api2d.online.viewer.android.activities.listener;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.app.ActionBar.Tab;
import android.app.ActionBar.TabListener;

public class MyTabsListener<T extends Fragment> implements TabListener {
    private Fragment fragment;
    private final Activity activity;
    private final String tag;
    private final Class<T> clzz;
    
    public MyTabsListener(Activity activity, String tag, Class<T> clzz){
        this.activity = activity;
        this.tag = tag;
        this.clzz = clzz;
    }
    
    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        // Check if the fragment is already initialized
        if (fragment == null) {
            // If not, instantiate and add it to the activity
            fragment = Fragment.instantiate(activity, clzz.getName());
            ft.add(android.R.id.content, fragment, tag);
        } else {
            // If it exists, simply attach it in order to show it
            ft.attach(fragment);
        }

    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        if (fragment != null) {
            // Detach the fragment, because another one is being attached
            ft.detach(fragment);
        }

    }

}

So das Problem ist das in der ViewAndroidActivity meine ActionBar verschwunden ist.

Ich hoffe das hilft besser, es kann nciht wirklich viel sein was hier im argen liegt
 

Ähnliche Themen

M
Antworten
0
Aufrufe
623
MikePlase
M
M
Antworten
2
Aufrufe
784
jogimuc
J
Tiefkuehlpizza
Antworten
2
Aufrufe
793
Tiefkuehlpizza
Tiefkuehlpizza
B
Antworten
1
Aufrufe
823
jogimuc
J
W
Antworten
1
Aufrufe
751
jogimuc
J
Zurück
Oben Unten