Fragment Inhalt wechseln

J

JonasW

Gast
Hallo zunächst mein Stand: Ich entwickle eine App, in der man bei Start auf die "Startseite" kommt und man durch wischen oder Druck auf den Drawerbutton in der Action Bar in die Navigation Bar kommt. Nun möchte ich, dass wenn ich auf ein Item in der Navigation Bar tippe, eine ListView mit verschiedenen Items angezeigt wird, welches für dieses Item vorgesehen ist. Das gleiche gilt auch für die anderen Items.
Noch dazu möchte ich, dass wenn man auf ein Item in dem FRAGMENT, und nicht in der Navigation Bar, tippt, man eine Reihe von TextViews zu Gesicht bekommt. Und wenn man in dieser Ansicht ist soll bei der ActionBar statt des Drawericons ein Backbutton existieren der wiederum zur vorigen Ansicht wechseln soll.

Ich hoffe ihr könnt meine Probleme verstehen. Ich bin noch relativ neu in der Programmierung.

Hier mein Code:

Code:
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.res.Configuration;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;


@SuppressLint("NewApi")
public class MainActivity extends Activity {
	private String[] mTitles;
    private ListView mDrawerList;
    private CharSequence mTitle;
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;
    private CharSequence mDrawerTitle;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	
		mTitles = getResources().getStringArray(R.array.titles_array);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.left_drawer);

        // Set the adapter for the list view
        mDrawerList.setAdapter(new ArrayAdapter<String>(this,
                R.layout.drawer_list_item, mTitles));
        // Set the list's click listener
        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
        mTitle = mDrawerTitle = getTitle();
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {

            /** Called when a drawer has settled in a completely closed state. */
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }

            /** Called when a drawer has settled in a completely open state. */
            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
        };

        // Set the drawer toggle as the DrawerListener
        mDrawerLayout.setDrawerListener(mDrawerToggle);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerToggle = new ActionBarDrawerToggle(
                this,                  /* host Activity */
                mDrawerLayout,         /* DrawerLayout object */
                R.drawable.ic_drawer,  /* nav drawer icon to replace 'Up' caret */
                R.string.drawer_open,  /* "open drawer" description */
                R.string.drawer_close  /* "close drawer" description */
                ) {

            /** Called when a drawer has settled in a completely closed state. */
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
            }

            /** Called when a drawer has settled in a completely open state. */
            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
            }
        };
	
     // Set the drawer toggle as the DrawerListener
        mDrawerLayout.setDrawerListener(mDrawerToggle);

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

	private class DrawerItemClickListener implements ListView.OnItemClickListener {
	    @Override
	    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
	        selectItem(position);
	    
	    
	    
	    
	    }
	}
	/** Swaps fragments in the main content view */
	private void selectItem(int position) {
	    // Create a new fragment and specify the planet to show based on position
	    Fragment fragment = new TitleFragment();
	    Bundle args = new Bundle();
	    args.putInt(TitleFragment.ARG_TITLE_NUMBER, position);
	    fragment.setArguments(args);

	    // Insert the fragment by replacing any existing fragment
	    FragmentManager fragmentManager = getFragmentManager();
	    fragmentManager.beginTransaction()
	                   .replace(R.id.content_frame, fragment)
	                   .commit();

	    // Highlight the selected item, update the title, and close the drawer
	    mDrawerList.setItemChecked(position, true);
	    setTitle(mTitles[position]);
	   mDrawerLayout.closeDrawer(mDrawerList);
	}

	@Override
	public void setTitle(CharSequence title) {
	    mTitle = title;
	    getActionBar().setTitle(mTitle);
	}
	
	
	@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;
	}

	public static class TitleFragment extends Fragment {
        public static final String ARG_TITLE_NUMBER = "title_number";

        public TitleFragment() {
            // Empty constructor required for fragment subclasses
        }
	}

	@Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Pass the event to ActionBarDrawerToggle, if it returns
        // true, then it has handled the app icon touch event
        if (mDrawerToggle.onOptionsItemSelected(item)) {
          return true;
        }
        // Handle your other action bar items...

        return super.onOptionsItemSelected(item);
    }





}
 
Hmm wo ist die Frage bzw. was konkret ist dein Problem ???

Alles was du aufzählst sind Standardpattern bei der Navigation. Kannst du alles hier Navigation with Back and Up | Android Developers
und folgende Seiten nachlesen.

Nun möchte ich, dass wenn ich auf ein Item in der Navigation Bar tippe, eine ListView mit verschiedenen Items angezeigt wird, welches für dieses Item vorgesehen ist. Das gleiche gilt auch für die anderen Items
.

-> in deinem SelectItem einfach die gewünschten Fragmente erzeugen und ersetzen. Das ist ja der Beispielcode aus dem NavDrawerexample (das Planetenbeispiel) und Du musst deine SelectItem einfach etwas erweitern - zb.

Code:
private void selectItem(int position) {

 switch (position){

 case 1:  // Neues listfragment

 ... hier dein Code zum erzeugen ...
  
  break;

case 2: // Neues Webfragment

 ... hier dein Code zum erzeugen ...

  break;

 case 3: // Neues wasweissichfragment

  ... hier dein Code zum erzeugen ...

  break;


 // dann weiter im Text -> kreiertes Fragment per commit ersetzen
Noch dazu möchte ich, dass wenn man auf ein Item in dem FRAGMENT, und nicht in der Navigation Bar, tippt, man eine Reihe von TextViews zu Gesicht bekommt.
Ein Fragment ist ja im Grunde wieder ein eigener Logikbaustein. Also baust Du die von Dir gewpnschte Funktionalität einfach in ein Fragment ein.

-> ganz einfach wie gehabt ClickListener & co

Und wenn man in dieser Ansicht ist soll bei der ActionBar statt des Drawericons ein Backbutton existieren der wiederum zur vorigen Ansicht wechseln soll.
Providing Up Navigation | Android Developers
 
Okay wie gesagt ich bin noch neu in der Programmierung aber vielleicht kannst du mir noch weiter helfen:

Ich möchte in einem Fragment über 100 einzelne TextViews (die man auch antippen kann) haben, ohne hunderte von einzelnen TextViews in den Code zu schreiben. Diese TextViews sollen mit einer kleinen Linie, also Divider, jeweils oben und unten verseht sein, damit man eine Grenze hat

Vielen Dank schonmal
 
ListView mit Custom Theme? (ich hab sowas schon gemacht, das sieht dann aus wie lauter einzelne Kästchen?)
 
Kannst du das vielleicht näher erklären?
 
Deine 100 einzelnen Textviews sind vermutlich eh eine Liste an bspw. Strings?

Und jetzt ganz einfach nochmal das von eben: die Elemente packst du in eine ListView und das Zeilenlayout machst du ein eigenes (Rahmen, Divider, etc.). Wenn du mit "im Detail" Code meinst, nein, den kopier ich jetzt nicht raus, den findest du auch selbst überall im Netz...
Android ListView - Tutorial
 
Hi ich habe etwas rumprobiert und versucht nach dem Beispiel des Developer Guides es schreiben. Doch bekomme ich immer eine Fehlermeldung:
Code:
01-07 13:53:51.422: E/AndroidRuntime(6657): FATAL EXCEPTION: main
01-07 13:53:51.422: E/AndroidRuntime(6657): Process: com.example.trink_spiele, PID: 6657
01-07 13:53:51.422: E/AndroidRuntime(6657): java.lang.NullPointerException
01-07 13:53:51.422: E/AndroidRuntime(6657): 	at com.example.trink_spiele.MainActivity$Fragment1.onCreateView(MainActivity.java:207)
01-07 13:53:51.422: E/AndroidRuntime(6657): 	at android.app.Fragment.performCreateView(Fragment.java:1700)
01-07 13:53:51.422: E/AndroidRuntime(6657): 	at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
01-07 13:53:51.422: E/AndroidRuntime(6657): 	at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
01-07 13:53:51.422: E/AndroidRuntime(6657): 	at android.app.BackStackRecord.run(BackStackRecord.java:684)
01-07 13:53:51.422: E/AndroidRuntime(6657): 	at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
01-07 13:53:51.422: E/AndroidRuntime(6657): 	at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
01-07 13:53:51.422: E/AndroidRuntime(6657): 	at android.os.Handler.handleCallback(Handler.java:733)
01-07 13:53:51.422: E/AndroidRuntime(6657): 	at android.os.Handler.dispatchMessage(Handler.java:95)
01-07 13:53:51.422: E/AndroidRuntime(6657): 	at android.os.Looper.loop(Looper.java:136)
01-07 13:53:51.422: E/AndroidRuntime(6657): 	at android.app.ActivityThread.main(ActivityThread.java:5017)
01-07 13:53:51.422: E/AndroidRuntime(6657): 	at java.lang.reflect.Method.invokeNative(Native Method)
01-07 13:53:51.422: E/AndroidRuntime(6657): 	at java.lang.reflect.Method.invoke(Method.java:515)
01-07 13:53:51.422: E/AndroidRuntime(6657): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-07 13:53:51.422: E/AndroidRuntime(6657): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-07 13:53:51.422: E/AndroidRuntime(6657): 	at dalvik.system.NativeStart.main(Native Method)

Und hier mein Code:
Code:
package com.example.trink_spiele;

import android.os.Bundle;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.res.Configuration;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {
	private String[] mTitles;
    private ListView mDrawerList;
    private CharSequence mTitle;
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;
    private CharSequence mDrawerTitle;
    String title = "Trink-Spiele";
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		mTitles = getResources().getStringArray(R.array.titles_array);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.left_drawer);
       
        mDrawerList.setAdapter(new ArrayAdapter<String>(this,
                R.layout.drawer_list_item, mTitles));
        
        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
        mTitle = mDrawerTitle = getTitle();
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        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);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        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);
            }

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

        mDrawerLayout.setDrawerListener(mDrawerToggle);

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

	private class DrawerItemClickListener implements ListView.OnItemClickListener {
	    @Override
	    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
	        selectItem(position);
	      
	    }	              
 }
	   
	private void selectItem(int position) {
		
	    Fragment fragment = new Fragment1();
	    Bundle args = new Bundle();
	    args.putInt(Fragment1.ARG_TITLES_NUMBER, position);
	    fragment.setArguments(args);

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

	    mDrawerList.setItemChecked(position, true);
	    setTitle(mTitles[position]);
	    mDrawerLayout.closeDrawer(mDrawerList);
	}

	@Override
	public void setTitle(CharSequence title) {
	    mTitle = title;
	    getActionBar().setTitle(mTitle);
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@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 super.onOptionsItemSelected(item);
    }

    //////////////////////////////////////////////////////////////
    
    public static class Fragment1 extends Fragment {
    
    	private String [] mAllTitles;
        private ListView mAllTitlesList;
    	public static final String ARG_TITLES_NUMBER = "titles_number";
    
    	public Fragment1() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment0, container, false);
        
        mAllTitles = getResources().getStringArray(R.array.all_titles_array);
        mAllTitlesList = (ListView) getView().findViewById(R.id.list);

        mAllTitlesList.setAdapter(new ArrayAdapter<String>(getActivity(),
                R.layout.drawer_list_item, mAllTitles));
        return rootView;
    }
}


}
 
Tut mir leid :biggrin:
Ich hab mal meine App debuggen lassen und sehe meinen Fehler:
Code:
 mAllTitlesList = (ListView) getView().findViewById(R.id.list);
Bei den Variablen sah ich dann, dass die ListView(mAllTitlesList) null ist. Aber ich weiß ehrlich gesagt nicht weiter und finde meinen Fehler nicht.

Hoffe jemand kann mir helfen
 
Versuchs mit:

PHP:
mAllTitlesList = (ListView) rootView.findViewById(R.id.list);

Ansonsten check mal die ID, ob die korrekt ist.
 
Das hatte ich auch versucht, aber dann bekomm ich diese Fehler:
Code:
Multiple markers at this line
	- The method rootView() is undefined for the type MainActivity.Fragment1
	- list cannot be resolved or is not a field
	- The method view() is undefined for the type MainActivity.Fragment1
 
Dann überprüf mal den zweiten Hinweis bzgl. ID ;)
Was steht im Layoutfile: fragment0.xml ? Wie lautet die ID der ListView?
 
JonasW schrieb:
Das hatte ich auch versucht, aber dann bekomm ich diese Fehler:
Code:
    - The method rootView() is undefined for the type MainActivity.Fragment1

Hast du den Code so umgesetzt, wie ich gesagt habe?

rootView ist keine Funktion, da gehört kein () dran... also NUR rootView.findViewblablabla und nicht rootView().blabla

Ansonsten zeig und deine XML vom Layout
 
Da kann ich mir nur selber den Kopf schütteln :lol:
Mit
Code:
android:id="@+id/list"
kann er nichts anfangen: :/
 

Ähnliche Themen

M
Antworten
2
Aufrufe
865
jogimuc
J
Tiefkuehlpizza
Antworten
2
Aufrufe
956
Tiefkuehlpizza
Tiefkuehlpizza
B
Antworten
1
Aufrufe
958
jogimuc
J
Zurück
Oben Unten