首页 > 解决方案 > 尝试调用虚拟方法 'void android.support.v4.widget.DrawerLayout.setDrawerListener

问题描述

我正在使用导航抽屉开发新的 android 应用程序并扩展 baseactivity 并遵循此链接 Same Navigation Drawer in different Activities

但我得到以下异常

进程:edgar.yodgorbek.sportnews,PID:7608 java.lang.RuntimeException:无法启动活动 ComponentInfo{edgar.yodgorbek.sportnews/edgar.yodgorbek.sportnews.MainActivity}:java.lang.NullPointerException:尝试调用虚拟方法' void android.support.v4.widget.DrawerLayout.setDrawerListener(android.support.v4.widget.DrawerLayout$DrawerListener)' 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3102) 的空对象引用上.ActivityThread.handleLaunchActivity(ActivityThread.java:3237) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:81) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app。服务器事务。TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1929) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop (Looper.java:209) at android.app.ActivityThread.main(ActivityThread.java:7021) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:486) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:872) 原因:java.lang.NullPointerException:尝试调用虚拟方法'void android.support.v4.widget。 DrawerLayout.setDrawerListener(android.support.v4.widget.DrawerLayout$DrawerListener)' 在 edgar.yodgorbek.sportnews 的空对象引用上。BaseActivity.onCreate(BaseActivity.java:44) at edgar.yodgorbek.sportnews.MainActivity.onCreate(MainActivity.java:36) at android.app.Activity.performCreate(Activity.java:7650) at android.app.Activity.performCreate (Activity.java:7639) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1295) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3077) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java: 3237) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:81) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java :95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1929) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:209) 在android.app.ActivityThread.main(ActivityThread.java:7021) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:486) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:872)在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:872) 的 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:486) 调用(本机方法)在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:872) 的 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:486) 调用(本机方法) 

    below my BaseActivity class

    public class BaseActivity extends Activity {
        public DrawerLayout drawerLayout;
        public ListView drawerList;
        public String[] layers;
        Toolbar toolbar;
        private ActionBarDrawerToggle drawerToggle;
        private Map map;

        protected void onCreate(Bundle savedInstanceState) {
            // R.id.drawer_layout should be in every activity with exactly the same id.
            super.onCreate(savedInstanceState);
            drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

            drawerToggle = new ActionBarDrawerToggle( this, drawerLayout,toolbar,0, 0) {
                public void onDrawerClosed(View view) {
                    getActionBar().setTitle(R.string.app_name);
                }

                public void onDrawerOpened(View drawerView) {
                    getActionBar().setTitle(R.string.app_name);
                }
            };
            drawerLayout.setDrawerListener(drawerToggle);

            getActionBar().setDisplayHomeAsUpEnabled(true);
            getActionBar().setHomeButtonEnabled(true);

            //  layers = getResources().getStringArray(R.array.layers_array);
            drawerList = (ListView) findViewById(R.id.left_drawer);
            View header = getLayoutInflater().inflate(R.layout.base_activity, null);
            drawerList.addHeaderView(header, null, false);
            drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.base_activity, android.R.id.text1,
                    layers));
            View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
                    R.layout.base_activity, null, false);
            drawerList.addFooterView(footerView);

            drawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
                    //   map.drawerClickEvent(pos);
                }
            });
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {

            if (drawerToggle.onOptionsItemSelected(item)) {
                return true;
            }
            return super.onOptionsItemSelected(item);

        }

        @Override
        protected void onPostCreate(Bundle savedInstanceState) {
            super.onPostCreate(savedInstanceState);
            drawerToggle.syncState();
        }

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

    below base_activity.xml

    android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <!-- The main content view -->
        <FrameLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <!-- Put what you want as your normal screen in here, you can also choose for a linear layout or any other layout, whatever you prefer -->
        </FrameLayout>
        <!-- The navigation drawer -->
        <ListView
            android:id="@+id/left_drawer"
            android:layout_width="240dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:background="#111"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp" />
    </android.support.v4.widget.DrawerLayout>


    below my MainActivity

    public class MainActivity extends BaseActivity {

        public List<Article> articleList = new ArrayList<Article>();
        @BindView(R.id.recyclerView)
        RecyclerView recyclerView;
        private SportNews sportNews;
        private ArticleAdapter articleAdapter;
        private DrawerLayout drawerLayout;
        private ListView drawerList;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ButterKnife.bind(this);
            drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
            drawerList = (ListView) findViewById(R.id.left_drawer);

            SportInterface sportInterface = SportClient.getApiService();
            Call<SportNews> call = sportInterface.getArticles();
            call.enqueue(new Callback<SportNews>() {
                @Override
                public void onResponse(Call<SportNews> call, Response<SportNews> response) {
                    sportNews = response.body();
                    if (sportNews != null && sportNews.getArticles() != null) {
                        articleList.addAll(sportNews.getArticles());
                    }
                    articleAdapter = new ArticleAdapter(articleList, sportNews);
                    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
                    recyclerView.setLayoutManager(layoutManager);
                    recyclerView.setAdapter(articleAdapter);
                }

                @Override
                public void onFailure(Call<SportNews> call, Throwable t) {

                }
            });

        }
    }

    below activity_main.xml

    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- The main content view -->
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scrollbars="vertical" />

    <!-- The navigation drawer -->
    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#111"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp" />
    </android.support.v4.widget.DrawerLayout>

标签: androidnavigation-drawer

解决方案


在下面写下一行 super.onCreate(savedInstanceState);

 setContentView(R.layout.activity_main);

推荐阅读