Fragment im Fragment erzeugt - Fehlermeldung beim Restart

M

Manuel1805

Ambitioniertes Mitglied
2
Hallo zusammen,

ich habe eine Frage, in meiner App verwende ich einen Navigationsdrawer. Mit diesem ersetze ich mein Fragment. Nun ist es aber so dass ich aus einem Fragment ein weiteres erzeuge. Das funktioniert auch ...
...aber mit dem Nachteil dass beim Neustart der App ein Fehler ausgeworfen wird. Die MainActivity kennt halt das Fragment nicht, wie kann ich den Fehler vermeiden / das Problem lösen? Kann ich beim Beenden der App ein anderes Fragment laden? :confused2:

Fehlermeldung:
FATAL EXCEPTION: main
jo start activity ComponentInfo{de.manuel.buchenfueranfaenger/de.manuel.buchenfueranfaenger.MainActivity}: android.app.Fragment$InstantiationException: Unable to instantiate fragment de.manuel.buchenfueranfaenger.Training: make sure class name exists, is public, and has an empty constructor that is public


Aus dieser Klasse (Fragment) starte ich ein weiteres Fragment:

Code:
public class Uebungen extends Fragment {

	String[] kapitel = new String[] { "Thema1", "Thema2",
			"Thema3" };
	ListView listView;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {

		View view = inflater.inflate(R.layout.u_listview, container, false);
		listView = (ListView) view.findViewById(R.id.lv1);
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(
				this.getActivity(), android.R.layout.simple_list_item_1,
				kapitel);

		listView.setAdapter(adapter);

		listView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				fmAendern((byte) position);
			}
		});

		return view;

	}

	[B]public void fmAendern(byte kapitelnummer) {
		Fragment fragment = new Training(kapitelnummer);

		FragmentManager fm = getFragmentManager();
		fm.beginTransaction().replace(R.id.content_frame, fragment).commit();[/B]
	}

}


Hier noch meine MainActivity:
Code:
public class MainActivity extends Activity {

	private DrawerLayout mDrawerLayout;
	private ListView mDrawerList;
	private ActionBarDrawerToggle mDrawerToggle;

	private CharSequence mDrawerTitle;
	private CharSequence mTitle;
	CustomDrawerAdapter adapter;

	List<DrawerItem> dataList;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

	
		dataList = new ArrayList<DrawerItem>();
		mTitle = mDrawerTitle = getTitle();
		mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
		mDrawerList = (ListView) findViewById(R.id.left_drawer);

		mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
				GravityCompat.START);

	
		dataList.add(new DrawerItem("Startseite", R.drawable.ic_start)); 
		dataList.add(new DrawerItem("Thema1", 
				R.drawable.ic_sinn_und_zweck));
		dataList.add(new DrawerItem("Thema2", R.drawable.ic_einstieg)); 
		

		adapter = new CustomDrawerAdapter(this, R.layout.custom_drawer_item,
				dataList);

		mDrawerList.setAdapter(adapter);

		mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

		getActionBar().setDisplayHomeAsUpEnabled(true);
		getActionBar().setHomeButtonEnabled(true);

		mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
				R.drawable.ic_drawer, R.string.drawer_open,
				R.string.drawer_close) {

			public void onDrawerClosed(View view) {
				getActionBar().setTitle(mTitle);
        invalidateOptionsMenu();
						
			}

			public void onDrawerOpened(View drawerView) {
        getActionBar().setTitle(mDrawerTitle);
				invalidateOptionsMenu(); 
											

			}
		};

		mDrawerLayout.setDrawerListener(mDrawerToggle);
			if (savedInstanceState != null) {
			return;
		} else {
			SelectItem(0);
		}
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	public void SelectItem(int possition) {

		Fragment fragment = null;

		switch (possition) {
		case 0:
			fragment = new FragmentStartSeite();
    	break;
    case 1:
			fragment = new Kapitel1();
    	break;
    case 2:
			fragment = new Uebungen();
      break;
      ...
   	default:
			break;
		}

		FragmentManager frgManager = getFragmentManager();
		frgManager.beginTransaction().replace(R.id.content_frame, fragment)
				.commit();

		mDrawerList.setItemChecked(possition, true);
		setTitle(dataList.get(possition).getItemName()); 
		mDrawerLayout.closeDrawer(mDrawerList);
    }

	
	@Override
	public void setTitle(CharSequence title) {
		mTitle = title.toString().replace("- ", "");
		getActionBar().setTitle(mTitle);
	}

	@Override
	protected void onPostCreate(Bundle savedInstanceState) {
		super.onPostCreate(savedInstanceState);
		mDrawerToggle.syncState();
	}

	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		super.onConfigurationChanged(newConfig);
		mDrawerToggle.onConfigurationChanged(newConfig);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		if (mDrawerToggle.onOptionsItemSelected(item)) {
			return true;
		}

		return false;
	}

	private class DrawerItemClickListener implements
			ListView.OnItemClickListener {
		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {
			SelectItem(position);
        }
	}

	public void oeffneDrawer(View view) {
		mDrawerLayout.openDrawer(mDrawerList);
	}

	@Override
	public void onBackPressed() {
		SelectItem(0);
		}

}
 
Hallo missspelled,

erstmal vielen Dank für den Link. Leider bin ich aber noch nicht auf die Lösung gestoßen. Ich denke aber dass durch

Bundle savedInstanceState im Fragment Training und Uebungen der Fehler entsteht. Hierdurch wird doch der letzte Zustand des Fragments gespeichert, oder? Kann ich das Speichern verhindern und somit den Fehler vermeiden?

Oder liege ich mit meiner Vermutung falsch?

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

Vielen Dank & Gruß

Manuel
 
Hallo,

Danke für den Hinweis...
...hier die fehlende Klasse:

Code:
public class Training extends Fragment {

	public Training(byte kapitelnummer) {
		this.kapitelNummer = kapitelnummer;
	}

	byte kapitelNummer;

	Bildschirmgroesse bildschirmgroesse = new Bildschirmgroesse();
	int groesse = (int) bildschirmgroesse.getZoll();

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {

		View view = inflater.inflate(R.layout.u_uebungen, container, false);


		return view;

	}

	
}
 
make sure class name exists, is public, and has an empty constructor that is public

Was stellst du bei deiner Klasse fest?
 
  • Danke
Reaktionen: Manuel1805
Hallo,

Du meinst ich soll erstmal lesen, dann denken und dann ggfls. schreiben:biggrin:
Sorry für die dumme Frage. Ich habe den Wald vor lauter Bäumen nicht gesehen.

Vielen Dank an alle!

ps. App läuft wie gewünscht
 
Man lernt mit der Zeit :)

Freut mich, dass die App jetzt funktioniert. :)
 

Ähnliche Themen

M
Antworten
2
Aufrufe
865
jogimuc
J
S
  • Sempervivum
Antworten
2
Aufrufe
607
Sempervivum
S
D
  • djsnoopy
Antworten
6
Aufrufe
617
djsnoopy
D
Zurück
Oben Unten