我正在尝试实现导航抽屉,我收到此错误
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);
但是当我跑步时,应用程序崩溃了。请帮我解决这个问题。
答案 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