onCreateOptionsMenu() dans le fragment de non-remplacement d'un ActionBar menus
Je suis en utilisant le NavigationDrawer dans mon application et remplacer le fragment lorsque vous cliquez sur un élément dans le tiroir. Mon problème que j'ai est que les éléments de menu dans l'ActionBar ne sont pas mis à jour lorsque je modifie le fragment.
J'ai suivi ce tutoriel https://www.grokkingandroid.com/adding-action-items-from-within-fragments/ de près, mais ça ne marche toujours pas dans mon application.
Ajoutant quelques extraits de code de l'activité parent et l'un des Fragments ici.
Ce dont j'ai besoin est pour afficher les autres options de menu du formulaire de contact fragment (R. menu.contactform_send_menu) lorsque le fragment initial est remplacé par ContactFormFragment.java.
public class MainActivity extends FragmentActivity implements ActionBar.OnNavigationListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle(R.string.app_name);
//Set up the action bar to show a dropdown list.
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
createNavigationDrawer(savedInstanceState);
}
private final int DRAWER_MAIN = 0;
private final int DRAWER_CONTACT = 5;
//update the main content by replacing fragments
private void selectItem(int position) {
Fragment fragment = null;
Bundle args = new Bundle();
boolean isFragment = false;
switch (position) {
case DRAWER_MAIN:
fragment = new WelcomeSectionFragment();
args.putString(WelcomeSectionFragment.ITEM_NAME, dataList.get(position).getItemName());
args.putInt(WelcomeSectionFragment.IMAGE_RESOURCE_ID, dataList.get(position).getImgResID());
getActionBar().setTitle(R.string.app_name);
isFragment = true;
break;
case DRAWER_CONTACT:
fragment = new ContactFormFragment();
args.putString(ContactFormFragment.ITEM_NAME, dataList.get(position).getItemName());
args.putInt(ContactFormFragment.IMAGE_RESOURCE_ID, dataList.get(position).getImgResID());
getActionBar().setTitle(R.string.contactform_title);
isFragment = true;
break;
default:
break;
}
if (isFragment) {
fragment.setArguments(args);
FragmentManager frgManager = getFragmentManager();
frgManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
mDrawerList.setItemChecked(position, true);
setTitle(dataList.get(position).getItemName());
mDrawerLayout.closeDrawer(mDrawerList);
}
}
}
et le fragment:
public class ContactFormFragment extends Fragment {
public ContactFormFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ca = getActivity();
Reachability.registerReachability(ca.getApplicationContext());
settings = ca.getSharedPreferences(Konstanten.PREFERENCES_FILE, 0);
member = new Gson().fromJson(settings.getString(Konstanten.MEMBER_OBJECT, null), Member.class);
latoFontLight = Tools.getFont(ca.getAssets(), "Lato-Light.ttf");
latoFontBold = Tools.getFont(ca.getAssets(), "Lato-Bold.ttf");
//Update action bar menu items?
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
//Do something that differs the Activity's menu here
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
if (Build.VERSION.SDK_INT >= 11) {
//selectMenu(menu);
inflater.inflate(R.menu.contactform_send_menu, menu);
}
}
}
Lors du débogage, je peux voir que setHasOptionsMenu(true); qui est appelé dans onCreate() et je reçois aussi dans le onCreateOptionsMenu() de ContactFormFragment.java. Je ne comprends juste pas pourquoi la barre d'action et conserve ses initiales des éléments de menu et de ne pas les remplacer. Ce qui me manque?
Merci pour toute aide.
onCreateOptionsMenu()
dans votre Activity
par la suite (après la fermeture du tiroir)?oui, c'est fait. Une fois le tiroir fermé onCreateOptionsMenu() est appelée de nouveau dans le parent de l'Activité. Je suppose que ce qui détruit les éléments de menu à partir du fragment. Comment puis-je éviter cela?
essayez d'appeler le menu.clear() et le inflater.gonfler avant super.onCreateOptionsMenu()
OriginalL'auteur e-nature | 2014-04-26
Vous devez vous connecter pour publier un commentaire.
Essayer de mettre
setHasOptionsMenu(true);
à l'intérieur de laonCreateView()
de votreChildFragment.java
Je n'en vois pas dans le code que vous avez posté.
Vais essayer cela plus tard à la maison. Merci pour cette.
OriginalL'auteur tricknology
Je l'ai eu à travailler! Le problème que j'ai eu est que j'ai ajouté un custom menu déroulant pour le principal fragment. Donc, chaque fois que je change le fragment à travers le tiroir de navigation j'ai manuellement pour supprimer le menu déroulant et lors du retour à la principale fragment, je vais l'ajouter de nouveau.
Voici ce que j'ai fait:
Dans le parent de l'activité:
MainActivity.java:
et voici la partie du fragment(s):
ChildFragment.java
Si il ya des meilleures solutions, je suis très intéressé par vos idées.
OriginalL'auteur e-nature
Il y a deux cas à considérer:
Nous allons commencer avec l'option 2 car c'est le cas le plus fréquent.
Si vous avez fragment éléments spécifiques et globaux des éléments dans le même temps, vous ne voulez pas utiliser
onCreateOptionsMenu()
dans le fragment. La raison en est qu'il aurait l'air bizarre, même si elle a travaillé. Le fragment actions devraient être ajoutés après la création du fragment, les éléments pourraient être ajoutés après le tiroir est fermé (par défaut). Je pense qu'aucun utilisateur ne souhaitez que.Ce que vous pourriez faire pour laisser le fragment de décider quels articles à afficher est de créer une interface pour tous les fragments à mettre en œuvre. Cela pourrait définir une méthode qui permettrait le retour de l'id de menu pour le menu à gonfler ou
-1
si le menu ne doivent être gonflés.Dans le cas de l'option 1, je ne peux que supposer que vous
clear()
le menu dans l'Activité deonCreateOptionsMenu()
. Sinon, il ne serait pas supprimer les fragments des entrées de menu. Donc, simplement se débarrasser de laclear()
et tout doit être beau.J'ai trouvé la solution et a répondu par une question. Le principal problème était que j'avais un menu déroulant dans un fragment qui ne disparaissent pas lors de la commutation du fragment. J'ai donc dû supprimer manuellement chaque fois que je change de fragment fragment de 0 à n.
Tout d'abord, plutôt que de mettre en place une interface de fragments, peut-être vous avez de l'activité de l'appel
setHasOptionsMenu(true/false)
directement sur le fragment en fonction du tiroir de l'état. MAIS, il y a un autre problème lors de l'utilisation de imbriquée fragments - l'activité aurait pour atteindre son fragment de l'arbre et de chasser tous les fragments pour activer les menus off. Par conséquent, il est préférable de renverser le paradigme et de tous les fragments de l'utilisation getActivity() et de mettre en œuvre une interface sur l'activité de révéler le tiroir ouvert/proche de l'état.OriginalL'auteur Wolfram Rittmeyer