Android – No se puede usar popup en Fragmento

Soy nuevo en android. Ahora estoy tratando de crear una barra deslizante. Ahora he creado una barra deslizante. Ahora quiero mostrar popup cuando hago clic en el icono en la barra de acción. Cuando extents actividad el popup está trabajando muy bien. Pero cuando cambio en extents Fragment no puedo usar el popup. Por favor, hágamelo saber cualquier idea o cualquier ejemplo para popup en la página Fragmento.

public void popup_window() { View menuItemView = findViewById(R.id.menu_popup); PopupMenu popupMenu = new PopupMenu(this, menuItemView); popupMenu.getMenuInflater().inflate(R.menu.list_, popupMenu.getMenu()); popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.action_ticket: Intent intdn = new Intent(List_Activity.this,List_Activity.class); intdn.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intdn); break; case R.id.action_survey: Toast.makeText(getApplicationContext(),"Under Construction ",Toast.LENGTH_LONG).show(); break; case R.id.action_service_request: Toast.makeText(getApplicationContext(),"Under Construction ",Toast.LENGTH_LONG).show(); break; default: break; } return true; } }); popupMenu.show(); } 

Estoy recibiendo error: – Imagen de error

Muchos errores. Porfavor ayudame a resolver este problema. Gracias por adelantado.

Mensaje de error de LogCat:

  FATAL EXCEPTION: main java.lang.IllegalStateException: MenuPopupHelper cannot be used without an anchor at com.android.internal.view.menu.MenuPopupHelper.show(MenuPopupHelper.java:101) at android.widget.PopupMenu.show(PopupMenu.java:108) at com.example.sample.Testing_Fragment1.popup_window(Testing_Fragment1.java:262) at com.example.sample.Testing_Fragment1.onOptionsItemSelected(Testing_Fragment1.java:227) at android.app.Fragment.performOptionsItemSelected(Fragment.java:1801) at android.app.FragmentManagerImpl.dispatchOptionsItemSelected(FragmentManager.java:1959) at android.app.Activity.onMenuItemSelected(Activity.java:2551) at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:980) at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735) at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149) at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:547) at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:115) at android.view.View.performClick(View.java:4204) at android.view.View$PerformClick.run(View.java:17355) at android.os.Handler.handleCallback(Handler.java:725) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5041) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method) 

Cuando extents actividad el popup está trabajando muy bien. Pero cuando cambio en extents Fragment no puedo usar el popup.

Puedes llamar a findViewById() directamente para Activity , sin embargo como estás usando un Fragment , youo necesitará un objeto view para llamar a findViewById() . p.ej. GetView (). FindViewById ();

  1. Ver – findViewById ()

  2. Actividad – findViewById ()

    GetView () – Esto devolverá la vista raíz del fragmento, con esto se puede llamar a findViewById()

Nuevo PopupMenu (esto, menuItemView);

Aquí el menú emergente requiere Context , pasado como primer parámetro. Puedes usar this si estás en actividad, sin embargo en Fragmento necesitas usar getActivity() lugar de this

PopupMenu (Context context, View anchor)

Nuevo Propósito (List_Activity.this, List_Activity.class);

Esto es incorrecto, en realidad debe ser el contexto del paquete y la clase

packageContext — Contexto del paquete de aplicación que implementa esta clase.

class — La clase de componente que se va a utilizar para la intención.

Use getActivity().getApplicationContext() lugar de sólo getApplicationContext() siempre que desee mostrar Toast from Fragment

Así que su código se verá como

 public void popup_window() { View menuItemView = getView().findViewById(R.id.menu_popup); PopupMenu popupMenu = new PopupMenu(getActivity(), menuItemView); popupMenu.getMenuInflater().inflate(R.menu.list_, popupMenu.getMenu()); popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.action_ticket: Intent intdn = new Intent(getActivity(),List_Activity.class); // Your nxt activity name instead of List_Activity intdn.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK); getActivity().startActivity(intdn); break; case R.id.action_survey: Toast.makeText(getActivity().getApplicationContext(),"Under Construction ",Toast.LENGTH_LONG).show(); break; case R.id.action_service_request: Toast.makeText(getActivity().getApplicationContext(),"Under Construction ",Toast.LENGTH_LONG).show(); break; default: break; } return true; } }); popupMenu.show(); } 

ACTUALIZAR:

Java.lang.IllegalStateException: MenuPopupHelper no se puede utilizar sin un ancla

Usted obtiene esta excepción porque la vista de anclaje para este popup es nula, supongo. Por lo tanto cada vez que el sistema intenta mostrar el popup, le da esta excepción.

Sólo tryShow() comprobar el tryShow() en MenuPopupHelper

También refiérase a este post sobre SO por Maxim Zaslavsky

Puede utilizar en lugar de esto: getApplicationContext ()

Use esto: My_Activity.this

getActivity().getApplicationContext() dentro del fragmento.

El problema es emergente o los cuadros de diálogo se asocian con la "actividad", usted necesita el contexto de la actividad aquí. Pero esto se refiere a su "Fragmento".

Una forma es pasar el contexto de Activity al crear la instancia de Fragmento o usar el método getActivity del Fragment que devolverá el contexto de la actividad.

Así que cambia tu código como este

  public void popup_window() { View menuItemView = getView().findViewById(R.id.menu_popup); PopupMenu popupMenu = new PopupMenu(getActivity(), menuItemView); popupMenu.getMenuInflater().inflate(R.menu.list_, popupMenu.getMenu()); popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.action_ticket: Intent intdn = new Intent(getActivity(),List_Activity.class); intdn.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intdn); break; case R.id.action_survey: Toast.makeText(getActivity(),"Under Construction ",Toast.LENGTH_LONG).show(); break; case R.id.action_service_request: Toast.makeText(getActivity(),"Under Construction ",Toast.LENGTH_LONG).show(); break; default: break; } return true; } }); popupMenu.show(); } 

Prueba esto:

  PopupMenu popupMenu = new PopupMenu(getActivity, menuItemView); 
  • Android y RoboGuice - Inyectar vistas en Fragmento?
  • No se puede instanciar fragmento - java.lang.RuntimeException
  • Cómo utilizar el fragmento con Viewpager para páginas de desplazamiento
  • Creación de un diseño de cuadro de mandos como fragmento mediante programación
  • ¿Por qué popbackstack llama onCreateView del fragmento?
  • Android Fragmento y la inyección de dependencia
  • Error "java.lang.IllegalStateException: No se puede cambiar la etiqueta de fragmento" cuando se utiliza ViewPager # setCurrentItem ()
  • Cambiar fragmentos de forma programática
  • java.lang.IllegalStateException: Actividad destruida - fragmento de Android
  • Mostrar el botón de arriba en la barra de acción en las preferencias de la pantalla principal
  • El valor de la vista de texto se restablece al cambiar el fragmento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.