2017-06-30 181 views
0

我想要做一些從一開始我已經知道實現起來相當困難,並且在屏幕底部放置導航抽屜菜單的頁腳。在屏幕底部設置Android導航抽屜菜單頁腳

事實上,當抽屜的列表視圖項目全部在屏幕上可見並且頁腳應該位於最後一個項目下方時,我需要頁腳完全位於屏幕的底部屏幕和滾動條出現(正常行爲)。

對於我使用的是addFooterView方法在接下來的方式

ViewGroup footer = (ViewGroup)inflater.inflate(R.layout.testme_drawer_footer, mDrawerList, false); 

mDrawerList.addFooterView(footer, null, false); 

哪裏testme_drawer_footer是下一個佈局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/footer_menu_facebook" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="start" 
    android:orientation="horizontal"> 

    <TextView 
     android:id="@+id/drawer_footer" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom" 
     android:background="#8d3169" 
     android:paddingLeft="10dp" 
     android:paddingRight="10dp" 
     android:paddingTop="5dp" 
     android:paddingBottom="5dp" 
     android:textColor="#fff" 
     android:textSize="12sp"/> 

</LinearLayout> 

沒有做任何事情的addFooterView只是表現正常的方式,如果元素全部在屏幕上可見,並且底部留下很多空白空間,頁腳僅放置在最後一個元素下面(對於我試圖達到的效果不好)。

我試着在徒勞無功地掙扎我的頭一會兒我能得到的東西非常接近我後需要不同的StackOverflow的帖子很多建議,這是下一個:

我給所有的列表視圖元素一個固定的高度和相同的標題所以最後我計算頁腳高度與screenHeight - statusBarHeight - actionBarHeight - drawerHeaderHeight - listViewElementHeight * numberOfElements在接下來的方式:

ViewGroup footer = (ViewGroup)inflater.inflate(R.layout.testme_drawer_footer, mDrawerList, false); 

     int screenHeight = GeneralUtils.getScreenHeight(oActivity); 
     int statusBarHeight = GeneralUtils.getStatusBarHeight(oActivity); 
     int actionBarHeight = GeneralUtils.getActionBarHeight(oActivity); 
     int drawerHeaderHeight = GeneralUtils.dp2px(60, oActivity); 
     int menuItemHeight = drawerHeaderHeight; 
     int totalItemsHeight = menuItemHeight*(endItem-startItem+1); 

     int footerHeight = screenHeight - statusBarHeight - actionBarHeight - drawerHeaderHeight - totalItemsHeight; 
     footer.setMinimumHeight(footerHeight); 

     mDrawerList.setFooterDividersEnabled(true); 
     mDrawerList.addFooterView(footer, null, false); 

但它是最有可能的一些的高度測量方法並不十分精確,有在所有測試過的設備中,某些像素的差異並不相同。

我知道這不是最好的辦法,實際上我不喜歡它,我不喜歡爲wrap_content設置固定高度的抽屜頭和元素,我不喜歡計算整體高度這種方式,但無法找到任何其他工作方式來實現這一目標。

任何幫助?

在此先感謝!

這是我設置在所有活動中的ListView方式:

<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"> 

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:id="@+id/llMainMain" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:background="#ffffff" 
        android:orientation="horizontal"> 

    //MAIN CONTENT 

    <ListView 
     android:id="@+id/left_drawer" 
     android:layout_width="@dimen/navigation_drawer_width_phone" 
     android:layout_height="match_parent" 
     android:layout_gravity="left|start" 
     android:headerDividersEnabled="true" 
     android:background="#ffeeeeee"/> 

</android.support.v4.widget.DrawerLayout> 
+0

這可能有幫助https:// stackoverflow。com/questions/30543605/how-to-add-footer-to-navigationview-android-support-design-library – seon

+0

感謝您的回覆和時間@seon,我終於解決了我的問題,就像我在下面描述的那樣。 –

回答

0

掙扎我的頭了整整一天後,我終於找到了一個偉大的,準確的解決方案,我會回答我的問題爲了幫助任何可能面臨同樣問題的人。

關鍵是將固定高度設置爲ListView項目(在我的情況下,我設置了60dp的固定高度)並在TreeView服務器繪製之前計算ListView高度,然後您只需將固定項目高度乘以項目並將此值減去ListView高度。在我而言,我不得不頭部高度(也是固定的)和項目分隔尺寸增加總的ListView的高度,所以最後我的代碼看起來像如下:

final int numberOfItems = endItem - startItem + 1; 
     final ViewTreeObserver treeObserver = mDrawerList.getViewTreeObserver(); 
     treeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 

      @Override 
      public void onGlobalLayout() { 

    mDrawerList.getViewTreeObserver().removeOnGlobalLayoutListener(this); 

       int mDrawerListHeight = mDrawerList.getHeight(); 
       int dividerHeight = mDrawerList.getDividerHeight() * numberOfItems; 
       int footerHeight = calculateFooterHeight(oActivity, mDrawerListHeight, numberOfItems, dividerHeight); 

       ViewGroup footer = (ViewGroup)inflater.inflate(R.layout.testme_drawer_footer, mDrawerList, false); 
       footer.setMinimumHeight(footerHeight); 

       mDrawerList.setFooterDividersEnabled(true); 
       mDrawerList.addFooterView(footer, null, false); 

       UserSession us = new UserSession(oActivity); 
       String footerText = us.getUserSession().getAlias(); 

       TextView tvDrawerFooter = (TextView) oActivity.findViewById(R.id.drawer_footer); 
       tvDrawerFooter.setText(footerText); 

       // Set the list's click listener 
       DrawerItemClickListener drawer = new DrawerItemClickListener(); 
       drawer.oActivity = oActivity; 
       mDrawerList.setOnItemClickListener(drawer); 
      } 
     }); 

private static int calculateFooterHeight(Activity oActivity, int listViewHeight, int numberOfItems, int dividerHeight){ 

     int drawerHeaderHeight = GeneralUtils.dp2px(60, oActivity); 
     int menuItemHeight = drawerHeaderHeight; 
     int totalItemsHeight = menuItemHeight * numberOfItems; 

     return listViewHeight - drawerHeaderHeight - totalItemsHeight - dividerHeight; 
    } 

我真的希望我能幫助別人有同樣的問題。