Probleme einen Navigation Drawer zu konfigurieren

  • Antworten:14
Michael Eidel
  • Forum-Beiträge: 17

16.10.2014, 07:12:17 via App

Hallo, erstmal ein dickes danke an alle die mir als Neuling bisher so toll mit meinen kleinen Problemen geholfen haben. Ich möchte gerne die NavigationDrawer Funktion einbauen. Mit der offiziellen Anleitung auf englisch komme ich jedoch nicht ganz klar, bei einer Deutschen die ich gefunden habe bekomme ich nur Fehler, hat jemand eine gute auf deutsch oder kann mir irgendwie anders helfen? Hab mir zwar ein Test Projekt runtergeladen aber ich bekomme das einfach nicht zum Laufen... :( mir wurde es ja reichen wenn es auf einem layout läuft dann kann ich es für die anderen so übernehmen.

LG Michael

— geändert am 18.10.2014, 15:20:42

Antworten
Andy N.
  • Forum-Beiträge: 22.375

16.10.2014, 07:21:36 via Website

HalloMichael

Bitte beachte, dass Threads mit nicht aussagekräftigem Titel bei uns üblicherweise den Regeln entsprechend entfernt werden. Ich bitte dich daher, deinen Threadtitel bei deinem nächsten Besuch, spätestens aber innerhalb der nächsten 24 Stunden noch etwas aussagekräftiger zu gestalten (Hierfür einfach unter deinem ersten Beitrag auf 'bearbeiten' klicken, dann kannst du oben noch mal den Titel anpassen)

Danke :)

Viele Grüße,
Andy


OnePlus 3 (Resurrection Remix 5.8.2)
LG G Watch

Regeln | unsere Mods & Admins

Antworten
Michael Eidel
  • Forum-Beiträge: 17

16.10.2014, 07:23:28 via App

Sorry, hoffe es passt so. :)

Antworten
Michael Eidel
  • Forum-Beiträge: 17

17.10.2014, 11:53:57 via App

Huhu :)

Habe gestern wieder 3 Stunden versucht das Menü einzubauen. das Ergebniss -->Ich musste alles rückgängig machen da am Ende gar nichts mehr funktionierte... Hilfe wäre echt super da ich seid Tagen damit nicht weiter komme. :(

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

17.10.2014, 12:34:30 via Website

Hallo Michael,
was ist denn dabei das Problem, wenn du es nicht beschreibst, dann können wir dir auch nicht helfen.

Hier noch ein Tutorial für den Navigation Drawer: http://developer.android.com/training/implementing-navigation/nav-drawer.html

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Michael Eidel
  • Forum-Beiträge: 17

18.10.2014, 15:18:01 via Website

public class Start extends Activity {
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;

private CharSequence mDrawerTitle;
private CharSequence mTitle;
private String[] mPlanetTitles;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_start);


mTitle = mDrawerTitle = getTitle();
mPlanetTitles = getResources().getStringArray(R.array.planets_array);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);


mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
// set up the drawer's list view with items and click listener

mDrawerList.setAdapter(new ArrayAdapter<String>(this,
R.layout.drawer_list_item, mPlanetTitles));
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) {
    selectItem(0);
    }
    }

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.start, menu);
return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
    menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
    return super.onPrepareOptionsMenu(menu);
    }

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    if (mDrawerToggle.onOptionsItemSelected(item)) {
    return true;
    }
    // Handle action buttons

    switch(item.getItemId()) {

        case R.id.action_befehle:
            Intent intent = new Intent(this,Befehle.class);
            startActivity(intent);
            return true;
        case R.id.action_regeln:
            intent = new Intent(this, Regeln.class);
            startActivity(intent);
            return true;
        case R.id.action_anleitungen:
            intent = new Intent(this, Anleitungen.class);
            startActivity(intent);
            return true;
        case R.id.action_forum:
            intent = new Intent(this, Forum.class);
            startActivity(intent);
            return true;
        case R.id.action_strafen:
            intent = new Intent(this, Strafe.class);
            startActivity(intent);
            return true;
        default:
            return 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) {

    android.app.Fragment fragment = new PlanetFragment();
    Bundle args = new Bundle();
    args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
    fragment.setArguments(args);

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

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

@Override
public void setTitle(CharSequence title) {
    mTitle = title;
    getActionBar().setTitle(mTitle);
}

/**
 * When using the ActionBarDrawerToggle, you must call it during
 * onPostCreate() and onConfigurationChanged()...
 */

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

    mDrawerToggle.syncState();
}

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

    mDrawerToggle.onConfigurationChanged(newConfig);
}

/**
* Fragment that appears in the "content_frame", shows a planet
*/
public static class PlanetFragment extends android.app.Fragment {
public static final String ARG_PLANET_NUMBER = "planet_number";

public PlanetFragment() {

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_planet, container, false);
    int i = getArguments().getInt(ARG_PLANET_NUMBER);
    String planet = getResources().getStringArray(R.array.planets_array)[i];

    int imageId = getResources().getIdentifier(planet.toLowerCase(Locale.getDefault()),
            "drawable", getActivity().getPackageName());
    ((ImageView) rootView.findViewById(R.id.image)).setImageResource(imageId);
    getActivity().setTitle(planet);
    return rootView;
}

}
}

So, der Drawer läuft zwar aber den code habe ich nur eingefügt und ein wenig geändert soweit mein Verständniss reichte.... learning by doing...
Trozdem brauch ich bitte Hilfe
Meine Fragen:
1. Per
<string-array name="planets_array">
<item>Befehle</item>
<item>Regeln</item>
<item>Anleitungen</item>
<item>Strafen</item>
<item>Froum</item>
<item>Chat</item>
<item>Beenden</item>
</string-array>
Bekomme ich zwar das Menü seitlich angezeigt, aber wenn ich draufklicke passiert nichts da ganz unten die sache mit den Planeten drin ist.
Was muss ich jetzt rauslöschen bzw ändern das ich per klick auf ein item eine andere activity lade?

  1. Kann ich das irgenwo einstellen das der Navigation Drawer dann schon "ausgeklappt" angezeigt wird bis man etwas auswählt?

Danke schon mal fürs helfen, hoffe ich versteh Java bald soweit das ich euch nicht wegen solchen kleinigkeiten belästigen muss. ;)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

18.10.2014, 15:41:36 via App

Also der eigentliche Activity wechsel muss in der Methode selectItem ausgeführt werden. Dort muss dann halt zwischen den Positionen unterschieden werden und je nach pos eine andere Activity gestartet werden.

Leider ist mir ein Automatisches öffnen des NavigstionDrawers nicht bekannt, muss denn dass unbedingt sein? Der user soll ja selber navigieren können.
Falls du das doch brauchst such mal im inet danach.

LG Pascal //It's not a bug, it's a feature. :) ;)

Michael Eidel

Antworten
Michael Eidel
  • Forum-Beiträge: 17

18.10.2014, 23:39:42 via Website

Zwar danke für die Info, jedoch funktioniert es nicht mit den Aktivitys :'(
Seid 16 Uhr am rumbasteln, alles was ich mache führt zum absturz der App

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

18.10.2014, 23:48:21 via App

Was ist denn der Fehler.Einfach posten.

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Michael Eidel

Antworten
Michael Eidel
  • Forum-Beiträge: 17

19.10.2014, 00:06:00 via Website

Nur mit einem Switch aber mit dem case1 ging der erste Menüpunkt anzusteuern.

private void selectItem(int position) {
// update the main content by replacing fragments
android.app.Fragment fragment = new PlanetFragment();
Bundle args = new Bundle();
args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
fragment.setArguments(args);

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

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

    switch(position) {
        case 0:
            startActivity(new Intent(this, Start.class));
    }

Dann dachte ich das ich so das komplette Menü machen kann

private void selectItem(int position) {
// update the main content by replacing fragments
android.app.Fragment fragment = new PlanetFragment();
Bundle args = new Bundle();
args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
fragment.setArguments(args);

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

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

    switch(position) {
        case 0:
            startActivity(new Intent(this, Start.class));
    }
    switch(position) {
        case 1:
            startActivity(new Intent(this, Befehle.class));
            }
    switch(position) {
        case 2:
            startActivity(new Intent(this, Regeln.class));
            }
    switch(position) {
        case 3:
            startActivity(new Intent(this, Anleitungen.class));
            }
    switch(position) {
        case 4:
            startActivity(new Intent(this, Strafe.class));
            }
    switch(position) {
        case 5:
            startActivity(new Intent(this, Forum.class));
            }
    switch(position) {
        case 6:
            startActivity(new Intent(this, Chat.class));
            }
    switch(position) {
        case 7:
            startActivity(new Intent(this, Start.class));
            }
    switch(position) {
        case 8:
                    startActivity(new Intent(this, Start.class));
            }

}

Dann hängt sich die app auf... ;(
10-19 00:05:24.578 28631-28631/org.emike.elderapp E/ActivityThread﹕ Performing stop of activity that is not resumed: {org.emike.elderapp/org.emike.elderapp.Start}
java.lang.RuntimeException: Performing stop of activity that is not resumed: {org.emike.elderapp/org.emike.elderapp.Start}
at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3709)
at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3796)
at android.app.ActivityThread.access$1100(ActivityThread.java:156)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1382)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5872)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674)
at dalvik.system.NativeStart.main(Native Method)

— geändert am 19.10.2014, 11:37:23 durch Moderator

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

19.10.2014, 11:38:51 via Website

Hallo Maichael,

bitte schau dir nochmal die Grundlagen an, denn so schreibt man keine switch anweisung.
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

LG Pascal

PS: Ich habe mal deinen etwas zu langen Fehler(ausgabe) gekürzt.

LG Pascal //It's not a bug, it's a feature. :) ;)

Michael Eidel

Antworten
Michael Eidel
  • Forum-Beiträge: 17

19.10.2014, 11:51:13 via Website

Super dein Link hat mir schon geholfen :)

switch(position) {

        case 1:
            startActivity(new Intent(this, Befehle.class));
            break;
        case 2:
            startActivity(new Intent(this, Regeln.class));
            break;
        case 3:
            startActivity(new Intent(this, Anleitungen.class));
            break;
        case 4:
            startActivity(new Intent(this, Strafe.class));
            break;
        case 5:
            startActivity(new Intent(this, Forum.class));
            break;
        case 6:
            startActivity(new Intent(this, Chat.class));
            break;
        case 7:
            startActivity(new Intent(this, Start.class));
            break;
        case 8:
             startActivity(new Intent(this, Start.class));
            break;
            }

}

Eine weitere Frage, ich habe jetzt den NavigationDrawer in einer Aktivity, muss ich jetzt für jede Atktivity den Code übernehmen oder gibt es einen weg den Drawer auch anders zu laden?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

19.10.2014, 12:00:20 via Website

Das ist eine schwierige Frage,
ich habe es genau so gemacht, wie du es willst, leider ist mein Code seht Dynamisch aufgebaut, sodass er nir nicht viel bringen würde, deswegen versuche ich es dir zu erklären.
Also nirmalerweise sind NavigationDrawer dafür ausgelegt, dass sie in eienr Activity geladen werden und dann immer erhalten bleiben.
Die dienen nur dazu, fragments zu ändern,bezw. auszutauschen.
Dieses Prinzip ist eigentlich einfacher, als in jede Activity den NavDrawer einzubauen.
Wenn du das trotzdem machen willst, würde ich dir eine eigenen NavigationDrawer Klasse empfehlen.
So ist der Code schön strukturiert in seiner eigenen Klasse drinne und muss dann aus eienr Activity nur noch aufgerufen weren, z.b. mit navDrwaer.show();
Die Methoden daür musst du selber schreiben, dann ist aber die NavDrawer Klasse für alle Acitivtys gleich und du kannst sie überall verwenden.

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Michael Eidel

Antworten
Michael Eidel
  • Forum-Beiträge: 17

23.10.2014, 21:42:51 via App

noch ne Frage, gibt es eine einfache Möglichkeit in meinem Navigation Menü ein submenü einzubinden?

Antworten