1

i want to keep navigation-drawer open in tablets. to do that i am using the following code but when ever i touch the content frame i am getting the null pointer exception.

My XML File:

<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

</android.support.v4.widget.DrawerLayout>
<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="@dimen/drawer_content_padding"/>
</FrameLayout>

Mainactivity:

public class MainActivity extends FragmentActivity {

    private boolean isDrawerLocked = false;
    private ListView drawerList;
    private DrawerLayout drawerLayout;
    private String[] drawerItems;
    private ActionBarDrawerToggle drawerToggle;

     @Override
        protected void onCreate(Bundle bundle) {
            super.onCreate(bundle);
            setContentView(R.layout.activity_main);

            drawerList = (ListView) findViewById(R.id.left_drawer);
            drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
            FrameLayout frameLayout = (FrameLayout)findViewById(R.id.content_frame);
            if(((ViewGroup.MarginLayoutParams)frameLayout.getLayoutParams()).leftMargin == (int)getResources().getDimension(R.dimen.drawer_size)) {
                drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN, drawerList);
                drawerLayout.setScrimColor(Color.TRANSPARENT);
                isDrawerLocked = true;
            }

            // Set the adapter for the list view
            drawerItems = getResources().getStringArray(R.array.Guide_elements);

            drawerToggle = new ActionBarDrawerToggle(
                    this,
                    drawerLayout,
                    R.drawable.ic_drawer, 
                    R.string.app_name,  
                    R.string.app_name  
            ) {

                /** Called when a drawer has settled in a completely closed state. */
                public void onDrawerClosed(View view) {
                    getActionBar().setTitle(getTitle());

                    invalidateOptionsMenu();
                }

                /** Called when a drawer has settled in a completely open state. */
                public void onDrawerOpened(View drawerView) {
                    getActionBar().setTitle("Select Option");

                    invalidateOptionsMenu();
                }
            };

            if(!isDrawerLocked) {
                drawerLayout.setDrawerListener(drawerToggle);
            }

            // Set the drawer toggle as the DrawerListener
            DrawerItemClickListener drawerItemClickListener = new DrawerItemClickListener();
            drawerList.setOnItemClickListener(drawerItemClickListener);

            if(!isDrawerLocked) {
                getActionBar().setDisplayHomeAsUpEnabled(true);
            }
        }

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

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

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Pass the event to ActionBarDrawerToggle, if it returns
            // true, then it has handled the app icon touch event
            if (drawerToggle.onOptionsItemSelected(item)) {
                return true;
            }

            return super.onOptionsItemSelected(item);
        }

        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {
            // If the nav drawer is open, hide action items related to the content view
            boolean drawerOpen = drawerLayout.isDrawerOpen(drawerList);
            MenuItem item = menu.findItem(R.id.action_settings);
            if(item != null) {
                item.setVisible(!drawerOpen);
            }
            item = menu.findItem(R.id.action_settings);
            if(item != null) {
                item.setVisible(!drawerOpen);
            }
            return super.onPrepareOptionsMenu(menu);
        }

        /**
         * The drawer item click listener
         */
        private class DrawerItemClickListener implements ListView.OnItemClickListener {
            @Override
            public void onItemClick(AdapterView parent, View view, int position, long id) {
                selectItem(position);
            }

            /** Swaps fragments in the main content view */
            private void selectItem(int position) {
                Bundle bundle;
                switch(position) {

                }
                FragmentManager fragmentManager = getFragmentManager();

                fragmentManager.beginTransaction()
                        .replace(R.id.content_frame, null)
                        .commit();

                // Highlight the selected item, update the title, and close the drawer
                drawerList.setItemChecked(position, true);
                setTitle(MainActivity.this.drawerItems[position]);
                if(!isDrawerLocked) {
                    drawerLayout.closeDrawer(drawerList);
                }
            }
        }
    }

but when ever i touched the content_frame i am getting the null pointer exception. how can i solve the problem to avoid null pointer exception.

Exception details:

10-30 12:53:42.374: E/InputEventReceiver(3157): Exception dispatching input event.
10-30 12:53:42.374: E/MessageQueue-JNI(3157): Exception in MessageQueue callback: handleReceiveCallback
10-30 12:53:42.414: E/MessageQueue-JNI(3157): java.lang.NullPointerException
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.support.v4.widget.DrawerLayout.isContentView(DrawerLayout.java:853)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.support.v4.widget.DrawerLayout.onInterceptTouchEvent(DrawerLayout.java:879)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1854)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1912)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1912)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1912)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1912)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1966)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1418)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.app.Activity.dispatchTouchEvent(Activity.java:2424)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1914)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.View.dispatchPointerEvent(View.java:7564)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3883)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3778)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3483)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3540)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5419)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5399)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5370)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5493)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.os.MessageQueue.nativePollOnce(Native Method)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.os.MessageQueue.next(MessageQueue.java:132)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.os.Looper.loop(Looper.java:124)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at android.app.ActivityThread.main(ActivityThread.java:5103)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at java.lang.reflect.Method.invokeNative(Native Method)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at java.lang.reflect.Method.invoke(Method.java:525)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-30 12:53:42.414: E/MessageQueue-JNI(3157):   at dalvik.system.NativeStart.main(Native Method)
10-30 12:53:42.434: W/dalvikvm(3157): threadid=1: thread exiting with uncaught exception (group=0x41465700)
10-30 12:53:42.484: E/AndroidRuntime(3157): FATAL EXCEPTION: main
10-30 12:53:42.484: E/AndroidRuntime(3157): java.lang.NullPointerException
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.support.v4.widget.DrawerLayout.isContentView(DrawerLayout.java:853)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.support.v4.widget.DrawerLayout.onInterceptTouchEvent(DrawerLayout.java:879)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1854)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1912)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1912)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1912)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1912)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1966)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1418)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.app.Activity.dispatchTouchEvent(Activity.java:2424)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1914)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.View.dispatchPointerEvent(View.java:7564)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3883)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3778)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3483)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3540)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5419)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5399)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5370)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5493)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.os.MessageQueue.nativePollOnce(Native Method)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.os.MessageQueue.next(MessageQueue.java:132)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.os.Looper.loop(Looper.java:124)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at android.app.ActivityThread.main(ActivityThread.java:5103)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at java.lang.reflect.Method.invokeNative(Native Method)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at java.lang.reflect.Method.invoke(Method.java:525)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-30 12:53:42.484: E/AndroidRuntime(3157):     at dalvik.system.NativeStart.main(Native Method)
madan V
  • 844
  • 3
  • 19
  • 40
  • Possible duplicate of [Navigation Drawer: set as always opened on tablets](https://stackoverflow.com/questions/17133541/navigation-drawer-set-as-always-opened-on-tablets) – Bertram Gilfoyle Jun 01 '18 at 17:05

3 Answers3

0

how can i solve the problem to avoid null pointer exception

I think its bcoz in your Naivagtion Drawer.

There must be two layouts.

  1. The 1st Layout will be in backend means when Drawer Opens the view appears from back And

  2. the 2nd Layout is for the front View i.e when Drawer is not opened.

So,

Try by adding a second layout in Drawer Layout below ListView.

For e.g.

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- The navigation drawer -->
    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="@dimen/drawer_size"
        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:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"                  
                android:text="welcome"         
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:textColor="#090" />

</android.support.v4.widget.DrawerLayout>
Sagar Shah
  • 4,272
  • 2
  • 25
  • 36
0

You need to make an adapter from the string array drawerItems for your ListView drawerList.

0

You can also make the drawer always opened by... just placing it's content in the main layout, removing the DrawerLayout. You can easily achieve this by providing a different layout resource for tablets in which your drawer's content is placed directly in the root layout.

stan0
  • 11,549
  • 6
  • 42
  • 59