Scrollable Tabs + Swipe, einzelne Activities

  • Guten Tag liebe Commnity,


    ich hab gerade angefangen an einer wichtigen App zu basteln und kurz nach dem Start stehe ich schon vor einem Problem. Ich habe gesehen das vor einiger Zeit ein paar Member das selbe Problem wie ich gehabt haben, aber irgendwie wusste dazu keine eine Lösung.
    Daurm versuch ich es einfach nochmal dieses Problem zu schildern.


    Ich habe ein neues "Android Application Project" in Eclipse erstellt und als Main Activity den"NavigationType" "Scrollable Tabs and Swipe" gewählt.
    Nun möchte ich gern pro Fragment (ich glaube es heisst so) jeweils eine Activity haben/starten.
    Die einzelnen "Tabs" heissen Section1 bis Section4.


    Der Code ist noch total Basic, frisch von Eclipse erstellt. Nur direkt am Anfang vor so einem großen Problem zu stehen schockt mich etwas.


    Falls ihr Screenshots oder SourceCode braucht, bitte einfach sagen, das ist in Null Komma Nix gepostet.


    Es würde mich sehr freuen wenn ihr mir weiter helfen könnte, da dieses Projekt sehr wichtig für meine Berufliche Laufbahn ist.


    Vielen Dank

  • also ich weiss im grunde gar nicht wo ich anfangen soll, soweit ich weiss muss man ...

    • im src ordner eine neue klasse anlegen, diese von activity erben lassen, darin die methode onCreate einfügen und setContentView(R.layout."xml-name") ausführen
    • dann eine xml datei anlegen mit dem namen den wir oben eingetragen haben --> "xml-name"
    • nun die AndroidManifest.xml öffnen und eine Activity erstellen, in dieser Activity den "Activity Name" und den "Action Name" mit dem KLASSENNAMEN versehen.


    in der Main klasse hab ich dann den folgenden Code um eine bestimmte Activity zu starten: FAIL!!! Ich kann irgendwie kein Java Code posten, er wird immer nur einzeilig dargestellt. Was machen ich falsch?


    Java
    protected void onListItemClick(ListView l, View v, int position, long id)	{		super.onListItemClick(l, v, position, id);		String classname = classes[position];											/*wir laden das Objekt das an der Stelle "position" angeklickt											  wird, von unserem "classes"Array in classname.											  in "classes" stehen die namen der Activities die geladen werden											  können. */		try 		{			Class ourClass = Class.forName("com.thenewboston.android.bucky." +classname);											/*hier wird der pfad angegeben in dem die Activities liegen											  + den Activity namen */			Intent ourIntent = new Intent(Menu.this, ourClass);			startActivity(ourIntent);		}		catch (ClassNotFoundException e) 		{			e.printStackTrace();		}


    auf jeden fall habe ich ein try/catch Block in ich folgendes mache..
    Class ourClass = Class.forName("com.thenewboston.android.bucky.KLASSENNAME");


    Intent ourIntent = new Intent(Menu.this, ourClass);
    startActivity(ourIntent);


    so starte ich mit meinem momentanen Wissen eine neue Activity




    in meinem "richtigen" Projekt wird immer eine "fragment_main_dummy.xml" für jede der 4 Sections gestartet, jedes mal die selbe und ich weiss nicht wie ich mein Wissen damit kombinieren kann um jeder Section eine eigene Activity zuzuweisen. Im SourceCode erkenne ich nämlich auch keine unterscheidung der 4 Sections.


    ich würde sehr gerne den Code posten aber irgendwie funktioniert es nicht, wie du oben siehst.

  • Ja, das was du schreibst ist so erst mal richtig


    -> Neue Klasse anlegen -> von Activity ableiten und die StandardMethoden onCreate anpassen -> zb TestActivty2 sehe dann so aus



    Wichtig ist das, der Sprachraum der Klassen auch deinem Projekt entspricht -> also noch mal prüfen ob dein Package wirklich
    com.thenewboston.android.bucky heisst. Sonst findet er natürlich die Klassen / Activities nicht. Try / Catch sollte hier überflüssig sein.


    Zitat

    in meinem "richtigen" Projekt wird immer eine "fragment_main_dummy.xml" für jede der 4 Sections gestartet, jedes mal die selbe und ich weiss nicht wie ich mein Wissen damit kombinieren kann um jeder Section eine eigene Activity zuzuweisen.


    Naja, die Auswahl der Sections erfolgt ja bestimmt über einen Clicklistener, da musst du Dir einfach eine switch case Abfrage reinbauen und je nachdem welche Sektion gewählt wurde, startest du eine andere Aktivity. (du bekommst ja meist einen view übergeben und per view.getId() bekommst du auch die ID raus)


    -> Dennoch muss ich noch mal zu deinem Ausgangspost zurückkommen, weil ich immer noch nicht weiss was du machen willst bzw. warum du Swipe nutzt und dann plötzlich wieder Activities haben möchtest, das verwirrt mich immer noch. Und dann postest du Auszüge eines Listviews.
    Beschreib doch mal in einfachen Worten, was du vorhast, wie die Navigation aussehen soll.


    das hilft Dir ja eventl auch schon etwas besser.


    http://developer.android.com/t…g-navigation/lateral.html

  • ok ich probiers mal im laufen des tages aus, vielen dank.


    also ich möchte eine App basteln die 4 Haupt-Activities hat, und jede dieser Activities hat verschiedene Aufgaben und somit auch "Unter-Activites". Die Haupt Activities möchte ich aus rein optischen Gründen und aus Bedienerfreundlichkeit in einen solchen Swipe-Strip einbauen, meine App "macht einfach mehr her" mit dieser Funktion. (Ich könnte natürlich auch einfach am oberen Rand 4 Buttons machen und mein Haupt Activities darüber aufrufen, aber das finde ich nicht so exclusiv)


    ich habe, um mir einige Fähigkeiten der Android Programmierung anzueignen, einige Video Tutorials angesehen und eine "ÜbungsApp" mithilfe dieser Videos erstellt. Von dieser ist auch dieser package name "com.thenewboston.android.bucky". Ich wollte mit diesem Beispiel etwas verdeutlichen aber der schuss gin wohl nach hinten los :P


    Mit dem Sprachraum der Klassen hab ich eigentlich keine Probleme ;) Ich bin zwar beruflich Anfänger Java Entwickler aber dieses Android Zeugs ist doch noch n ganzes Stück anders.


  • Zitat


    also ich möchte eine App basteln die 4 Haupt-Activities hat, und jede dieser Activities hat verschiedene Aufgaben und somit auch "Unter-Activites". Die Haupt Activities möchte ich aus rein optischen Gründen und aus Bedienerfreundlichkeit in einen solchen Swipe-Strip einbauen, meine App "macht einfach mehr her" mit dieser Funktion. (Ich könnte natürlich auch einfach am oberen Rand 4 Buttons machen und mein Haupt Activities darüber aufrufen, aber das finde ich nicht so exclusiv)


    Hmm, also dann soltest du noch mal deine Navigation überdenken bzw. die Google Design Guides lesen - https://developer.android.com/…ign-navigation/index.html, weil so wie du es planst sind die SWIPE Tabs nicht zu gebrauchen bzw. nicht von Google vorgesehen.


    -> denn die Frage, welche sich im zweiten Schritt stellt, wie willst du den in deinen "Unter-Activities" navigieren ? SWIPE in SWIPE geht zwar ist aber nicht empfohlen oder befinden sich alle "Unter-Activities" auf einer Seite ? (dann reden wir von Fragmenten in Fragmenten).


    Problem 2 - das Swipen von Activities gibt es so als Funktion nicht, man kann das "Nachbauen" (einfach mal bei Stackoverflow suchen), ist aber nicht wirklich praktikabel d.h. du wirst so oder so um Fragmente nicht drum herum kommen.

  • wenn ich die App starte wird eine MainActivity geladen, diese ist ja schon die 1. von meinen 4 Haupt/Ober-Activities. Diese werden mit Swipe ausgewählt. Die restlichen Activities die ich brauche werden mit Buttons o.ä. aufgrufen.


    Ich möchte also nur in der obersten Ebene diese Swipe Funktion nutzen.


    hab mal eine übersicht skizziert
    [Blockierte Grafik: http://my.funpic.de/show-photo/799209-PIC.png]

  • Ok, danke für die Skizze.


    Wie gesagt Swipe und Activities ist schlecht, aber nun stellt sich die Situation so für mich da.


    -> MainActivity inkl FragmentStatePagerAdapter bzw. PagerAdapter wie du magst -> in dem Adapter werden die 4 Fragmente, welche deine "Haupt"-Aktionen repräsentieren, geladen und aus den Fragmenten werden dann die Activities gestartet.



    Ok da du den Eclipse Beispiel Code verwendet hast musst du Dir nur 4 Fragmente schreiben Main1- Main4



    Diesen Teil am besten in eine eigene Datei auslagern und anpassen. (Layout ect PP.)


    Tja und in deiner Mainactivity bzw. im FragmentAdapter musst du nur das getItemn anpassen.


  • hey vielen dank erst mal...hier mal mein Code der MainActivity..alles an dem "//sascha" dahinter steht hab ich hinzugefügt um irgendwas auszuprobieren.


    Java
    package com.example.carmanager;import java.util.Locale;import android.app.Activity;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.FragmentManager;import android.support.v4.app.FragmentPagerAdapter;import android.support.v4.view.ViewPager;import android.view.LayoutInflater;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.Button;import android.widget.TextView;public class MainActivity extends FragmentActivity {	/**	 * The {@link android.support.v4.view.PagerAdapter} that will provide	 * fragments for each of the sections. We use a	 * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which	 * will keep every loaded fragment in memory. If this becomes too memory	 * intensive, it may be best to switch to a	 * {@link android.support.v4.app.FragmentStatePagerAdapter}.	 */	SectionsPagerAdapter mSectionsPagerAdapter;	/**	 * The {@link ViewPager} that will host the section contents.	 */	ViewPager mViewPager;		Button btnFuel, btnKost, btnStat, btnCal;		@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);		// Create the adapter that will return a fragment for each of the three		// primary sections of the app.		mSectionsPagerAdapter = new SectionsPagerAdapter(				getSupportFragmentManager());		// Set up the ViewPager with the sections adapter.		mViewPager = (ViewPager) findViewById(R.id.pager);		/*mViewPager.setOnPageChangeListener(					//sascha	        	new ViewPager.SimpleOnPageChangeListener() {	            	@Override	            	public void onPageSelected(int position) {	                	// When swiping between pages, select the	                	// corresponding tab.	                	getActionBar().setSelectedNavigationItem(position);	            	}	        	});  		*/		mViewPager.setAdapter(mSectionsPagerAdapter);				/*		btnFuel = (Button)findViewById(R.id.buttonFuel);		//sascha		btnKost = (Button)findViewById(R.id.buttonKost);		btnStat = (Button)findViewById(R.id.buttonStat);		btnCal = (Button)findViewById(R.id.buttonCal);		*/					}	@Override	public boolean onCreateOptionsMenu(Menu menu) {		// Inflate the menu; this adds items to the action bar if it is present.		getMenuInflater().inflate(R.menu.main, menu);		return true;	}	/**	 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to	 * one of the sections/tabs/pages.	 */	public class SectionsPagerAdapter extends FragmentPagerAdapter {		public SectionsPagerAdapter(FragmentManager fm) {			super(fm);		}		@Override		public Fragment getItem(int position) {			// getItem is called to instantiate the fragment for the given page.			// Return a DummySectionFragment (defined as a static inner class			// below) with the page number as its lone argument.			Fragment fragment = new DummySectionFragment();			Bundle args = new Bundle();			args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);			fragment.setArguments(args);			return fragment;		}		@Override		public int getCount() {			//Seiten des Strip			// Show 4 total pages.			return 4;		}		@Override		public CharSequence getPageTitle(int position) {			Locale l = Locale.getDefault();			switch (position) {			case 0:				return getString(R.string.title_section1).toUpperCase(l);			case 1:				return getString(R.string.title_section2).toUpperCase(l);			case 2:				return getString(R.string.title_section3).toUpperCase(l);			case 3:				return getString(R.string.title_section4).toUpperCase(l);			}			return null;		}	}	/**	 * A dummy fragment representing a section of the app, but that simply	 * displays dummy text.	 */	public static class DummySectionFragment extends Fragment {		/**		 * The fragment argument representing the section number for this		 * fragment.		 */		public static final String ARG_SECTION_NUMBER = "section_number";		public DummySectionFragment() {		}		@Override		public View onCreateView(LayoutInflater inflater, ViewGroup container,				Bundle savedInstanceState) {			View rootView = inflater.inflate(R.layout.fragment_main_dummy,					container, false);			TextView dummyTextView = (TextView) rootView					.findViewById(R.id.buttonFuel);			//dummyTextView.setText(Integer.toString(getArguments().getInt(			//		ARG_SECTION_NUMBER)));			dummyTextView.setText("eigener String");						return rootView;		}	}}



    also ich kann keine activities anstatt Fragmente machen, ok.
    Aber ich kann die 4 fragmente wie activities behandeln, und sozusagen für jedes Fragment eine ...xml schreiben und diese dann laden ?

  • Alter, BÄÄÄM! Es funktioniert !!
    Du bist der wahnsinn ! Allerding musste ich

    Java
    public static class MainFragment1 extends Fragment


    innerhalb meiner MainActivity machen, ausgelagert in einzelne .java Dateien hat er es irgendwie nicht geschluckt. Naja so gehts hoffentlich auch.

  • Zitat

    Aber ich kann die 4 fragmente wie activities behandeln, und sozusagen für jedes Fragment eine ...xml schreiben und diese dann laden ?


    Ja auf jeden Fall,
    Fragmente kleben zwar ein einer Activity, sind aber für sich eigenständige Einheiten, das erlaubt einem jede Menge Freiheiten. So kannst du Programminhalte besser kapseln und an anderer Stelle wiederverwenden.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!