Я использую DrawerLayout
в своем приложении для Android, которое работает нормально, но у меня возникают проблемы с самим меню, где я хочу иметь разборный раздел и некоторые статические элементы в меню.
Точная компоновка, которую я хочу достичь, выглядит следующим образом:
Drawer Title
-> Expandable List
Menu Item 1
Menu Item 2
И когда список Расширяемый открыт, чтобы иметь что-то вроде этого:
Drawer Title
-> Expandable List
Expandable List Item 1
Expandable List Item 2
Menu Item 1
Menu Item 2
Проблема, с которой я столкнулся, заключается в том, что меню, кажется, не сидит в потоке представления, как другие элементы, поэтому, если у меня есть ExpandableListView
внутри NavigationView
, который содержит меню, оно открывается поверх другие пункты меню, и, кажется, нет способа их переместить.
Чтобы попытаться решить эту проблему, я переместил ExpandableListView
в отдельный макет, который обеспечивает заголовок для меню. Теперь все правильно рисует , но Я больше не могу открыть представление списка, что, безусловно, является проблемой. На самом деле он открывается - или, по крайней мере, onGroupExpandListener
срабатывает - но, хотя высота заголовка установлена на wrap_content
и I invalidate
при развертывании и свертывании, размер заголовка остается неизменным. Чтобы обойти это, я вручную изменяю его размер в onGroupExpandListener
и onGroupCollapseListener
следующим образом.
В моем макете у меня есть NavigationView, как это:
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:menu="@menu/drawer_view" >
</android.support.design.widget.NavigationView>
Заголовок выглядит так:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="70dp"
android:background="@color/colorPrimary" >
<ImageView
android:layout_width="70dp"
android:layout_height="70dp"
android:padding="10dp"
app:srcCompat="@drawable/main_icon" />
<TextView
android:id="@+id/drawer_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_gravity="left|start|center"
android:layout_marginStart="70dp"
android:paddingStart="5pt"
android:text="Options"
android:textColor="#FFFFFF"
android:textSize="16pt"
android:textStyle="bold" />
</RelativeLayout>
<ExpandableListView
android:id="@+id/menu_expandable_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" >
</ExpandableListView>
</LinearLayout>
В моем коде я сейчас настраиваю ExpandableListView (в комплекте с кучей лишних хаков, потому что я пытаюсь выяснить проблему) следующим образом:
private void setOptionsMenuItems(final NavigationView menuContainer) {
final View v = menuContainer.inflateHeaderView(R.layout.drawer_header);
final ExpandableListView optionsMenu = (ExpandableListView) v.findViewById(R.id.menu_expandable_list);
final MyExpandableListAdapter adapter = new MyExpandableListAdapter(this, allTheItems );
optionsMenu.setAdapter(adapter);
optionsMenu.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
setCurrentItem(allTheItems[childPosition]);
return true;
}
});
optionsMenu.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
@Override
public void onGroupExpand(int groupPosition) {
v.setMinimumHeight(v.getChildAt(0).getHeight() + adapter.getOpenHeight());
v.invalidate();
}
});
optionsMenu.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {
@Override
public void onGroupCollapse(int groupPosition) {
v.setMinimumHeight(v.getChildAt(0).getHeight() + adapter.getClosedHeight());
v.invalidate();
}
});
}
Эта версия кода правильно расширяет и сжимает заголовок при открытии или закрытии группы (adapter.getOpenHeight()/getClosedHeight()
дает размерность, которую вы ожидаете), но фактические дочерние элементы никогда не отображаются. То же самое увеличение в onGroupClickListener
ничем не отличается, хотя я подозреваю, что дочерние элементы отбираются из вида, потому что система макетов предполагает, что они невидимы, а не изменяются размеры представления. Если я вручную сделаю заголовок выше, чтобы все было видно, когда ExpandableList развернут, он открывается и закрывается как обычно, но, очевидно, это не позволяет мне перемещать другие пункты меню вверх и вниз, что и составляет весь смысл.
Все это кажется чрезмерно сложным для того, что должно быть распространенным вариантом использования , поэтому, если я выбрал совершенно неправильный подход, пожалуйста, дайте мне знать. Все, что я хочу, это чтобы первый элемент в моем меню был ExpandableList, а другие элементы меню были обычными пунктами меню, которые сдвигались вниз при открытии ExpandableList и перемещались обратно вверх при закрытии.
Что мне нужно сделать, чтобы в моем меню был рабочий свернутый список опций?
Редактировать: По прошествии еще некоторого времени происходит то, что список обходится при рисовании новых разделов, потому что он определил, что для них нет видимого места - хотя изменение размера может быть вызвано из onGroupClickListener
фактическое изменение видимого размера не произойдет до следующего прохода чертежа, поэтому, когда базовый ListView проверяет, есть ли место для записи списка, он становится ложным.