【问题标题】:new ActionBarDrawerToggle when using AppCompatActivity使用 AppCompatActivity 时的新 ActionBarDrawerToggle
【发布时间】:2015-04-21 22:19:53
【问题描述】:

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

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

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

【问题讨论】:

  • 出于好奇 - 谁说“我们不再需要在我们的活动布局中拥有工具栏视图”?我找不到任何参考。
  • 新的AppCompatActivity 已经有一个工具栏(我相信可以根据需要移除/隐藏),所以你不需要再添加一个
  • AppCompatActivity 默认具有ActionBar。您仍然需要将 Theme 修改为 Theme.AppCompat.NoActionBar 并将 Toolbar 添加到您的布局中。
  • 您找到解决方案了吗? :(
  • @AlexMomotov 还没有

标签: android android-actionbar navigation-drawer


【解决方案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>

分级:

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

【讨论】:

  • 如何获得汉堡图标?根据材料指南,应该可以使用,但是这段代码给了你一个简单的后退箭头?
  • @MrPablo:你可能错过了什么,这段代码应该在抽屉关闭时给你汉堡图标,在抽屉打开时给你箭头。
  • @BrahimBouaboud 是的,我回去重写了代码,它现在可以工作了
  • 我习惯使用工具栏。突然,我对我当前的项目有同样的要求。我搜索了几个小时,终于找到了这个来增强我的信心。谢谢。 :)
  • setDrawerListener 已弃用
【解决方案2】:

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

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

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

  1. 您从操作栏主题继承,并调用new ActionBarDrawerToggle(...)
  2. 您从.NoActionBar 主题继承,实例化/膨胀Toolbar 对象,然后调用new ActionBarDrawerToggle(..., Toolbar t, ...)

在我看来,ActionBarActivity 重构没有任何改变。

【讨论】:

  • 从 v4 切换到 v7 支持库后确实有效
【解决方案3】:

如果您使用 Android Studio 的默认导航抽屉设置,那么我通过在 import 语句中将 NavigationDrawerFragment.javaActionBarDrawerToggle 类从 v4 更改为 v7 并省略 Toolbar 发现成功来自 ActionBarDrawerToggle 构造函数的参数。

【讨论】:

  • 嗨@SQLiteNoon,请您展示您的新构造函数。我的确实有这些参数(new ActionBarDrawerToggle(getActivity, DrawerLayout, R.drawable.ic_drawer,"open, "close"
【解决方案4】:

我找不到使用 AppCompatActivity 的默认工具栏的方法,所以我使用的解决方法是使用 Theme.AppCompat.NoActionBar 主题并像以前一样手动将工具栏添加到 XML。

【讨论】:

  • 你在哪里读到AppCompatActivity有一个默认的Toolbar
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多