studio setsupportactionbar regresar programar from change boton atras anterior activity android android-actionbar navigation-drawer android-fragmentactivity android-toolbar

setsupportactionbar - regresar a un activity anterior android



Administra la barra de herramientas de navegación y el botón Atrás desde el fragmento en Android (6)

Todos mis fragmentos se controlan a través de ActionBarActivity (mainActivity), dentro de mainActivity se implementa DrawerLayout y todos los fragmentos secundarios se insertan a través del elemento de la lista drawerLayout. El problema al que me enfrento es después de empujar un fragmento a través de drawerLayout. Quiero cambiar el ícono del cajón en el ícono de la ToolBar de ToolBar para que el usuario pueda navegar al fragmento anterior y manejar la devolución de llamada de android.R.id.home ya sea dentro del Mismo fragmento o dentro de la actividad principal.

El código que estoy usando es:

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

Desde el código anterior no puedo obtener la devolución de llamada de android.R.id.home y la configuración del botón de inicio no funciona cada vez que actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true);

Cualquier ayuda será muy apreciada.

Gracias


Agrega una barra de herramientas a tu xml

<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Fragment title"/> </android.support.v7.widget.Toolbar>

Luego dentro de su método onCreateView en el Fragmento:

Toolbar toolbar = view.findViewById(R.id.toolbar); toolbar.setNavigationIcon(R.drawable.ic_back_button); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getActivity().onBackPressed(); } });


Debe administrar la acción presionada de su botón Atrás en su Actividad principal porque su Actividad principal es un contenedor para su fragmento.

Primero, agregue todos sus fragmentos a transaction.addToBackStack (null) y ahora la llamada del botón de retroceso de navegación continuará en la actividad principal. Espero que el siguiente código te ayude ...

@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: onBackPressed(); } return super.onOptionsItemSelected(item); }

también puedes usar

Fragment fragment =fragmentManager.findFragmentByTag(Constant.TAG); if(fragment!=null) { FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.remove(fragment).commit(); }

Y para cambiar el título según el nombre del fragmento del fragmento, puede utilizar el siguiente código:

activity.getSupportActionBar().setTitle("Keyword Report Detail");


En la barra de herramientas hay un icono de navegación en el lado izquierdo.

<activity android:name=".CategoryCloudSelectActivity" android:parentActivityName=".EventSelectionActivity" android:screenOrientation="portrait" />

Al usar esto, en el lado izquierdo, aparece el ícono de navegación y en el ícono de navegación, haga clic en él para llamar a la actividad principal.

y en el manifiesto podemos notificar al sistema sobre la actividad de los padres.

abstract class NavigationChildFragment : Fragment() { abstract fun onCreateChildView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val activity = activity as? MainActivity activity?.supportActionBar?.setDisplayHomeAsUpEnabled(true) setHasOptionsMenu(true) return onCreateChildView(inflater, container, savedInstanceState) } override fun onDestroyView() { val activity = activity as? MainActivity activity?.supportActionBar?.setDisplayHomeAsUpEnabled(false) setHasOptionsMenu(false) super.onDestroyView() } override fun onOptionsItemSelected(item: MenuItem): Boolean { val activity = activity as? MainActivity return when (item.itemId) { android.R.id.home -> { activity?.onBackPressed() true } else -> super.onOptionsItemSelected(item) } } }


Probablemente la solución más limpia:

Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar); toolbar.setTitle(getResources().getString(R.string.title_activity_select_event)); setSupportActionBar(toolbar); getSupportActionBar().setDisplayShowHomeEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Solo use esta clase como padre para todos los Fragmentos que deben ser compatibles con la navegación.


Puede utilizar la barra de herramientas dentro del fragmento y es fácil de manejar. Primero agregue la barra de herramientas al diseño del fragmento

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/toolbar" android:layout_height="wrap_content" android:layout_width="match_parent" android:fitsSystemWindows="true" android:minHeight="?attr/actionBarSize" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:background="?attr/colorPrimaryDark"> </android.support.v7.widget.Toolbar>

Dentro del Método onCreateView en el fragmento, puede manejar la barra de herramientas de esta manera.

Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar); toolbar.setTitle("Title"); toolbar.setNavigationIcon(R.drawable.ic_arrow_back);

IT establecerá la barra de herramientas, el título y la flecha de navegación hacia atrás en la barra de herramientas. Puede configurar cualquier icono para configurar el método de conexión de navegación.

Si necesita activar algún evento al hacer clic en el icono de navegación de la barra de herramientas, puede usar esto.

toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //handle any click event });

Si su actividad tiene un cajón de navegación, es posible que deba abrirlo cuando haga clic en el botón de retroceso de navegación. Puedes abrir ese cajón así.

toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DrawerLayout drawer = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout); drawer.openDrawer(Gravity.START); } });

El código completo está aquí

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //inflate the layout to the fragement view = inflater.inflate(R.layout.layout_user,container,false); //initialize the toolbar Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar); toolbar.setTitle("Title"); toolbar.setNavigationIcon(R.drawable.ic_arrow_back); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //open navigation drawer when click navigation back button DrawerLayout drawer = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout); drawer.openDrawer(Gravity.START); } }); return view; }


Tengo varias soluciones y ninguna de ellas funciona perfectamente. He utilizado la variación de las soluciones disponibles en mi proyecto, que se encuentra a continuación. Utilice este código dentro de la clase donde está inicializando la barra de herramientas y el diseño del cajón.

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { @Override public void onBackStackChanged() { if (getSupportFragmentManager().getBackStackEntryCount() > 0) { drawerFragment.mDrawerToggle.setDrawerIndicatorEnabled(false); getSupportActionBar().setDisplayHomeAsUpEnabled(true);// show back button toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }); } else { //show hamburger drawerFragment.mDrawerToggle.setDrawerIndicatorEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(false); drawerFragment.mDrawerToggle.syncState(); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { drawerFragment.mDrawerLayout.openDrawer(GravityCompat.START); } }); } } });