Navigation Drawer mit ActionBarDrawerToggle aufrufen/anzeigen

  • Antworten:7
Gelöschter Account
  • Forum-Beiträge: 4

15.10.2016, 13:39:34 via Website

Hallo,

Ich bin neu hier im Forum und bin ebenfalls neu in der Android App Development World.

Ich habe folgendes Problem, bei dem ich eure Hilfe benötige:
Ich habe ein Navigation Drawer erstellt. Dieser kann durch das wischen vom linken Rand des Screens eingeblendet werden.
Ich habe nach einen Tutorial in der Toolbar eine ActtionBar mit einem DrawerToggle erstellt.

Laut dem Tutorial, müsste der N.D. beim drücken des D.T. eingeblendet werden, aber es geschiet nichts.

Wie kann ich es einrichten, dass beim betätigen des D.T. (Oben links in der Ecke) der N.T. eingeblendet wird?

Danke im Voraus!


Hier Zwei Screenshots:
image
image


Und hier die Codes:

MainActivity.java
package [...].app1;

import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Configuration;
import android.net.Uri;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;

import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;

public class MainActivity extends AppCompatActivity {

Toolbar toolbar;
private DrawerLayout drawerLayout;
private ActionBarDrawerToggle drawerToggle;
private String mActivityTitle;

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

    toolbar = (Toolbar) findViewById(R.id.toolbar1);
    setSupportActionBar(toolbar);

    // HomeButton in the top left hand corner
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);

    drawerLayout = (DrawerLayout) findViewById(R.id.drawerlayoutgesamt);
    drawerToggle = new ActionBarDrawerToggle(this,drawerLayout,R.string.drawer_open,R.string.drawer_close);

}

private void setupDrawer()
{
    drawerToggle.setDrawerIndicatorEnabled(true);
    drawerLayout.setDrawerListener(drawerToggle);
}

/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView)
{

}

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

}

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

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

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

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

}


activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>

xmlns:tools="[...]"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="[...]"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
tools:context="[...].app1.MainActivity"
android:nestedScrollingEnabled="false"
android:id="@+id/relativelayout_for_fragment">

<android.support.v7.widget.Toolbar
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/toolbar1"
    android:layout_margin="0dp"
    android:background="@color/colorPrimary"
    app:titleTextColor="@color/colorWhite">
</android.support.v7.widget.Toolbar>

<android.support.v4.widget.DrawerLayout
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    android:id="@+id/drawerlayoutgesamt">

    <RelativeLayout
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:id="@+id/activitylayout">

        <TextView
            android:text="Activity Layout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_centerHorizontal="true"
            />

    </RelativeLayout>

    <RelativeLayout
        android:layout_height="fill_parent"
        android:layout_width="340dp"
        android:background="@color/colorWhite"
        android:id="@+id/drawerlayoutsingle"
        android:layout_gravity="start">

        <TextView
            android:text="Drawer Layout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_centerHorizontal="true"
            />

    </RelativeLayout>

</android.support.v4.widget.DrawerLayout>

— geändert am 29.01.2017, 17:32:43

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

15.10.2016, 13:56:00 via Website

Hallo Tomas,
Herzlich wilkommen hier im Forum :)



Du musst noch darauf "hören" ob auf das IndicatiorIcon geklickt wurde:
http://stackoverflow.com/a/30833113

Aber:
support.v4.DrawerToggle etc. und das ganze ActionBar gedöns sind deprecated, spricht veraltet. Seit MaterialDesign in Android 5.0 benutzt man eine ToolBar und ein NavigationMenu (oder so ähnlich). So würde ich es auch machen, dann hast du die Probleme nicht mehr und bist Technisch auf dem neusten Stand.
Falls dir das selber machen zu komplex ist, kannst du dir auch mal das anschauen/benutzen:
https://github.com/PlPt/MaterialAdapter

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

swa00

Antworten
Gelöschter Account
  • Forum-Beiträge: 4

16.10.2016, 13:58:39 via Website

Okay danke.

Ich habe den Code jetzt mal etwas umgeschrieben. Nur leider passiert immer noch nichts beim betätigen des Toggles.
Habe ich etwas vergessen? Was mache ich falsch?

Hier mein jetziger Code:

package [...].app1;

import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Configuration;
import android.net.Uri;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;

import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;

public class MainActivity extends AppCompatActivity {

Toolbar toolbar;
DrawerLayout drawerLayoutgesamt;
ActionBarDrawerToggle drawerToggle;

private ListView drawerList;
private ArrayAdapter<String> mAdapter;

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

    toolbar = (Toolbar) findViewById(R.id.toolbar1);
    setSupportActionBar(toolbar);

    drawerLayoutgesamt = (DrawerLayout) findViewById(R.id.drawerLayoutGesamt);
    drawerToggle = new ActionBarDrawerToggle(MainActivity.this,drawerLayoutgesamt,R.string.drawer_open, R.string.drawer_close);
    drawerLayoutgesamt.setDrawerListener(drawerToggle);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    drawerToggle.syncState();
}

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.action_settings) {
        return true;
    }

    if (drawerToggle.onOptionsItemSelected(item)) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

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

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

private void addDrawerItems() {
    String[] osArray = {"Feature #1", "Feature #2", "Feature #3", "Feature #4", "Feature #5"};
    mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, osArray);
    drawerList.setAdapter(mAdapter);
}

}

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

16.10.2016, 14:11:33 via Website

Wenn du die Toolbar benutzt, dann musst du auch die passende Lib für den DrawerToggle benutzen.
Schmeiß mal die support v4 rus und importiere die v7.

Dann muss der DawerToggle Instanzierung so aussehen:
ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, Toolbar toolbar, int openDrawerContentDescRes, int closeDrawerContentDescRes)

Da übergibtst du die toolbar als Parameter.
Was anderes weiß icj auch nicht, vergleich das noch mal mit meinem Code auf GitHub, vlt. eine Zeile vergessen?

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 4

16.10.2016, 15:24:28 via Website

Meinst du

 import android.support.v4.widget.DrawerLayout;

durch

 import android.support.v7.app.ActionBarDrawerToggle;

ersetzen?

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

16.10.2016, 17:04:30 via Website

Genau, und dann musst du deinen Code darauf anpassen

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 4

17.10.2016, 16:59:00 via Website

Ich habe jetzt diese Imports drin:

import android.support.v7.widget.ActionBarOverlayLayout;
import android.support.v7.app.ActionBarDrawerToggle;

Sind diese Deklarationen richtig?

    ActionBarOverlayLayout drawerLayoutgesamt;
    ActionBarDrawerToggle drawerToggle;

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

17.10.2016, 17:16:04 via App

Das ActionBarOverlay Layout ist falsch. Eigentlich brauchst du ein DrawerLayout.

— geändert am 17.10.2016, 17:16:15

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

Antworten