片段似乎夸大了错误观点

时间:2014-06-21 13:37:48

标签: android-fragments

我目前正在尝试使用Android LauncherFragments进行编程,但我对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

我希望我提到的足以解决问题。我在网上搜索了几个小时,但我找不到解决方案。

2 个答案:

答案 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结构,如果你没有突破,那么所有的情况都会按顺序运行。

相关问题