Android fragments 碎片似乎膨胀了错误的观点
我目前正试图用Android fragments 碎片似乎膨胀了错误的观点,android-fragments,Android Fragments,我目前正试图用片段编写一个安卓启动器,但是片段上的视图有问题。 我有一个Dock Fragment和一个Dock控制器,它允许用户更改片段,例如应用程序菜单、设置片段等。Dock显示在显示屏的按钮上,片段(应用程序菜单、设置片段)应该显示在Dock上方。 问题是,应用程序菜单不显示在其关联的片段中,而是显示在停靠图标后面的停靠片段中,。。。所以我猜,app菜单片段在其onCreateView()-方法中得到了错误的视图,但我不知道为什么 这是从FragmentActivity扩展而来的main活
片段
编写一个安卓启动器
,但是片段
上的视图有问题。
我有一个Dock Fragmen
t和一个Dock控制器
,它允许用户更改片段,例如应用程序菜单、设置片段等。Dock
显示在显示屏的按钮上,片段
(应用程序菜单、设置片段)应该显示在Dock
上方。
问题是,应用程序菜单不显示在其关联的片段中,而是显示在停靠图标后面的停靠片段中,。。。所以我猜,app菜单片段在其onCreateView()
-方法中得到了错误的视图,但我不知道为什么
这是从FragmentActivity
扩展而来的main活动的代码。我将片段添加到管理器中
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;
}
main活动的
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>
<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>
@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);
}
应用程序片段
如下所示:
<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>
<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>
@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);
}
以及GridViewAdapter
的getView
方法:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = new ImageView(controller.getMainActivity().getApplicationContext());
imageView.setImageDrawable(buttons.get(position).getIcon());
imageView.setLayoutParams(new GridView.LayoutParams(65, 65));
return imageView;
}
我希望我提到的足以解决这个问题。我在网上搜索了几个小时,但没有找到解决办法。我找到了问题。这是我从未想到的代码的一部分
dbConnection中的虚拟开关案例导致了它。在这种切换情况下,字符串似乎不是按值比较的,而是按引用比较的。所以它总是选择dock容器布局与fragment manager中的应用程序菜单相关联 这是一个比我想的简单得多的问题
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结构,也就是说,如果你不中断,那么所有的case都将按顺序运行。不,我认为问题是在switch中的每个case之后都没有“break”语句。哈哈,没问题:p这也发生在我身上,这就是为什么我宁愿使用if-elseif-else结构,即使人们说开关“更漂亮”:D