web-dev-qa-db-ja.com

v4.DrawerLayoutでNullPointerExceptionを修正する方法は?

ナビゲーションドロワーを実装しようとしていますが、何らかの理由でこれが発生していますnullポインター例外

私はそれに多くの時間を費やしましたが、無駄でした。これは私のコードの一部です。なぜnullポインタ例外が返されるのか理解できません。

ライブラリなどをインポートする必要がありますか?

前もって感謝します。

package com.motobeans.productions.aloha;

import Android.app.FragmentManager;
import Android.os.Bundle;
import Android.support.v4.widget.DrawerLayout;
import Android.support.v7.app.ActionBarActivity;
import Android.support.v7.app.ActionBarDrawerToggle;
import Android.view.LayoutInflater;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.AdapterView;
import Android.widget.ArrayAdapter;
import Java.util.Locale;
import Android.app.Fragment;

import Android.support.v7.widget.Toolbar;
import Android.widget.ImageView;
import Android.widget.ListView;

public class Activity_test extends ActionBarActivity {
private String[] mPlanetTitles;
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;
    private CharSequence mTitle;
    private CharSequence mDrawerTitle;

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

        setContentView(R.layout.activity_test);
        Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
        setSupportActionBar(toolbar);

        mPlanetTitles = getResources().getStringArray(R.array.planets_array);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.left_drawer);

        mTitle = mDrawerTitle = getTitle();

        // Set the adapter for the list view
        mDrawerList.setAdapter(new ArrayAdapter<String>(this,
                R.layout.drawer_list_item, mPlanetTitles));
        // Set the list's click listener
        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());


        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar,
                 R.string.drawer_open, R.string.drawer_close) {

            /** Called when a drawer has settled in a completely closed state. */
            public void onDrawerClosed(View view) {
                super.onDrawerClosed(view);
                getActionBar().setTitle(mTitle);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }

            /** Called when a drawer has settled in a completely open state. */
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                getActionBar().setTitle(mDrawerTitle);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
        };

        // Set the drawer toggle as the DrawerListener
        mDrawerLayout.setDrawerListener(mDrawerToggle);

    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // If the nav drawer is open, hide action items related to the content view
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }

これはlogcatの出力です

Process: com.motobeans.productions.aloha, PID: 1330
    Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.motobeans.productions.aloha/com.motobeans.productions.aloha.Activity_test}: Java.lang.NullPointerException: Attempt to invoke virtual method 'void Android.support.v4.widget.DrawerLayout.setDrawerListener(Android.support.v4.widget.DrawerLayout$DrawerListener)' on a null object reference
            at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2325)
            at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2387)
            at Android.app.ActivityThread.access$800(ActivityThread.Java:151)
            at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1303)
            at Android.os.Handler.dispatchMessage(Handler.Java:102)
            at Android.os.Looper.loop(Looper.Java:135)
            at Android.app.ActivityThread.main(ActivityThread.Java:5254)
            at Java.lang.reflect.Method.invoke(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:372)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:903)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:698)
     Caused by: Java.lang.NullPointerException: Attempt to invoke virtual method 'void Android.support.v4.widget.DrawerLayout.setDrawerListener(Android.support.v4.widget.DrawerLayout$DrawerListener)' on a null object reference
            at com.motobeans.productions.aloha.Activity_test.onCreate(Activity_test.Java:74)
            at Android.app.Activity.performCreate(Activity.Java:5990)
            at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1106)
            at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2278)
            at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2387)
            at Android.app.ActivityThread.access$800(ActivityThread.Java:151)
            at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1303)
            at Android.os.Handler.dispatchMessage(Handler.Java:102)
            at Android.os.Looper.loop(Looper.Java:135)
            at Android.app.ActivityThread.main(ActivityThread.Java:5254)
            at Java.lang.reflect.Method.invoke(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:372)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:903)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:698)
8
varunkr

.setDrawerListener()を呼び出すと、mDrawerLayoutがnullのように見えます。

findViewById(R.id.drawer_layout)とレイアウトファイルのナビゲーションドロワーに同じIDを使用していることを確認してください。

17
GSala

同様の問題がグーグルで報告されました https://code.google.com/p/Android/issues/detail?id=202478

DrawerLayout.removeDrawerListener()は、設定されたDrawerLayout.DrawerListenerなしで呼び出されます

しかし、Androidサポートライブラリ、リビジョン 23.2.1 (2016年3月)のリリース後、この問題は解決されました。

サポートライブラリをAndroid Support Library to 23.2.1またはそれ以上の更新バージョンに更新します。

1
Amit Vaghela

getSupportActionBar()の代わりにgetActionBar()を使用してください

0

mDrawerLayoutが適切にインスタンス化されていないようであるため、NULLポインタ例外が発生しています。これを解決するには、すべてのビューを適切にインスタンス化してください

DrawerLayout drawer;
drawer = findViewById(R.id.drawer_layout);
0