我一直在为我的某个应用添加导航抽屉,我开始想知道从导航抽屉使用ListView
到多个TextView
切换是否更好列出项目。查看Google Design Guidelines on Navigation Drawer content (specifically the section on 'Scrolling'),我注意到多个TextView
可能看起来更好。
目前,我在导航抽屉中使用ListView
和ImageView
(它看起来有点像this。但是,当我滚动导航抽屉时(我会这可以通过转换我的设备格局,因为我的列表中没有足够的项目),只有ListView
滚动,而ImageView
保持原样。我希望它能够更像{{ {3}}
此外,我发现导航抽屉中的ListView
没有涟漪效果this, where the ImageView
is also scrolled with the ListView
,但我的其他ListView
和{{1}中的其他Activity
做的。
我面临的问题是什么?如何解决这些问题?
在谷歌的I / O应用程序(2014年)中,as shown in this image的底部似乎有一个Fragment
,我认为该LinearLayout
负责显示的项目列表。有人可以解释这是如何工作的吗?
答案 0 :(得分:4)
只有ListView滚动,ImageView保持原样
听起来您的抽屉顶部包含ImageView
,然后是ListView
。使用此配置时,只会ListView
滚动(因为它是唯一可以滚动的视图)。
您需要将ImageView
添加为始终位于列表开头的标题。正如其中一条评论建议,请listView.addHeaderView
。
导航底部似乎有一个LinearLayout 抽屉布局我认为负责项目清单 所示。有人可以解释这是如何工作的吗?
他们使用LinearLayout
作为容器来容纳所有TextView
s:
private void createNavDrawerItems() {
mDrawerItemsListContainer = (ViewGroup) findViewById(R.id.navdrawer_items_list);
...
int i = 0;
for (int itemId : mNavDrawerItems) {
mNavDrawerItemViews[i] = makeNavDrawerItem(itemId, mDrawerItemsListContainer);
mDrawerItemsListContainer.addView(mNavDrawerItemViews[i]);
++i;
}
}
我相信他们使用LinearLayout
并以编程方式对所有项目进行充气的原因是可以轻松使用分隔符项目:
private View makeNavDrawerItem(final int itemId, ViewGroup container) {
...
if (itemId == NAVDRAWER_ITEM_SEPARATOR) {
layoutToInflate = R.layout.navdrawer_separator;
} else if (itemId == NAVDRAWER_ITEM_SEPARATOR_SPECIAL) {
layoutToInflate = R.layout.navdrawer_separator;
} else {
layoutToInflate = R.layout.navdrawer_item;
}
...
return view;
}
在ListView
中,您必须创建单独的项目类型并在那里使用分隔符的布局,这可能会变得更加繁琐。
乍一看,但是,这段代码似乎正在重新发明轮子,因为使用ListView
可以实现所有这一切。
答案 1 :(得分:0)
截至2015年5月29日(在 Google I / O 2015 之后),您可以使用 Android设计支持库向您的应用添加NavigationView
(S)。 Android Developer Blogspot article声明如下:
导航视图
navigation drawer可以成为您应用中身份和导航的重要焦点,这里的设计一致性可以让您的应用轻松导航,尤其是初次使用者。
NavigationView
通过提供导航抽屉所需的框架以及通过菜单资源为导航项目充气的功能,使这更容易。...
然后,您可以开始使用具有单个新依赖关系的设计库:
function changeSlider(numslides) { var id_current = 1; var lastlength = 0; var lastlength_owner = 0; $(".slide").each(function() { var texth2 = $(this).children("h1").text(); var texth3 = $(this).children("h3").text(); var totallength = texth2.length + texth3.length; console.log(lastlength); console.log(totallength); if ( (lastlength > totallength) && (id_current == numslides) ) { console.log(totallength); changeSize(lastlength_owner); } if ( (lastlength < totallength) && (id_current == numslides) ) { console.log(totallength); $(".slider").css('height', $(this).height()); } if ( (lastlength < totallength) && (id_current !== numslides) ) { console.log(totallength); var lastlength = totallength; var lastlength_owner = $(this).attr('slide_id'); } id_current++; }); }
...
设计库,AppCompat和所有Android支持库是提供构建现代,外观漂亮的Android应用程序所需的构建块的重要工具,无需从头开始构建所有内容。
答案 2 :(得分:0)
使用android.support.v4.widget.DrawerLayout和NavigationView实现可滚动导航抽屉可能比在下面描述的更简单:http://android-developers.blogspot.ru/2015/05/android-design-support-library.html
该文章建议将应用程序导航抽屉的每个元素添加为菜单项。这很酷,绝对是大多数开发人员的一种方式。 但是如果你已经在例如内部实现了导航抽屉怎么办?线性布局?
看起来您可以轻松地将旧的好布局设置为可滚动:只需将其设置为NavigationView的“app:headerLayout”即可。不需要更改! 因此,在最终解决方案中,您将拥有:
您的活动的布局,类似于上面的博文,但没有“app:menu =”@ menu / drawer“属性,例如:
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<!-- your content layout -->
<android.support.design.widget.NavigationView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/drawer_header"
/>
</android.support.v4.widget.DrawerLayout>
“drawer_header.xml”文件中所有旧Drawer内容的布局,在不对此可滚动Drawer进行任何更改的情况下进行迁移,例如。这样:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:choiceMode="singleChoice"
android:orientation="vertical">
<TextView
android:id="@+id/myFirstButton"
android:onClick="onMyFirstButtonClick"
android:text="@string/my_first_button_title"/>
<TextView
android:id="@+id/goToTheTopButton"
android:onClick="onGoToTheTopButtonClick"
android:text="@string/go_to_the_top_title"/>
<View style="@style/Divider"/>
<!-- Some other "menu items" -->
</LinearLayout>
有关完整的工作示例,请参阅此活动布局:https://github.com/andstatus/andstatus/blob/master/app/src/main/res/layout/timeline.xml和此提交,我将其迁移到可滚动的导航抽屉:https://github.com/andstatus/andstatus/commit/a80b299de714bdd65cacb138ffb31adc3ea23a98