Fragment Problem

  • 4 Antworten
  • Letztes Antwortdatum
DagobertDokate

DagobertDokate

Dauer-User
137
Hallo Leute,

Ich hab gerade ein Problem mit der Fragment Support Lib.
Ich hab als Hauptnavigation einen Liste in der Actionbar.
Jetzt wird aber bei der onNavigationItemSelected() durchläuft das erstellte Fragment die Anfänge des Lebenszyklus zwei mal. Dadurch ist es mir nicht möglich den State wieder herzustellen. Einmal wird es mit Bundle aufgerufen.. und dann sofort wieder mit eine Instanz mit leerem Bundle überschrieben.
Also jetzt meine Frage: Warum zum teufel durchläuft das GroupFragment zwei mal den Zyklus und wie verhinder ich das?

Code:
@Override
	public boolean onNavigationItemSelected(int itemPosition, long itemId) {
		Log.d(TAG, "onNavigationItemSelected: " + itemPosition);
		currentPos = itemPosition;
		Fragment fragment;
		String tag;
		switch (itemPosition) {
		case 1:
			Log.d(TAG, "Create new GroupFragment");
			fragment = new GroupFragment();
			tag = GROUP_TAG;
			break;
		default:
			fragment = new Fragment();
			tag = "";
			break;
		}
		FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
		ft.replace(R.id.container, fragment, tag);
		ft.commit();
		return true;
	}

und hier noch die onViewCreated() vom GroupFragment die zwei mal aufgerufen wird.
Code:
@Override
	public void onViewCreated(View view, Bundle savedInstanceState) {
		super.onViewCreated(view, savedInstanceState);
		Log.d(TAG, "onViewCreated");
		FragmentManager fm = getChildFragmentManager();
		groupSectionsPagerAdapter = new GroupSectionsPagerAdapter(fm, getActivity());

		// Set up the ViewPager with the sections adapter.
		mViewPager = (ViewPager) getActivity().findViewById(R.id.pager);
		mViewPager.setAdapter(groupSectionsPagerAdapter);
		mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
			
			@Override
			public void onPageSelected(int position) {
				currentPosition = position;
			}
			
			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {/* do nothing */ }
		
			@Override
			public void onPageScrollStateChanged(int arg0) { /* do nothing */ }
		});

		if (savedInstanceState != null) {
			Log.d(TAG, "Restore state");
			if(savedInstanceState.containsKey(SAVE_TAB_STATE)) {
				currentPosition = savedInstanceState.getInt(SAVE_TAB_STATE);
				Log.d(TAG, "Restore position: " + currentPosition);
			}
		} else {
			Log.d(TAG, "Restore nothing");
		}
		
		mViewPager.setCurrentItem(currentPosition);
	}

mfg. Dagobert
 
Hi,

poste mal deine Imports.

Mfg

pootney
 
Okay
Hier kommen die MainActivity imports
Code:
import android.app.ActionBar;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.Menu;
import android.widget.ArrayAdapter;
import de.veeapp.app.android.R;
import de.veeapp.app.android.view.group.GroupFragment;
und hier die GroupFramgne imports:
Code:
...
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import de.veeapp.app.android.R;

mfg. Dagobert
 
:D

Ich hatte mal ein ähnlichen Problem habe jedoch mit FragmentPagerAdapter gearbeitet.
Nach dem ändern auf

Code:
import android.support.v4.app.FragmentStatePagerAdapter;

und dem nutzen des FragmentStatePagerAdapter lief es Optimal. Vorher stürzte die App bei Geräten mit Android > 4.x nach dem "minimieren" immer ab.
Vielleicht hilft dir das weiter :biggrin:

Mfg

pootney
 
hey ho,
Ja der Adapter hat damit aber ja nix zu tun....
es geht ja darum das das GroupFragmet quasi zwei mal instanziiert wird, oder zumindest der Lebenszyklus zwei mal Durchlaufen wird... hier ein minimales GroupFragment:
Code:
@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		Log.d(TAG, "onActivityCreated()");
}
Auch hier wird der onActivityCreate-Log zwei mal ausgegeben.

lg. Dagobert
 
Zurück
Oben Unten