web-dev-qa-db-ja.com

AppCompatActivity使用時の新しいActionBarDrawerToggle

今日、GoogleはAppCompatライブラリをバージョン22.1.0に更新し、AppCompatActivityの代わりにActionBarActivityを使用できるようになりました。つまり、アクティビティレイアウトにToolbarビューを含める必要がなくなりました。

問題は、Drawerトグルボタンを作成するためにnew ActionBarDrawerToggleを使用できないことです。これは、存在しないToolbarパラメータを想定しているためです。

トグルボタンをActionBarに追加するにはどうすればよいですか?

16
Guilherme

可能な解決策

アクティビティ:

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

22
Brahim Bouaboud

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, ...)を呼び出します

ActionBarActivityリファクタリングで何も変わっていないように見えます。

5
natario

Android Studioのデフォルトのナビゲーションドロワーセットアップを使用している場合、NavigationDrawerFragment.JavaActionBarDrawerToggleクラスv4v7importステートメントで使用し、Toolbar引数をActionBarDrawerToggleコンストラクターから省略します。

4
SQLiteNoob