我在Android UI开发方面相对较新。所以我需要更有经验的开发人员的帮助
我正在使用Navigation Drawer
创建我的应用,我遇到了很多问题
首先,这是导航抽屉的示例代码。
<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">
<!-- The main content view -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- The navigation drawer -->
<ListView android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#111"/>
</android.support.v4.widget.DrawerLayout>
这是来自官方网站的简单示例。
主要内容视图(上面的FrameLayout)必须是第一个子视图 在DrawerLayout中,因为XML顺序意味着z-ordering和 抽屉必须位于内容之上。
在此示例中,有两个嵌套视图:前面提到的用于存储主要内容的FrameLayout
和用于表示ListView
菜单的NavigationDrawer
。
所以这是我的问题。
FrameLayout
容器用于保存Fragment ONLY ONE片段,如果我的Activity有两个,三个或更多片段,我该怎么办?在这种情况下,最佳解决方案是什么。BaseActivity
(我已经在stackoverflow上读到了答案),它将保存NavigationDrawer
的所有配置内容。但就导航抽屉在XML活动布局中需要DrawerLayout
而言,BaseActivity
应调用setContentView
方法。从BaseActivity
活动继承的所有活动应该做一些技巧来设置自己的布局,或者覆盖这个方法没有意义,因为它会打破所有逻辑。在这种情况下该怎么办? 对于第二个问题,我有一些想法如何解决这个问题,但不知道它是正确的方法,哪种方法更好。
第一个想法是实现TemplateMethod模式。在BaseActivity
中创建类似setupCustomViewGroup()
的方法并在所有活动中覆盖它从xml中膨胀所需的视图组并从此方法返回它,而不是在膨胀整个视图中使用它。
或者向Activity显式添加视图,使用merge和include标记。
但是这又可以仅对整个活动或一个片段有用,如果我们有更多片段,使用嵌套片段怎么办,我认为这是个坏主意。
此外,我的目标是优化视图层次结构,使其快速高效,以便在旧设备上实现平滑。
对于能够描述或建议在这种情况下使用最有效和正确的方法来使UI响应和代码可读的人,我将非常感激。
谢谢。
答案 0 :(得分:0)
您可以使用片段并从mainActivity中调用它们,如下所示:
MainActivity.java
public class MainActivity extends Activity {
..
..
@Override
protected void onCreate(Bundle savedInstanceState) {
..
mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
}
/**
* Slide menu item click listener
* */
private class SlideMenuClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// display view for selected nav drawer item
displayView(position);
}
}
/**
* Diplaying fragment view for selected nav drawer list item
* */
private void displayView(int position) {
// update the main content by replacing fragments
Fragment fragment = null;
switch (position) {
case 0:
fragment = new HomeFragment();
break;
case 1:
fragment = new FindPeopleFragment();
break;
case 2:
fragment = new PhotosFragment();
break;
case 3:
fragment = new CommunityFragment();
break;
case 4:
fragment = new PagesFragment();
break;
case 5:
fragment = new WhatsHotFragment();
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container, fragment).commit();
// update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
setTitle(navMenuTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
} else {
// error in creating fragment
Log.e("MainActivity", "Error in creating fragment");
}
}
}
查看this教程,它可能会对您有所帮助
答案 1 :(得分:0)
解决方案:
1。我可以在这里考虑2个案例:
replace
FrameLayout
处content_frame
个片段。 navigation drawer
内容对他们来说仍然相同navigation drawer
内容布局,并在活动之间切换时使用setHasOptionsMenu(true)
调用。 2。如果您使用ListView
作为navigation drawer
,则可以通过动态填充row
ListView
来轻松完成工作。对于此方案,尽可能避免从BaseActivity
覆盖。如果您没有使用ListView
作为navigation drawer
内容,那么您可以为上面的点 1
3。我认为Google+
应用程序使用ListView
作为navigation drawer
设计的custom
。这取决于您的应用程序的需求,您可以使用List
,也可以为您的应用程序创建simple
自定义布局
我希望我的解决方案能在某种程度上解决您的疑虑
答案 2 :(得分:0)
1)从NavigationDrawer迁移到SlideMenu(在github上可用)。
2)确保您的BaseActivity完全没有布局。
3)通过ArrayAdapter为您的listview项目充气。
希望有帮助。