ActionBarDrawerToggle构造函数具有不兼容的类型

时间:2015-04-13 11:14:25

标签: android

我正在尝试实现导航抽屉,我收到此错误

ActionBarDrawerToggle cannot be applied to android.support.v7.widget.Toolbar

 mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_drawer, R.string.drawer_open,
                R.string.drawer_close)

R.drawable.ic.drawer提供错误。我在整个stackoverflow中搜索并找到了另一个主题,您需要创建一个工具栏并将其添加为操作栏并将此工具栏传递给此构造函数,但如何创建工具栏以便ic_drawer可以显示。

我试过了:

Toolbar toolbar = new ToolBar(getApplicationContext);
toolbar.setLogo(R.drawable.ic_drawer);

但是当我跑步时,应用程序崩溃了。请帮我解决这个问题。

4 个答案:

答案 0 :(得分:2)

training material from Google使用不推荐使用的方法(v4)以及需要drawable的构造函数,这很疯狂。

ActionBarDrawerToggle的最新版本(2015年9月)使用带有工具栏的构造函数。但是,如果您只是使用操作栏切换导航栏,请改用this simpler constructor

  

块引用   给定的Activity将链接到指定的DrawerLayout,其Actionbar的Up按钮将设置为自定义drawable。   这个抽屉在抽屉关闭时显示汉堡图标,在抽屉打开时显示箭头。当抽屉打开时,它会在这两种状态之间激活。

答案 1 :(得分:1)

看看我的代码:

public class HomeActivity extends ActionBarActivity implements
    DrawerCloseListener {
private Toolbar toolbar;
private DrawerLayout drawer;
private ActionBarDrawerToggle drawerToggle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    toolbar = (Toolbar) findViewById(R.id.home_toolbar);
    setSupportActionBar(toolbar);
    drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerToggle = new ActionBarDrawerToggle(this, drawer, toolbar,
            R.string.app_name, R.string.app_name);
    drawerToggle.setHomeAsUpIndicator(R.drawable.icon_nav);
    drawer.setDrawerListener(drawerToggle);
}

/*
 * (non-avadoc) <p>Title: onResume</p> <p>Description: </p>
 * 
 * @params
 * 
 * @overrided @see android.support.v4.app.FragmentActivity#onResume()
 */
@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    toolbar.setTitle("");
    toolbar.setNavigationIcon(R.drawable.icon_nav);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (drawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    return super.onOptionsItemSelected(item);
}

/*
 * (non-avadoc) <p>Title: onConfigurationChanged</p> <p>Description: </p>
 * 
 * @params @param newConfig
 * 
 * @overrided @see
 * android.support.v7.app.ActionBarActivity#onConfigurationChanged
 * (android.content.res.Configuration)
 */
@Override
public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    super.onConfigurationChanged(newConfig);
    drawerToggle.onConfigurationChanged(newConfig);
}

/*
 * (non-avadoc) <p>Title: onPostCreate</p> <p>Description: </p>
 * 
 * @params @param savedInstanceState
 * 
 * @overrided @see android.app.Activity#onPostCreate(android.os.Bundle)
 */
@Override
protected void onPostCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onPostCreate(savedInstanceState);
    drawerToggle.syncState();
}

/*
 * (non-avadoc) <p>Title: onBackPressed</p> <p>Description: </p>
 * 
 * @params
 * 
 * @overrided @see android.support.v7.app.ActionBarActivity#onBackPressed()
 */
@Override
public void onBackPressed() {
    // TODO Auto-generated method stub
    if (drawer.isDrawerOpen(Gravity.LEFT | Gravity.START)) {
        drawer.closeDrawers();
        return;
    }
    super.onBackPressed();
}

/*
 * (non-avadoc) <p>Title: onDrawerClose</p> <p>Description: </p>
 * 
 * @params
 * 
 * @overrided @see com.yeepay.stall.abs.DrawerCloseListener#onDrawerClose()
 */
@Override
public void onDrawerClose() {
    // TODO Auto-generated method stub
    if (drawer.isDrawerOpen(Gravity.LEFT | Gravity.START)) {
        drawer.closeDrawers();
    }
}

}

这是我的布局:

<!-- I use android:fitsSystemWindows because I am changing the color of the statusbar as well -->
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true" >

<!-- Main layout -->

<LinearLayout
    android:id="@+id/main_parent_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical" >

    <include layout="@layout/activity_home_toolbar_layout" />

    <fragment
        android:id="@+id/main_fragment_container"
        android:name="com.yeepay.stall.frag.HomeContentFrag"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

<!-- Nav drawer -->

<fragment
    android:id="@+id/fragment_drawer"
    android:name="com.yeepay.stall.frag.HomeDrawerFrag"
    android:layout_width="@dimen/activity_home_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="left|start"
    android:fitsSystemWindows="true" />
</android.support.v4.widget.DrawerLayout>

最后,我的Toolbar

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/home_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@drawable/toolbar_bg_layer_dark"
android:gravity="center"
android:minHeight="?attr/actionBarSize"
app:theme="@style/ThemeOverlay.AppCompat.Light" >

<TextView
    android:id="@+id/home_toolbar_title"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:layout_gravity="center"
    android:ellipsize="end"
    android:gravity="center"
    android:maxLines="1"
    android:text="@string/app_name"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:textColor="@color/color_toolbar_text" />
</android.support.v7.widget.Toolbar>

答案 2 :(得分:1)

ActionBarDrawerToggle构造函数如下。

android.support.v7.app.ActionBarDrawerToggle.ActionBarDrawerToggle(Activity activity,
            DrawerLayout drawerLayout, 
            Toolbar toolbar, 
            int openDrawerContentDescRes, 
            int closeDrawerContentDescRes)

您正在传递R.drawable.ic_drawer drawable而不是工具栏,这就是您收到此错误的原因。

在布局文件中添加工具栏,如下所示。

<RelativeLayout
            ...>

<include
    android:id="@+id/tool_bar"
    layout="@layout/toolbar"></include>


<android.support.v4.widget.DrawerLayout
              android:layout_below="@+id/tool_bar"
              ...>


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

</RelativeLayout>

将工具栏作为第三个参数传递。

Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
setSupportActionBar(toolbar);
toolbar.setLogo(R.drawable.ic_drawer);

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            toolbar, R.string.drawer_open,
            R.string.drawer_close)

希望它能解决你的错误。

答案 3 :(得分:0)

ActionBarDrawerToggle v4现已弃用。您应该在support-v7-appcompat中使用ActionBarDrawerToggle

您不再需要指定图像的资源:

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) {

    @Override
    public void onDrawerClosed(View drawerView) {
        super.onDrawerClosed(drawerView);

    }

    @Override
    public void onDrawerOpened(View drawerView) {
        super.onDrawerOpened(drawerView);

    }
};

mDrawerLayout.setDrawerListener(drawerToggle);

有关完整示例,请参阅http://www.nkdroid.com/2014/11/Android-Lollipop-Navigation-Drawer-Example-Using-Appcompat-21.html