Использование ScrollView в навигационном ящике

У меня есть один ListView и два ImageButtons в моем Nav Drawer. Моя проблема в том, что если мой Listview выходит за пределы экрана, он прокручивается, чтобы показать только все элементы списка, а не две кнопки изображения ниже.

Чтобы решить эту проблему, я попытался добавить ScrollView, чтобы обернуть LinearLayout (@+id/drawer), но это дает мне следующую ошибку.

Возможно ли иметь NavDrawer с дополнительными элементами (кроме списка) и иметь общий скроллер?

<FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <ScrollView
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:background="@drawable/texturebg2"
        android:layout_gravity="start">

    <LinearLayout
        android:id="@+id/drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:background="@drawable/texturebg2"
        android:layout_gravity="start">

        <ListView
            android:id="@+id/list_slidermenu"
            android:layout_width="240dp"
            android:layout_height="wrap_content"
            android:layout_gravity="start"
            android:choiceMode="singleChoice"
            android:divider="@color/col3"
            android:dividerHeight="1dp"
            android:listSelector="@drawable/menu_selector" />

        <LinearLayout
            android:id="@+id/extrabuttons"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:orientation="horizontal"
            android:gravity="center_horizontal|bottom"
            android:layout_marginTop="15dp"
            android:layout_marginBottom="15dp" >
            <ImageButton
                android:id="@+id/credit"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:contentDescription = "@string/credit"
                android:onClick="openCredit"
                android:src="@drawable/information"
                android:background="@drawable/mybutton2"
                android:padding="8dip"
                android:text="@string/credit" />

            <ImageButton
                android:id="@+id/exit"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:contentDescription = "@string/exit"
                android:onClick="closeApp"
                android:src="@drawable/ic_exit"
                android:background="@drawable/mybutton2"
                android:padding="8dip"
                android:layout_marginLeft="10dp"
                android:text="@string/exit" />
        </LinearLayout>
    </LinearLayout>
    </ScrollView>

Логкат

01-09 14:04:02.446: E/AndroidRuntime(1072): FATAL EXCEPTION: main
01-09 14:04:02.446: E/AndroidRuntime(1072): Process: com.migrationdesk.mylibman, PID: 1072
01-09 14:04:02.446: E/AndroidRuntime(1072): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.migrationdesk.mylibman/com.migrationdesk.mylibman.NavContainer}: java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams
01-09 14:04:02.446: E/AndroidRuntime(1072):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
01-09 14:04:02.446: E/AndroidRuntime(1072):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
01-09 14:04:02.446: E/AndroidRuntime(1072):     at android.app.ActivityThread.access$700(ActivityThread.java:135)
01-09 14:04:02.446: E/AndroidRuntime(1072):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
01-09 14:04:02.446: E/AndroidRuntime(1072):     at android.os.Handler.dispatchMessage(Handler.java:102)
01-09 14:04:02.446: E/AndroidRuntime(1072):     at android.os.Looper.loop(Looper.java:137)
01-09 14:04:02.446: E/AndroidRuntime(1072):     at android.app.ActivityThread.main(ActivityThread.java:4998)
01-09 14:04:02.446: E/AndroidRuntime(1072):     at java.lang.reflect.Method.invokeNative(Native Method)
01-09 14:04:02.446: E/AndroidRuntime(1072):     at java.lang.reflect.Method.invoke(Method.java:515)
01-09 14:04:02.446: E/AndroidRuntime(1072):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
01-09 14:04:02.446: E/AndroidRuntime(1072):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
01-09 14:04:02.446: E/AndroidRuntime(1072):     at dalvik.system.NativeStart.main(Native Method)
01-09 14:04:02.446: E/AndroidRuntime(1072): Caused by: java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams
01-09 14:04:02.446: E/AndroidRuntime(1072):     at android.support.v4.widget.DrawerLayout.isDrawerView(DrawerLayout.java:857)
01-09 14:04:02.446: E/AndroidRuntime(1072):     at android.support.v4.widget.DrawerLayout.closeDrawer(DrawerLayout.java:1058)
01-09 14:04:02.446: E/AndroidRuntime(1072):     at com.migrationdesk.mylibman.NavContainer.displayView(NavContainer.java:202)
01-09 14:04:02.446: E/AndroidRuntime(1072):     at com.migrationdesk.mylibman.NavContainer.onCreate(NavContainer.java:116)
01-09 14:04:02.446: E/AndroidRuntime(1072):     at android.app.Activity.performCreate(Activity.java:5243)
01-09 14:04:02.446: E/AndroidRuntime(1072):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
01-09 14:04:02.446: E/AndroidRuntime(1072):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
01-09 14:04:02.446: E/AndroidRuntime(1072):     ... 11 more

person abdfahim    schedule 09.01.2014    source источник
comment
Опубликовать полную трассировку стека? И почему вы хотите использовать framelayout в этом?   -  person Triode    schedule 09.01.2014
comment
обновлено ... framelayout - это контейнер моих фрагментов ... так я нашел все учебники по NavDrawer ...   -  person abdfahim    schedule 09.01.2014


Ответы (3)


<LinearLayout
            android:id="@+id/extrabuttons"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:orientation="horizontal"
            android:gravity="center_horizontal|bottom"
            android:layout_marginTop="15dp"
            android:layout_marginBottom="15dp" >
            <ImageButton
                android:id="@+id/credit"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:contentDescription = "@string/credit"
                android:onClick="openCredit"
                android:src="@drawable/information"
                android:background="@drawable/mybutton2"
                android:padding="8dip"
                android:text="@string/credit" />

            <ImageButton
                android:id="@+id/exit"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:contentDescription = "@string/exit"
                android:onClick="closeApp"
                android:src="@drawable/ic_exit"
                android:background="@drawable/mybutton2"
                android:padding="8dip"
                android:layout_marginLeft="10dp"
                android:text="@string/exit" />
        </LinearLayout>

Поместите вышеуказанный макет в другой файл xml и назовите его footer.xml.

теперь в java-коде, где вы устанавливаете адаптер:

LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view=inflater.inflate(R.layout.footer, null, true);

listView.addFooterView(View);

И просто держите ListView в ящике, например:

<ListView
        android:id="@+id/list_slidermenu"
        android:layout_width="240dp"
        android:layout_height="wrap_content"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@color/col3"
        android:dividerHeight="1dp"
        android:listSelector="@drawable/menu_selector" />

И теперь ваше представление списка будет прокручиваться до этого представления.

person vipul mittal    schedule 09.01.2014

Это кажется мне довольно знакомым, так как я столкнулся с той же проблемой некоторое время назад. Во-первых, оборачивать ListView в ScrollView, как правило, не очень хорошая идея (и, возможно, если вы используете версию Eclipse, интегрированную с Android SDK, вы получили предупреждение), потому что ListView имеет сам скроллер.

Во-вторых, проблема в том, что из-за вашего определения макета ListView расширяется до нижней части экрана, что делает ваши два изображения недоступными.

Я решил эту проблему, обернув содержимое, которое я хотел показать, в LinearLayout с ориентацией vertical, примерно так:

<LinearLayout
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="vertical"
  android:layout_marginTop="20dp" >

  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="#FFFFFF"
    android:textStyle="italic"
    android:textAppearance="?android:attr/textAppearanceMedium" />

  <ListView
    android:id="@+id/chanlist_list"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="1" 
    android:scrollbars="vertical" >
  </ListView>

  <Button
    android:id="@+id/btn_chanlist_close"
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="30dp"
    android:layout_marginTop="10dp"
    android:layout_gravity="center"
    android:onClick="btn_close"
    android:background="@drawable/botones"
    android:textColor="#FFFFFF"
    android:text="@string/btn_close" />          
</LinearLayout>

«Проблема» заключается в том, что макет будет пытаться подогнать экран под все определение макета, т. е. если у вас слишком много элементов в макете, ваш ListView будет сжат на небольшом пространстве, и его будет трудно прокручивать. . Постарайтесь максимально упростить макет.

person nKn    schedule 09.01.2014

вы можете использовать изображение background, так как оно расширит wrap_content, или вы можете использовать пустое изображение и увеличить его размер в коде, используя ImageView.getLayoutParams().width = width; или ImageView.getLayoutParams().height = height;

person Theuser1234    schedule 09.01.2014