使用AppCompatActivity时新的ActionBarDrawerToggle

时间:2015-04-21 22:19:54

标签: android android-actionbar navigation-drawer

今天Google将AppCompat库更新为22.1.0版,现在我们可以使用AppCompatActivity代替ActionBarActivity。 这意味着我们不再需要在活动布局中拥有Toolbar视图。

问题在于,为了创建抽屉切换按钮,我不能再使用new ActionBarDrawerToggle了,因为它需要一个Toolbar参数,该参数不存在。

我现在应该如何将切换按钮添加到ActionBar中?

4 个答案:

答案 0 :(得分:20)

可能的解决方案

的活动:

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

答案 1 :(得分:5)

根据official docs,v7中的ActionBarDrawerToggle类具有独立于工具栏的构造函数:

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

这适用于ActionBar提供的默认activity。所以,一如既往:

  1. 您从操作栏主题继承,并致电new ActionBarDrawerToggle(...);
  2. 您从.NoActionBar主题继承,实例化/充气Toolbar对象,并致电new ActionBarDrawerToggle(..., Toolbar t, ...)
  3. 在我看来,ActionBarActivity重构没有任何改变。

答案 2 :(得分:4)

如果您正在使用Android Studio的默认导航抽屉设置,那么我通过将NavigationDrawerFragment.java的{​​{1}}课程从ActionBarDrawerToggle更改为v4语句中的v7并忽略import构造函数中的Toolbar参数。

答案 3 :(得分:-2)

我无法找到使用AppCompatActivity默认工具栏的方法,因此我使用的解决方法是使用window主题并手动将工具栏添加到XML中,就像我正在做的那样之前。