Acción ActionBar en DialogFragment

Tengo un DialogFragment que se diseña a la pantalla completa usar setStyle(STYLE_NORMAL, R.style.Theme_App) .

El DialogFragment muestra bien pero la acción ascendente (la acción homeAsUp en la ActionBar) no funciona. Intenté implementar onOptionsItemSelected en el DialogFragment pero nunca se llama.

¿Hay una manera de obtener la acción de devolución de llamada en el DialogFragment para que pueda descartarlo? Para referencia, estoy usando ActionBarCompat .

No hay manera de adjuntar una ActionBar al DialogFragment aunque puede establecer el tema del DialogFragment que no se registrará como un ActionBar , Dialog.getActionBar() siempre devolverá null.

En lugar de obtener el ActionBar siempre se puede adjuntar un diseño que se verá como un ActionBar y establecer la funcionalidad en él con el menú.

La otra manera es crear una actividad con actionBar como un diálogo que puede referirse a esta publicación

Esto no fue posible pero hay una solución para esto utilizando una Toolbar . Ahora puede incluir la Toolbar como parte de su layout xml DialogFragment layout xml y puede configurar su diseño / icono de acuerdo a sus necesidades. También necesitará implementar setNavigationOnClickListener si desea que el botón de retroceso se comporte como lo hace normalmente. Consulte la siguiente clase de ejemplo.

 package com.package.name; import android.app.Dialog; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.DialogFragment; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; public class MyDialogFragment extends DialogFragment { private View parentView; private Toolbar toolbar; @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { setStyle(DialogFragment.STYLE_NO_FRAME, R.style.Theme_AppCompat_NoActionBar); return super.onCreateDialog(savedInstanceState); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //The layout xml file contains the toolbar parentView = inflater.inflate(R.layout.dialogfragment_createpost, container, false); initView(); initData(); return parentView; } private void initView() { toolbar = (Toolbar) parentView.findViewById(R.id.toolbar); } private void initData() { toolbar.setTitle("Post"); //Set naviagtion icon to back button drawable toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // handle back button naviagtion dismiss(); } }); } } 

Para que el DialogFragment reciba llamadas a onOptionsItemSelected(MenuItem item) necesita el conjunto setHasOptionsMenu(true); En el método onCreate () del fragmento.

Otra solución potencial es manejar la acción ascendente en las actividades onOptionsItemSelected(MenuItem item) devolución de llamada. Algo como esto:

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // Respond to the action bar's Up/Home button onBackPressed(); return true; } } 

Sólo delegar la acción ascendente desde el componente, que la recibe (es decir, la actividad o fragmento padre), a su DialigFragment. Cuando se produzca, compruebe si se muestra su DialogFragment y si es así, llame al método apropiado.

Compruebe aquí para la descripción detallada.

He resuelto estos problemas mediante la adición de la siguiente codificación.

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

En MainActivity :

Previamente,

Public class MainActivity extiende BaseActivity

Luego me cambio

Public class MainActivity extends FragmentActivity

Lo más probable es que necesite extender una MainActivity to FragmentActivity.

El siguiente código funcionó para mí:

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // Respond to the action bar's Up/Home button case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; } return super.onOptionsItemSelected(item); } 

Espero que esto ayude 🙂

  • Fragmento de diálogo con wrap_content que viene como una pantalla completa. ¿Cómo hacerlo como una altura de diseño y no una pantalla completa?
  • Superpuesto por la barra de estado cuando se muestra el fragmento de diálogo, solo en Android4.4
  • BottomSheetDialogFragment - escucha despedido por evento de usuario
  • Las reglas de alineación RelativeLayout no funcionan en DialogFragment
  • Ocultar el teclado al mostrar DialogFragment en la tableta?
  • Diálogos y ventanas emergentes en Android
  • No ver la interfaz de EditNameDialogListener
  • Cambiar DialogFragment entrar / salir de la transición justo antes de despedir
  • DialogFragment con ListView personalizado
  • Java.lang.IllegalStateException: No se puede realizar esta acción después de onSaveInstanceState con DialogFragment
  • Tema de DatePickerDialog de Android 6.0
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.