android - Customize NavigationDrawer with RelativeLayout? -


i want picture on top of navigationdrawer , below listview contains navigation items. set linearlayout navigationdrawer contains imageview , listview. unfortunately doesnt work , error:

10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime: fatal exception: main 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime: java.lang.runtimeexception: unable start activity componentinfo{com.example.pymdev.pym_app/com.example.pymdev.pym_app.menuactivity}: java.lang.illegalstateexception: specified child has parent. must call removeview() on child's parent first. 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.app.activitythread.performlaunchactivity(activitythread.java:2114) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.app.activitythread.handlelaunchactivity(activitythread.java:2139) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.app.activitythread.access$700(activitythread.java:143) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.app.activitythread$h.handlemessage(activitythread.java:1241) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.os.handler.dispatchmessage(handler.java:99) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.os.looper.loop(looper.java:137) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.app.activitythread.main(activitythread.java:4960) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ java.lang.reflect.method.invokenative(native method) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ java.lang.reflect.method.invoke(method.java:511) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:1038) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ com.android.internal.os.zygoteinit.main(zygoteinit.java:805) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ dalvik.system.nativestart.main(native method) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:  caused by: java.lang.illegalstateexception: specified child has parent. must call removeview() on child's parent first. 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.view.viewgroup.addviewinner(viewgroup.java:3439) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.view.viewgroup.addview(viewgroup.java:3310) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.support.v4.widget.drawerlayout.addview(drawerlayout.java:1730) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.view.viewgroup.addview(viewgroup.java:3286) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.view.layoutinflater.rinflate(layoutinflater.java:761) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.view.layoutinflater.inflate(layoutinflater.java:495) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.view.layoutinflater.inflate(layoutinflater.java:397) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.view.layoutinflater.inflate(layoutinflater.java:353) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.support.v7.app.appcompatdelegateimplv7.setcontentview(appcompatdelegateimplv7.java:255) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.support.v7.app.appcompatactivity.setcontentview(appcompatactivity.java:109) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ com.example.pymdev.pym_app.menuactivity.oncreate(menuactivity.java:51) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.app.activity.performcreate(activity.java:5203) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.app.instrumentation.callactivityoncreate(instrumentation.java:1094) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.app.activitythread.performlaunchactivity(activitythread.java:2078) 10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.app.activitythread.handlelaunchactivity(activitythread.java:2139)  10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.app.activitythread.access$700(activitythread.java:143)  10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.app.activitythread$h.handlemessage(activitythread.java:1241)  10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.os.handler.dispatchmessage(handler.java:99)  10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.os.looper.loop(looper.java:137)  10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ android.app.activitythread.main(activitythread.java:4960)  10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ java.lang.reflect.method.invokenative(native method)  10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ java.lang.reflect.method.invoke(method.java:511)  10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:1038)  10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ com.android.internal.os.zygoteinit.main(zygoteinit.java:805)  10-22 16:39:00.609 6555-6555/com.example.pymdev.pym_app e/androidruntime:     @ dalvik.system.nativestart.main(native method)  

my fragment_navigation_drawer.xml:

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     tools:context="com.example.pymdev.pym_app.navigationdrawerfragment"     android:id="@+id/navdrawerlinearlayout"     android:orientation="horizontal" android:layout_width="match_parent"     android:layout_height="match_parent"     >     <imageview         android:id="@+id/navdrawerimageview"         android:layout_width="match_parent"         android:layout_height="50dp"         android:src="@drawable/pym_cooler_drawer"/>     <listview xmlns:android="http://schemas.android.com/apk/res/android"         xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"         android:id="@+id/navdrawerlistview"         android:layout_height="match_parent" android:choicemode="singlechoice"         android:divider="@color/dark_divider" android:dividerheight="1dp"         android:background="@android:color/black"         android:listselector="@drawable/drawer_selection"         tools:context="com.example.pymdev.pym_app.navigationdrawerfragment" /> </linearlayout> 

my activity_menu.xml:

<!-- drawerlayout intended used top-level content view using match_parent both width , height consume full space available. --> <android.support.v4.widget.drawerlayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout"     android:layout_width="match_parent" android:layout_height="match_parent"     tools:context="com.example.pymdev.pym_app.menuactivity">      <!-- main content view, view below consumes entire          space available using match_parent in both dimensions. -->     <framelayout android:id="@+id/container" android:layout_width="match_parent"         android:layout_height="match_parent" />      <!-- android:layout_gravity="start" tells drawerlayout treat          sliding drawer on left side left-to-right          languages , on right side right-to-left languages.          if you're not building against api 17 or higher, use          android:layout_gravity="left" instead. -->     <!-- drawer given fixed width in dp , extends full height of          container. -->     <fragment android:id="@+id/navigation_drawer"         android:layout_width="@dimen/navigation_drawer_width" android:layout_height="match_parent"         android:layout_gravity="start"         android:name="com.example.pymdev.pym_app.navigationdrawerfragment"         tools:layout="@layout/fragment_navigation_drawer" /> </android.support.v4.widget.drawerlayout> 

navigationdrawerfragment class:

public class navigationdrawerfragment extends fragment {      /**      * remember position of selected item.      */     private static final string state_selected_position = "selected_navigation_drawer_position";      /**      * per design guidelines, should show drawer on launch until user manually      * expands it. shared preference tracks this.      */     private static final string pref_user_learned_drawer = "navigation_drawer_learned";      /**      * pointer current callbacks instance (the activity).      */     private navigationdrawercallbacks mcallbacks;      /**      * helper component ties action bar navigation drawer.      */     private actionbardrawertoggle mdrawertoggle;      private drawerlayout mdrawerlayout;     private listview mdrawerlistview;     /* top pic need linear layout wrapper */      private linearlayout mdrawerlinearlayout;      private view mfragmentcontainerview;      private int mcurrentselectedposition = 0;     private boolean mfromsavedinstancestate;     private boolean muserlearneddrawer;      public navigationdrawerfragment() {     }      @override     public void oncreate(bundle savedinstancestate) {         super.oncreate(savedinstancestate);          // read in flag indicating whether or not user has demonstrated awareness of         // drawer. see pref_user_learned_drawer details.         sharedpreferences sp = preferencemanager.getdefaultsharedpreferences(getactivity());         muserlearneddrawer = sp.getboolean(pref_user_learned_drawer, false);          if (savedinstancestate != null) {             mcurrentselectedposition = savedinstancestate.getint(state_selected_position);             mfromsavedinstancestate = true;         }          // select either default item (0) or last selected item.         selectitem(mcurrentselectedposition);     }      @override     public void onactivitycreated(bundle savedinstancestate) {         super.onactivitycreated(savedinstancestate);         // indicate fragment influence set of actions in action bar.         sethasoptionsmenu(true);     }       @override     public view oncreateview(layoutinflater inflater, viewgroup container,                              bundle savedinstancestate) {         /* inflate whole linear layout drawer */         mdrawerlinearlayout = (linearlayout) inflater.inflate(                 r.layout.fragment_navigation_drawer, container, false);          /* find encapsulated listview */         mdrawerlistview = (listview) mdrawerlinearlayout.findviewbyid(r.id.navdrawerlistview);         /*         mdrawerlistview = (listview) inflater.inflate(                 r.layout.fragment_navigation_drawer, container, false);         */          mdrawerlistview.setonitemclicklistener(new adapterview.onitemclicklistener() {             @override             public void onitemclick(adapterview<?> parent, view view, int position, long id) {                 selectitem(position);             }         });           //use custom adapter instead:         mdrawerlistview.setadapter(new customnavadapter(                 navigationdrawerfragment.this.getactivity(),                 getresources().getstringarray(r.array.section_titles),                 new integer[]{                         r.mipmap.ic_launcher,                         r.mipmap.ic_launcher,                         r.mipmap.ic_launcher,                         r.mipmap.ic_launcher,                         r.mipmap.ic_launcher,                         r.mipmap.ic_launcher,                 }));          mdrawerlistview.setitemchecked(mcurrentselectedposition, true);         return mdrawerlistview;     }      /* custom array adapter tu support images , pictures combined */     public class customnavadapter extends arrayadapter<string> {         private final activity _context;         private final string[] _text;         private final integer[] _imageid;          public customnavadapter(activity context, string[] text, integer[] imageid) {             super(context, r.layout.navigation_drawer_textview, text);             this._context = context;             this._text = text;             this._imageid = imageid;         }          @override         public view getview(int position, view convertview, viewgroup parent) {              layoutinflater inflater = _context.getlayoutinflater();             view rowview = inflater.inflate(r.layout.navigation_drawer_textview, null, true);             textview txttitle = (textview) rowview.findviewbyid(r.id.text);             imageview imageview = (imageview) rowview.findviewbyid(r.id.icon);             txttitle.settext(_text[position]);             imageview.setimageresource(_imageid[position]);              sharedpreferences sharedpreferences = preferencemanager.getdefaultsharedpreferences(getactivity());             int selectedposition = sharedpreferences.getint("selected_position_key", -1);             /*             if (selectedposition == position) {                 reviewimageview.setimageresource(yourselectedimageresource);             }             */             return rowview;         }        }      public boolean isdraweropen() {         return mdrawerlayout != null && mdrawerlayout.isdraweropen(mfragmentcontainerview);     }      /**      * users of fragment must call method set navigation drawer interactions.      *      * @param fragmentid   android:id of fragment in activity's layout.      * @param drawerlayout drawerlayout containing fragment's ui.      */     public void setup(int fragmentid, drawerlayout drawerlayout) {         mfragmentcontainerview = getactivity().findviewbyid(fragmentid);         mdrawerlayout = drawerlayout;          // set custom shadow overlays main content when drawer opens         mdrawerlayout.setdrawershadow(r.drawable.drawer_shadow, gravitycompat.start);         // set drawer's list view items , click listener          actionbar actionbar = getactionbar();         actionbar.setdisplayhomeasupenabled(true);         actionbar.sethomebuttonenabled(true);          // actionbardrawertoggle ties the proper interactions         // between navigation drawer , action bar app icon.         mdrawertoggle = new actionbardrawertoggle(                 getactivity(),                    /* host activity */                 mdrawerlayout,                    /* drawerlayout object */                 r.string.navigation_drawer_open,  /* "open drawer" description accessibility */                 r.string.navigation_drawer_close  /* "close drawer" description accessibility */         ) {             @override             public void ondrawerclosed(view drawerview) {                 super.ondrawerclosed(drawerview);                 if (!isadded()) {                     return;                 }                  getactivity().supportinvalidateoptionsmenu(); // calls onprepareoptionsmenu()             }              @override             public void ondraweropened(view drawerview) {                 super.ondraweropened(drawerview);                 if (!isadded()) {                     return;                 }                  if (!muserlearneddrawer) {                     // user manually opened drawer; store flag prevent auto-showing                     // navigation drawer automatically in future.                     muserlearneddrawer = true;                     sharedpreferences sp = preferencemanager                             .getdefaultsharedpreferences(getactivity());                     sp.edit().putboolean(pref_user_learned_drawer, true).apply();                 }                  getactivity().supportinvalidateoptionsmenu(); // calls onprepareoptionsmenu()             }         };          // if user hasn't 'learned' drawer, open introduce them drawer,         // per navigation drawer design guidelines.         if (!muserlearneddrawer && !mfromsavedinstancestate) {             mdrawerlayout.opendrawer(mfragmentcontainerview);         }          // defer code dependent on restoration of previous instance state.         mdrawerlayout.post(new runnable() {             @override             public void run() {                 mdrawertoggle.syncstate();             }         });          mdrawerlayout.setdrawerlistener(mdrawertoggle);     }      private void selectitem(int position) {         mcurrentselectedposition = position;         if (mdrawerlistview != null) {             mdrawerlistview.setitemchecked(position, true);         }         if (mdrawerlayout != null) {             mdrawerlayout.closedrawer(mfragmentcontainerview);         }         if (mcallbacks != null) {             mcallbacks.onnavigationdraweritemselected(position);         }     }      @override     public void onattach(activity activity) {         super.onattach(activity);         try {             mcallbacks = (navigationdrawercallbacks) activity;         } catch (classcastexception e) {             throw new classcastexception("activity must implement navigationdrawercallbacks.");         }     }      @override     public void ondetach() {         super.ondetach();         mcallbacks = null;     }      @override     public void onsaveinstancestate(bundle outstate) {         super.onsaveinstancestate(outstate);         outstate.putint(state_selected_position, mcurrentselectedposition);     }      @override     public void onconfigurationchanged(configuration newconfig) {         super.onconfigurationchanged(newconfig);         // forward new configuration drawer toggle component.         mdrawertoggle.onconfigurationchanged(newconfig);     }      @override     public void oncreateoptionsmenu(menu menu, menuinflater inflater) {         // if drawer open, show global app actions in action bar. see         // showglobalcontextactionbar, controls top-left area of action bar.         if (mdrawerlayout != null && isdraweropen()) {             inflater.inflate(r.menu.global, menu);             showglobalcontextactionbar();         }         super.oncreateoptionsmenu(menu, inflater);     }      @override     public boolean onoptionsitemselected(menuitem item) {         if (mdrawertoggle.onoptionsitemselected(item)) {             return true;         }          if (item.getitemid() == r.id.action_logout) {             /* logout facebook */             loginmanager.getinstance().logout();             /* switch login screen */             intent intent = new intent(getactivity(), loginactivity.class);             startactivity(intent);               toast.maketext(getactivity(), "logout!", toast.length_short).show();             return true;         }          return super.onoptionsitemselected(item);     }      /**      * per navigation drawer design guidelines, updates action bar show global app      * 'context', rather what's in current screen.      */     private void showglobalcontextactionbar() {         actionbar actionbar = getactionbar();         actionbar.setdisplayshowtitleenabled(true);         actionbar.setnavigationmode(actionbar.navigation_mode_standard);         actionbar.settitle(r.string.app_name);     }      private actionbar getactionbar() {         return ((appcompatactivity) getactivity()).getsupportactionbar();     }      /**      * callbacks interface activities using fragment must implement.      */     public static interface navigationdrawercallbacks {         /**          * called when item in navigation drawer selected.          */         void onnavigationdraweritemselected(int position);     } } 

can please help? lot.

totally shot in dark, here, because there lot of java code don't feel looking through, looks fragment xml misconfigured. maybe started listview, wrapped in linearlayout? try instead.

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     tools:context="com.example.pymdev.pym_app.navigationdrawerfragment"     android:id="@+id/navdrawerlinearlayout"     android:orientation="horizontal"      android:layout_width="match_parent"     android:layout_height="match_parent"     >     <imageview         android:id="@+id/navdrawerimageview"         android:layout_width="match_parent"         android:layout_height="50dp"         android:src="@drawable/pym_cooler_drawer"/>      <listview          android:layout_width="match_parent"         android:id="@+id/navdrawerlistview"         android:layout_height="match_parent"          android:choicemode="singlechoice"         android:divider="@color/dark_divider"          android:dividerheight="1dp"         android:background="@android:color/black"         android:listselector="@drawable/drawer_selection" /> </linearlayout> 

Comments

Popular posts from this blog

php - Invalid Cofiguration - yii\base\InvalidConfigException - Yii2 -

How to show in django cms breadcrumbs full path? -

ruby on rails - npm error: tunneling socket could not be established, cause=connect ETIMEDOUT -