Gérer la barre d'outils de navigation et bouton de retour à partir de fragment dans android
Tous mes fragments sont contrôlés par ActionBarActivity
(mainActivity), à l'intérieur mainActivity un DrawerLayout
est mis en place et tous les enfants fragments sont poussés par la drawerLayout de l'élément de la liste cliquez sur. Le problème que je me pose est après avoir poussé un fragment à travers drawerLayout je veux changer le tiroir icône icône de retour en arrière de ToolBar
de sorte que l'utilisateur peut naviguer fragment précédent et à gérer le rappel de android.R.id.home
soit à l'intérieur du même fragment ou à l'intérieur de la mainActivity.
Le code que j'utilise est:
MainActivity.java
public class MainActivity extends ActionBarActivity {
private DrawerLayout layoutDrawer;
private ActionBarDrawerToggle drawerToggler;
private Stack<Fragment> stack;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
stack = new Stack<Fragment>();
layoutDrawer = (DrawerLayout) findViewById(R.id.layout_drawer);
drawerToggler = new ActionBarDrawerToggle(this, layoutDrawer, toolbar,
R.string.app_name, R.string.app_name);
layoutDrawer.setDrawerListener(drawerToggler);
setUpDrawerList();
pushFragment(new FirstFragment(), true);
Session.setContext(getApplicationContext());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggler.isDrawerIndicatorEnabled()
&& drawerToggler.onOptionsItemSelected(item))
return true;
switch (item.getItemId()) {
case android.R.id.home:
Toast.makeText(this, "Back from activity", Toast.LENGTH_SHORT)
.show();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
drawerToggler.syncState();
}
@Override
public void onBackPressed() {
popFragment();
}
private void setUpDrawerList() {
ListView listView = (ListView) findViewById(R.id.list_drawer);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
Arrays.asList(new String[] { "First Fragment",
"Second Fragment" }));
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
layoutDrawer.closeDrawers();
drawerToggler.setDrawerIndicatorEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
pushFragment(getFragment(position), true);
}
});
}
private Fragment getFragment(int pos) {
switch (pos) {
case 0:
return new FirstFragment();
case 1:
return new SecondFragment();
}
return null;
}
public void pushFragment(Fragment fragment, boolean add) {
FragmentTransaction transation = getSupportFragmentManager()
.beginTransaction();
if (add)
stack.push(fragment);
transation.replace(R.id.layout_content, fragment);
transation.commit();
}
public void popFragment() {
if (!stack.isEmpty()) {
Fragment fragment = stack.elementAt(stack.size() - 2);
stack.pop();
pushFragment(fragment, false);
} else
super.onBackPressed();
drawerToggler.setDrawerIndicatorEnabled(stack.size() == 1);
}
public void clearBackStack() {
stack.clear();
}
}
FirstFragment.java
public class FirstFragment extends Fragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_first, container, false);
}
@Override
public void onResume() {
super.onResume();
ActionBar actionBar = ((ActionBarActivity)getActivity()).getSupportActionBar();
actionBar.setTitle("First Fragment");
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.inflate(R.menu.fragment_menu, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case android.R.id.home:
Toast.makeText(getActivity(), "Back from fragment", Toast.LENGTH_SHORT).show();
getActivity().onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
}
Du code ci-dessus, je ne suis pas en mesure d'obtenir le rappel de android.R.id.home
et réglage du bouton home ne fonctionne pas à chaque fois actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
Toute aide sera vraiment appréciée.
Grâce
- github.com/tekinarslan/AndroidMaterialDesignToolbar dans ce que vous pouvez obtenir le même comportement que vous voulez
Vous devez vous connecter pour publier un commentaire.
Ajouter une barre d'outils à votre xml
Puis à l'intérieur de votre onCreateView méthode dans le Fragment:
getActivity()
en raison de la façon dont ma fragment a été mis en place.setHasOptionsMenu(true);
puis " setNavigationOnClickListener ` ne fonctionnera pas, vous devez remplacer lesonOptionsItemSelected
pour les détails, consultez le @Amandeep Rohila répondreVous avez à gérer votre dos, bouton enfoncé action sur votre Activité principale parce que votre Activité principale est le conteneur de vos fragment.
Tout d'abord, ajoutez votre tous les fragments de transaction.addToBackStack(null) et maintenant, la navigation de retour bouton d'appel sera lancé sur l'activité principale. J'espère code suivant va vous aider à...
vous pouvez également utiliser
Et à modifier le titre, selon le nom de fragment de fragment vous pouvez utiliser le code suivant:
return true
aprèsonBackPressed()
pour que cela fonctionne. Si vous n'avez pasonBackPressed()
n'aura aucun effet tant que l'appel sera consommée parsuper.onOptionsItemSelected(item)
J'ai la tête autour de beaucoup de solutions et aucun d'entre eux fonctionne parfaitement. J'ai utilisé la variation de solutions disponibles dans mon projet qui est, ici, comme ci-dessous. Veuillez utiliser ce code à l'intérieur de la classe où vous êtes en cours d'initialisation de la barre d'outils et tiroir de mise en page.
drawerFragment
, qu'est-ce quemDrawerToggle
? Exemple flagrant de mauvaise réponseVous pouvez utiliser la Barre d'outils à l'intérieur du fragment et il est facile à manipuler. D'abord ajouter la Barre d'outils de mise en page de fragment
À l'intérieur de la onCreateView Méthode dans le fragment que vous pouvez manipuler la barre d'outils de ce genre.
IL va mettre la barre d'outils,le titre et l'arrière de la flèche de navigation de la barre d'outils.Vous pouvez définir n'importe quelle icône pour setNavigationIcon méthode.
Si vous avez besoin de déclencher tous les cas, lors cliquez sur de la barre d'outils de navigation icône vous pouvez utiliser cette.
Si votre activité de navigation de tiroir, vous devrez peut-être ouvrir que lorsque cliquez sur la navigation bouton de retour. vous pouvez ouvrir ce tiroir comme ça.
Code complet est ici
R.drawable.ic_arrow_back
est une coutume drawable, savez-vous si il est possible de saisir le "officielle" de la flèche qui Android utilise ?Probablement la solution la plus propre:
Il suffit d'utiliser cette classe en tant que parent pour tous les Fragments qui devraient soutenir de navigation.
D'abord, vous ajoutez la Navigation bouton de retour
Ensuite, ajoutez la Méthode dans votre HostActivity.
Essayer cela, certainement le travail.
OnToolBar il y a une icône de navigation à gauche
En utilisant ce au de navigation à gauche de l'icône de comparaître et de navigation, cliquez sur l'icône de l'appeler activité parent.
et dans le manifeste que nous puissions système d'activité parent.