我目前正在尝试使用Android Launcher
对Fragments
进行编程,但我对Views
上的Fragments
有疑问。
我有Dock-Fragmen
t Dock-Controller
,允许用户更改片段,例如应用菜单,设置片段等。Dock
显示在显示屏的按钮上,Fragments
{1}}(应用菜单,设置片段)应显示在Dock
上方。
问题是,应用程序菜单没有显示在其关联的Fragment
中,而是显示在停靠栏图标后面的Dock Fragment
中......所以我想,应用程序菜单片段会在其中显示错误的视图onCreateView()
- 方法,但我不明白为什么。
这是从MainActivity
延伸的FragmentActivity
的代码。我将片段添加到管理器中。
private void addDockToManager() {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(dbConnection.getLayout(DOCK_TAG), dockController.getFragment(), DOCK_TAG);
ft.commit();
}
private void addPluginsToManager() {
FragmentManager fm = null;
FragmentTransaction ft = null;
for(String key : controllerMap.keySet()) {
fm = getSupportFragmentManager();
ft = fm.beginTransaction();
FrameController controller = null;
if ((controller = controllerMap.get(key)) != null) {
ft.add(dbConnection.getLayout(key), controller.getFragment(), key);
if (key.equals(standardFrame))
ft.addToBackStack(key);
}
ft.commit();
fm.executePendingTransactions();
}
fm = getSupportFragmentManager();
ft = fm.beginTransaction();
for(String key : controllerMap.keySet()) {
if (controllerMap.get(key) != null && !key.equals(standardFrame)) {
ft.hide(fm.findFragmentByTag(key));
}
}
ft.commit();
}
目前,dbConnection
中的布局是硬编码的:
public int getLayout(String name) {
int layout = -1;
switch(name) {
case "app_menu" : layout = R.id.fl_app_menu;
case "settings" : layout = R.id.fl_settings;
case "dock" : layout = R.id.fl_dock;
}
return layout;
}
MainActivity's
xml看起来像这样:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rl_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.activity.MainActivity"
tools:ignore="MergeRootFrame" >
<FrameLayout
android:id="@+id/fl_settings"
android:layout_width="match_parent"
android:layout_height="400dp"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_above="@+id/fl_dock"
android:background="#00ffffff" >
</FrameLayout>
<FrameLayout
android:id="@+id/fl_app_menu"
android:layout_width="match_parent"
android:layout_height="400dp"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_above="@+id/fl_dock"
android:background="#00ffffff" >
</FrameLayout>
<FrameLayout
android:id="@+id/fl_dock"
android:layout_width="match_parent"
android:layout_height="70dp"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true" >
</FrameLayout>
</RelativeLayout>
应用菜单的xml是gridview
,看起来像这样:
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gv_apps"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:numColumns="6"
android:gravity="center"
android:columnWidth="50dp"
android:stretchMode="columnWidth" >
</GridView>
App Fragment
看起来像这样:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup group,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.external_apps, group, false);
layout = (GridView) view.findViewById(R.id.gv_apps);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
GridViewAdapter gridViewAdapter = new GridViewAdapter((AppMenuController) myController, apps);
((GridView) layout).setAdapter(gridViewAdapter);
}
getView
的{{1}}方法:
GridViewAdapter
我希望我提到的足以解决问题。我在网上搜索了几个小时,但我找不到解决方案。
答案 0 :(得分:0)
我发现了问题。它是我从未预料到的代码的一部分。
dbConnection中的Dummy-Switch-Case导致了它。看似字符串不是通过值进行比较,而是通过这种Switch-Case中的引用进行比较。所以它总是选择dock容器布局与片段管理器中的app菜单相关联,......
答案 1 :(得分:0)
这比我想象的要简单得多。
public int getLayout(String name) {
int layout = -1;
switch(name) {
case "app_menu" : layout = R.id.fl_app_menu;
case "settings" : layout = R.id.fl_settings;
case "dock" : layout = R.id.fl_dock;
}
return layout;
}
应该是:
public int getLayout(String name) {
int layout = -1;
switch(name) {
case "app_menu" :
layout = R.id.fl_app_menu;
break;
case "settings" :
layout = R.id.fl_settings;
break;
case "dock" :
layout = R.id.fl_dock;
break;
}
return layout;
}
因为switch-case结构基本上只是一个有组织的goto,而实际上并不是if-else结构,如果你没有突破,那么所有的情况都会按顺序运行。