Новый ActionBarDrawerToggle при использовании AppCompatActivity

Сегодня Google обновил библиотеку AppCompat до версии 22.1.0, и теперь мы можем использовать AppCompatActivity вместо ActionBarActivity. Это означает, что нам больше не нужно иметь представление Toolbar в нашем макете действий.

Проблема в том, что для создания кнопки переключения Drawer я больше не могу использовать new ActionBarDrawerToggle, потому что он ожидает параметр Toolbar, который не будет существовать.

Как мне теперь добавить кнопку переключения в ActionBar?

Ответ 1

Возможное решение

Активность:

import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity 
{

    DrawerLayout drawerLayout;
    ActionBarDrawerToggle toggle;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
        toggle = new ActionBarDrawerToggle
            (
                    this,
                    drawerLayout,
                    R.string.navigation_drawer_open,
                    R.string.navigation_drawer_close
            )
            {
            };
        drawerLayout.setDrawerListener(toggle);
        toggle.syncState();

    }

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

Разметка:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


    <ListView
        android:id="@+id/list_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#f1f2f7"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent" />

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

Стиль:

<resources>


    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    </style>

</resources>

Важно, чтобы ваше приложение наследовало тему AppCompat.

Если вы заменили панель действий на панели инструментов, не забудьте вернуть панель действий, удалив эту строку в styles.xml:

<item name="windowActionBar">false</item>

Gradle:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:support-v4:22.1.1'
    compile 'com.android.support:appcompat-v7:22.1.1'
}

Я помещаю этот код в github: https://github.com/bbouabou/AppCompatActivity-With-ActionBarDrawerToggle.

Ответ 2

В соответствии с официальными документами класс ActionBarDrawerToggle из v7 содержит конструктор, не зависящий от панели:

public ActionBarDrawerToggle (Activity activity, DrawerLayout drawerLayout, int openDrawerContentDescRes, int closeDrawerContentDescRes)

Это будет работать со значением по умолчанию ActionBar, предоставленным через activity. Итак, как всегда, либо:

  • вы наследуете тему темы действия и вызываете new ActionBarDrawerToggle(...);
  • вы наследуете тему .NoActionBar, создавайте/накачиваете объект Toolbar и вызываете new ActionBarDrawerToggle(..., Toolbar t, ...)

Мне кажется, что с рефакторингом ActionBarActivity ничего не изменилось.

Ответ 3

Если вы используете настройку навигационного ящика Android Studio по умолчанию, то я нашел успех, изменив класс NavigationDrawerFragment.java ActionBarDrawerToggle от v4 до v7 в инструкции import и опуская аргумент Toolbar из конструктор ActionBarDrawerToggle.

Ответ 4

Я не мог найти способ использовать панель инструментов по умолчанию для AppCompatActivity, поэтому обходной путь, который я использовал, заключался в использовании темы Theme.AppCompat.NoActionBar и вручную добавлении панели инструментов в XML, как я делал раньше.