今天Google将AppCompat库更新为22.1.0版,现在我们可以使用AppCompatActivity
代替ActionBarActivity
。
这意味着我们不再需要在活动布局中拥有Toolbar
视图。
问题在于,为了创建抽屉切换按钮,我不能再使用new ActionBarDrawerToggle
了,因为它需要一个Toolbar
参数,该参数不存在。
我现在应该如何将切换按钮添加到ActionBar中?
答案 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
。所以,一如既往:
new ActionBarDrawerToggle(...)
; .NoActionBar
主题继承,实例化/充气Toolbar
对象,并致电new ActionBarDrawerToggle(..., Toolbar t, ...)
在我看来,ActionBarActivity
重构没有任何改变。
答案 2 :(得分:4)
如果您正在使用Android Studio的默认导航抽屉设置,那么我通过将NavigationDrawerFragment.java
的{{1}}课程从ActionBarDrawerToggle
更改为v4
语句中的v7
并忽略import
构造函数中的Toolbar
参数。
答案 3 :(得分:-2)
我无法找到使用AppCompatActivity默认工具栏的方法,因此我使用的解决方法是使用window
主题并手动将工具栏添加到XML中,就像我正在做的那样之前。