web-dev-qa-db-ja.com

アクションバーなしでナビゲーションドロワーを開く方法、ボタンだけで開く

アクションバーのないナビゲーションバーがあります(アクションバーは必要ありません)。ナビゲーションドロワーを開くことができるボタンがあるようにしようとしています。

DrawerLayoutにはopenDrawerというメソッドがあることを知っています http://developer.Android.com/reference/Android/support/v4/widget/DrawerLayout.html#openDrawer(Android.view.View)

私はそれを使用する方法を知りませんでしたが、クリックしたときにボタンを作成しようとしました、このメソッドを実行します:

DrawerLayout mDrawerLayout = (DrawerLayout) getView().findViewById(R.id.drawer_layout);
mDrawerLayout.openDrawer(mDrawerLayout);

それをクリックすると、Java NullPointerExceptionが表示されます。

編集:このコードはフラグメント内にあり、私はフラグメント外の引き出しレイアウトを参照しようとしています。デバッガーを使用しましたが、mDrawlerLayoutがNULLであることを示しています。

何かアドバイス?

ありがとう!

35
CynthiaDDurazo

実際にアクティビティビューにあるときに、フラグメントのビューでドロワーレイアウトを見つけようとしているため、nullポインターが表示されます。

あなたがしたいことをする簡単なハックは、次のようなビューを見つけることです:

getActivity().findViewById(R.id.drawer_layout)

うまくいくはずです。より良い方法は、引き出しを開くためのアクティビティのメソッドを持つことです

public void openDrawer(){
    mDrawerLayout.openDrawer(mDrawerLayout);
}

OnCreateアクティビティで、findViewByIdを実行します。

mDrawerLayout = (DrawerLayout) getView().findViewById(R.id.drawer_layout);

mDrawerLayoutは、アクティビティのメンバー変数である必要があります。

次に、フラグメントで呼び出すことができます:

//cast activity to MyActivity so compiler doesn't complain
((MyActivity)getActivity()).openDrawer();

さらに良い方法は、フラグメントにリスナーを作成し、アクティビティをフラグメントのリスナーとして設定することです。その後、上記と同様にアクティビティでメソッドを呼び出すことができます。その方法についての調査をさせていただきます。

52
athor
drawerLayout.openDrawer(Gravity.START);
36
Aliya

@athorと@Ashish Tanaに感謝します。

私が得ているエラー(NullPointerException)を理解するのに非常に時間がかかりました。

私はこのように動作します。 getView()の代わりに、getActivity()を使用し、mDrawerLayout.openDrawer(Gravity.LEFT);で引き出しを開きます。

mDrawerLayout = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
final ImageButton btnOpenDrawer = (ImageButton) getView().findViewById(R.id.drawer_menu);

        btnOpenDrawer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mDrawerLayout.openDrawer(Gravity.LEFT);
            }
        });
2
Jei

isDrawerOpen() of DrawerLayoutを使用する簡単なソリューションがあります。

以下のコードは、ドロワーの現在の状態(Opened/Closed)に基づいてナビゲーションドロワーを開閉します

Button hamMenu = findViewById(R.id.ham_menu);
hamMenu.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DrawerLayout navDrawer = findViewById(R.id.drawer_layout);
        // If navigation drawer is not open yet, open it else close it.
        if(!navDrawer.isDrawerOpen(GravityCompat.START)) navDrawer.openDrawer(Gravity.START);
        else navDrawer.closeDrawer(Gravity.END);
    }
});
2
Sapnesh Naik

ボタンのクリックで動作します

mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            drawer.openDrawer(GravityCompat.START);

        }
    });
0

これについての答えをここに書きました: https://stackoverflow.com/a/18199771/880349

   //For me a better way in avoiding a `null pointer` in getting the DrawerLayout
   final DrawerLayout drawer = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
   btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                            //Opens the Drawer
                drawer.openDrawer(Your View, Usually a ListView);
            }

                return false;
        });

ビュー/フラグメント内の現在のドロワーを直接取得して、NullPointerExceptionを取得しないようにします

0
rahstame