2014-06-21 2 views
2

Je suis actuellement en train d'essayer de programmer un Android Launcher avec Fragments mais j'ai des problèmes avec le Views sur le Fragments. J'ai un Dock-Fragmen t avec un Dock-Controller qui permettent à l'utilisateur de changer des fragments, tels que le menu des applications, les fragments de paramètres, etc. Le Dock est affiché sur le côté de l'affichage, le Fragments (menu apps, fragment de paramètres) devrait être affiché ci-dessus le Dock. Le problème est, que le menu des applications n'est pas montré dans son Fragment associé, mais plutôt dans le Dock Fragment derrière les icônes de quai, ... Donc je suppose, le fragment de menu app obtient la mauvaise vue dans son onCreateView() -Method, mais je ne Ne comprends pas pourquoi.Fragment semble gonfler mauvaise vue

Ceci est le code du MainActivity qui s'étend de FragmentActivity. J'ajoute les fragments au manager.

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(); 

} 

Les mises en page sont codés en dur au moment 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; 
} 

Le MainActivity's xml ressemble à ça:

<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> 

Le xml du menu des applications est un gridview et ressemble que:

<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> 

Le App Fragment ressemble que:

@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); 
} 

Et la getView Méthode du GridViewAdapter:

@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; 
} 

J'espère que ce que je l'ai mentionné est assez pour résoudre le problème. Je recherche sur le web pendant des heures mais je n'ai trouvé aucune solution.

Répondre

0

C'est un problème beaucoup plus simple que je pense.

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; 
} 

devrait être:

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; 
} 

Parce que la structure switch-case est encore essentiellement une simple goto organisée, et non en fait une structure if-else, alias si vous ne cassez pas, alors tout les cas seront exécutés séquentiellement.

+0

Merci! 3 ans d'étude et problèmes de switch-case, ... – user3762869

+0

Haha, pas de problème: P Ça m'arrive aussi, c'est pourquoi j'utilise plutôt les structures if-elseif-else, même si les gens disent que les switchs sont "plus jolis": ré – EpicPandaForce

0

J'ai trouvé le problème. Et c'était dans une partie du code que je ne m'attendais pas à ce que ce soit.

Le Dummy-Switch-Case dans dbConnection l'a causé. Apparemment, les chaînes ne sont pas comparées par valeur mais plutôt par référence dans un tel Switch-Case. Donc, il a toujours choisi la disposition du conteneur de dock à associer au menu de l'application dans le gestionnaire de fragment, ...

+0

Non, je pense que le problème est qu'il n'y a pas d'instruction "break" après chaque cas dans le commutateur. – EpicPandaForce

Questions connexes