web-dev-qa-db-ja.com

ツールバーのハンバーガーアイコンをクリックしてもナビゲーションドロワーが開かない

シンプルなAndroid.support.v7.widget.Toolbarそして私がやろうとしていることは、左上隅にある「ハンバーガー」アイコンを押してNavigationDrawerを開くことだけです。 「ハンバーガー」ボタンが表示され、左から引っ張り始めると、ボタンにアニメーションが表示されますが、ボタンを押しても、NavigationDrawerが期待どおりに開閉しません。 [Googleのドキュメント] [1]をフォローしましたが、これを理解することはできません。混乱して申し訳ありませんが、現在使用しようとしているsimplifiedコードは次のとおりです。

public class MainActivity extends AppCompatActivity implements
    View.OnClickListener,
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener {



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    setContentView(R.layout.activity_main);


    Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);



    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("NICK", "button button button..................");
        }
    });

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer);
        NavigationView n = (NavigationView) findViewById(R.id.nav);
        mDrawerLayout.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Log.d("NICK", "button button button..................");
            }
        });

        //mDrawerLayout.setDrawerListener(mDrawerToggle);
        n.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {
                switch (menuItem.getItemId()) {
                    ////.......

                }
                mDrawerLayout.closeDrawers();  // CLOSE DRAWER
                return true;
            }
        });

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    Log.d("NICK","CWECNEWKVNERIPNVIEWNFVIPEWNVIPEWNVPIEWNVPIEWNVPIEWNVPIRWNVPRWVPO");
    switch (item.getItemId()) {
        case Android.R.id.home:
            mDrawerLayout.openDrawer(GravityCompat.START);  // OPEN DRAWER
            Log.d("NICK","CWECNEWKVNERIPNVIEWNFVIPEWNVIPEWNVPIEWNVPIEWNVPIEWNVPIRWNVPRWVPO");
            return true;

    }
           return super.onOptionsItemSelected(item);


}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    mDrawerToggle.onConfigurationChanged(newConfig);
}



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.drawer, menu);
    return true;
}


}

}

そして、実行中にログデバッグステートメントを取得しません。

これは本質的に私が持っている問題です: https://stackoverflow.com/a/26636045/148999 。私はこれに従いましたが、うまくいきません。

ハンバーガーアイコンが押されたときにsetNavigationOnClickListenerが呼び出されることは私の理解であり、ボタンを押すとログステートメントが取得されないため、イベントを適切に処理することに焦点を当てています。この考えが間違っているかどうか教えてください。 https://developer.Android.com/reference/Android/widget/Toolbar.html#setNavigationOnClickListener(Android.view.View.OnClickListener)

私のレイアウト:

ActivityMain.xml

<RelativeLayout
xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/d"
Android:background="@drawable/home_wall">




<Android.support.v7.widget.Toolbar
    Android:id="@+id/my_toolbar"
    Android:layout_height="wrap_content"
    Android:layout_width="match_parent"
    Android:minHeight="?attr/actionBarSize"
    Android:background="?attr/colorPrimary"
    Android:layout_marginBottom="10dp"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    Android:layout_marginTop="25dp"

    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto" />



<Android.support.v4.widget.DrawerLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:id="@+id/drawer"

    Android:layout_height="match_parent"
    Android:fitsSystemWindows="true">



    <ImageView
        Android:layout_width="fill_parent"
        Android:layout_height="200dp"
        Android:id="@+id/imageView"
        Android:src="@drawable/trans2"
        Android:layout_alignParentTop="true"
        Android:layout_marginTop="10dp"
        Android:layout_marginLeft="5dp"
        Android:layout_marginRight="5dp"
        Android:paddingBottom="300dp" />

    <RelativeLayout
        Android:orientation="vertical"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:id="@+id/d8"
        Android:layout_alignParentTop="true"
        Android:layout_alignLeft="@+id/imageView"
        Android:layout_alignStart="@+id/imageView"
        Android:paddingTop="0dp">

        <Button
            Android:layout_width="75dp"
            Android:layout_height="50dp"
            Android:text="Gallery"
            Android:id="@+id/save_button"
            Android:background="#dd2c00" Android:textColor="#fff"
            Android:layout_below="@+id/Purchases"
            Android:layout_toRightOf="@+id/start_button"
            Android:layout_toEndOf="@+id/start_button" />
        <Button
            Android:layout_width="125dp"
            Android:layout_height="50dp"
            Android:text="Store"
            Android:id="@+id/Purchases"
            Android:background="#ff6e40" Android:textColor="#fff"
            Android:layout_above="@+id/instructions_button6"
            Android:layout_toLeftOf="@+id/start_button"
            Android:layout_toStartOf="@+id/start_button"
            Android:layout_marginBottom="98dp" />
        <Button
            Android:layout_width="75dp"
            Android:layout_height="50dp"
            Android:text="Help"
            Android:id="@+id/instructions_button6"
            Android:background="#dd2c00" Android:textColor="#fff"
            Android:layout_alignParentBottom="true"
            Android:layout_toLeftOf="@+id/start_button"
            Android:layout_toStartOf="@+id/start_button"
            Android:layout_marginLeft="5dp"
            Android:layout_marginBottom="10dp" />
        <Button
            Android:layout_width="75dp"
            Android:layout_height="300dp"
            Android:text="Start"
            Android:id="@+id/start_button"
            Android:background="#ff3d00"
            Android:textColor="#fff"
            Android:layout_alignParentBottom="true"
            Android:layout_centerHorizontal="true"
            Android:layout_marginBottom="10dp" />
        <Button
            Android:layout_width="125dp"
            Android:layout_height="50dp"
            Android:text="Achievements"
            Android:id="@+id/Scores"
            Android:background="#ff6e40" Android:textColor="#fff"
            Android:layout_alignTop="@+id/Purchases"
            Android:layout_toRightOf="@+id/start_button"
            Android:layout_toEndOf="@+id/start_button" />
        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="Welcome to the quiz!"
            Android:id="@+id/textView"
            Android:textColor="#fff"
            Android:textSize="20dp"
            Android:layout_alignParentTop="true"
            Android:layout_centerHorizontal="true"
            Android:layout_marginTop="70dp" />


        <!-- sign-in button -->
        <com.google.Android.gms.common.SignInButton
            Android:id="@+id/sign_in_button"
            Android:layout_width="110dp"
            Android:layout_height="50dp"
            Android:layout_above="@+id/start_button"
            Android:layout_centerHorizontal="true"
            Android:visibility="visible" />

        <!-- sign-out button -->
        <Button
            Android:id="@+id/sign_out_button"
            Android:layout_width="125dp"
            Android:layout_height="wrap_content"
            Android:text="Sign Out"
            Android:visibility="invisible"
            Android:background="#dd4b39"
            Android:textColor="#fff"
            Android:layout_alignTop="@+id/sign_in_button"
            Android:layout_centerHorizontal="true"
            Android:layout_marginTop="160dp" />

    </RelativeLayout>

    <Android.support.design.widget.NavigationView
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:background="#fff"
        Android:id="@+id/nav"

        app:headerLayout="@layout/drawer_header"
        app:menu="@menu/drawer"/>
</Android.support.v4.widget.DrawerLayout>

Drawer.xml

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/drawer_menu"
xmlns:app="http://schemas.Android.com/apk/res-auto">

<item Android:title="Google Play Games"

    Android:icon="@drawable/ic_local_airport_white_48dp">
    <menu>
        <item
            Android:id="@+id/Sign_in_drawer"

            Android:icon="@drawable/games_controller_grey"
            Android:title="Sign in" />
        <item
            Android:id="@+id/ach"
            Android:icon="@drawable/games_achievements"
            Android:title="Achievements" />
    </menu>
</item>

<item Android:title="Start a Quiz"

   Android:icon="@drawable/ic_local_airport_white_48dp">
    <menu>
        <item
            Android:id="@+id/quizStart25"

            Android:icon="@drawable/ic_local_airport_white_48dp"
            Android:title="25 Questions" />
        <item
            Android:id="@+id/quizStart10"
            Android:icon="@drawable/ic_local_airport_white_48dp"
            Android:title="10 Questions" />
    </menu>
</item>

<group
    Android:checkableBehavior="single">
    <item
        Android:id="@+id/gallery"

        Android:icon="@drawable/ic_photo_library_white_48dp"
        Android:title="Gallery" />
    <item
        Android:id="@+id/stats"
        Android:icon="@drawable/ic_toc_white_48dp"
        Android:title="Statistics" />
    <item
        Android:id="@+id/store"
        Android:icon="@drawable/ic_shop_white_48dp"
        Android:title="Store" />
    <item
        Android:id="@+id/settings"
        Android:icon="@drawable/ic_settings_white_48dp"
        Android:title="Settings" />
    <item
        Android:id="@+id/about"
        Android:icon="@drawable/ic_info_white_48dp"
        Android:title="About" />

</group>

<item Android:title="Support">
    <menu>
        <item
            Android:id="@+id/help_drawer"
            Android:icon="@drawable/ic_help_white_48dp"
            Android:title="Help" />
        <item
            Android:id="@+id/report"
            Android:icon="@drawable/ic_report_problem_white_48dp"
            Android:title="Contact Developer" />
        <item
            Android:id="@+id/GPlusCommunity"
            Android:icon="@drawable/btn_g_white_normal"
            Android:title="Google+ Community" />

    </menu>
</item>
32
ez4nick

ActivityMain.xmlでは、ツールバーはDrawerLayoutの外側にあります。それが問題です。ツールバーをDrawLayoutと対話させたい場合、ToolbarはDrawerLayoutの子である必要があります。

問題を解決するには、DrawerLayoutをアクティビティのルートにします。 ドキュメント です。関連する引用は次のとおりです。

ナビゲーションドロワーを追加するには、レイアウトのルートビューとしてDrawerLayoutオブジェクトを使用してユーザーインターフェイスを宣言します。 DrawerLayout内に、画面のメインコンテンツ(引き出しが非表示の場合のプライマリレイアウト)を含む1つのビューと、ナビゲーション引き出しのコンテンツを含む別のビューを追加します。

したがって、基本的に、ActivityMain.xmlを次のように構成します。

<Android.support.v4.widget.DrawerLayout ...>

    <RelativeLayout ...>

        <Android.support.v7.widget.Toolbar .../>

        <!-- Your other content goes here -->

    </RelativeLayout>

    <Android.support.design.widget.NavigationView .../>

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

これで問題が解決するはずです。

91
hungryghost

引き出しトグルを同期する必要があります。

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    mDrawerToggle.syncState();
}

編集:そのコードは私のために働いています(あなたの投稿からコピーされました)

public class TempActivity extends AppCompatActivity {
    private ActionBarDrawerToggle mDrawerToggle;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.temp);
        setupDrawer();
    }
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }
    @Override
    public boolean onOptionsItemSelected(final MenuItem item) {
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        mDrawerToggle.syncState();
    }
    private void setupDrawer() {
        Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
        DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.my_drawer_layout);
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,toolbar,R.string.drawer_open, R.string.drawer_close) {
            public void onDrawerClosed(View view) {
                super.onDrawerClosed(view);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);
    }
}

<Android.support.v4.widget.DrawerLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/my_drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical">
        <Android.support.v7.widget.Toolbar
            Android:id="@+id/my_toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="?attr/actionBarSize"
            Android:background="?attr/colorPrimary"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
        <FrameLayout
            Android:id="@+id/content_frame"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent" />
    </LinearLayout>
    <RelativeLayout
        Android:id="@+id/left_drawer"
        Android:layout_width="240dp"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:choiceMode="singleChoice"
        Android:divider="@Android:color/transparent"
        Android:dividerHeight="0dp"
        Android:background="#111">
        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:textColor="#FFF"
            Android:text="DRAMER MENU" />
    </RelativeLayout>
</Android.support.v4.widget.DrawerLayout>

しかし、新しいNavigationViewを使用している場合、トグルなどは必要ありません。 良い例です 使用方法。

8
mbmc

onOptionsItemSelectedメソッドをオーバーライドし、以下で使用します

if(item.getItemId() == Android.R.id.home){ // use Android.R.id
    mDrawerLayout.openDrawer(Gravity.LEFT);
}
7
Amit

それが誰かを助けるなら、私にはsetSupportActionBar(toolbar)を2回呼び出すという愚かなエラーのために同じことが起こりました。 onCreateメソッドで一度だけ呼び出して、二度と呼び出さないでください。私の間違いは、後で別の方法でそれを呼び出しました。

2
Benjamin Heinke

以下のようなアクティビティオプションメニュー管理機能で、ActionBarDrawerToggleクラスのonOptionsItemSelected(MenuItem menuItem)関数を呼び出すだけです。

mDrawerToggle= new ActionBarDrawerToggle(activity, drawerLayout, R.string.nav_drawer_accessbility_drawer_open,
            R.string.nav_drawer_accessbility_drawer_close);


 @Override
public boolean onOptionsItemSelected(final Android.view.MenuItem item) {
    navigation().getOptionsMenuInflater(this).closeSearchView();
    // The action bar home/up action should open or close the drawer.
    // ActionBarDrawerToggle will take care of this behavior.
    mDrawerToggle.onOptionsItemSelected(item);

    return super.onOptionsItemSelected(item);
}

OR

以下のようなアクティビティのonOptionsItemSelectedをオーバーライドします

public boolean onOptionsItemSelected(MenuItem item) {
    if (item != null && item.getItemId() == Android.R.id.home) {
        toggle();

    }
    return super.onOptionsItemSelected(item);
}

 private void toggle() {
    if (mDrawerLayout.isDrawerVisible(GravityCompat.START)) {
        mDrawerLayout.closeDrawer(GravityCompat.START);
    } else {
        mDrawerLayout.openDrawer(GravityCompat.START);
    }
}
1
sujith s

引き出しを切り替えるには、「ホームを上に表示」をfalseに設定する必要があります:getSupportActionBar().setDisplayHomeAsUpEnabled(false);

1
queencodemonkey

あなたの問題に対する具体的な答えはありませんので、まったく異なるアプローチを提案したいと思います。

私のプロジェクトでは、Mike Penzが開発した Material Drawer を使用しています。見た目は本当にすてきで、簡単に実装でき、心配する必要はあまりありません。

したがって、問題の解決策が見つからない場合は、試してみてください。

1
W3hri

ActionBarDrawerToggleを使用し、public boolean onOptionsItemSelected(MenuItem item)を実装します

ツールバーはDrawerLayout内にある必要はありません。この問題の原因ではない可能性があります。 toggle.onOptionsItemSelected(item)は、選択されたアイテムのIDを探し、それがAndroid.R.id.homeその後、引き出しの表示が切り替わります。したがって、ツールバー、またはホームMenuItemを作成するビューは、レイアウトのどこにでも配置できます。

アクティビティ内:

ActionBarDrawerToggle toggle;

private void setupDrawerToggleInActionBar() {
    // assuming a Toolbar has been initialized in your onCreate
    this.setSupportActionBar(toolbar);

    // setup the action bar properties that give us a hamburger menu
    ActionBar actionBar = this.getSupportActionBar();
    if(actionBar != null) {
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setHomeButtonEnabled(true);
    }

    // the toggle allows for the simplest of open/close handling
    toggle = new ActionBarDrawerToggle(this,
                                       drawerLayout,
                                       R.string.navigation_drawer_open,
                                       R.string.navigation_drawer_close);
    // drawerListener must be set before syncState is called
    drawerLayout.setDrawerListener(toggle);

    toggle.setDrawerIndicatorEnabled(true);
    toggle.syncState();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    // This is required to make the drawer toggle work
    if(toggle.onOptionsItemSelected(item)) {
        return true;
    }

    /*
     * if you have other menu items in your activity/toolbar 
     * handle them here and return true
     */

    return super.onOptionsItemSelected(item);
}
1
Will Vanderhoef

ただし、「予防は治療よりも優れている」と言われているので、ここで受け入れられている答えは大丈夫です。mDrawerToggle.syncState();の追加onPostCreateおよびonConfigurationChanged()で、上記の@mbmcで回答されたように、はるかにうまく動作します。

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    mDrawerToggle.onConfigurationChanged(newConfig);
}
0
Vinay