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