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: –
- La fila de RecyclerView está barajando y cambiando Imágenes: android
- Android - instanciar un fragmento varias veces?
- No se puede actualizar fragmentos de texto al cambiar las tarjetas
- Cómo detener la llamada onCreateView cuando cambia de ficha diferente (como tab1, tab2) en android?
- Honeycomb Gmail Como Aplicación
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)
- Fragmento no se muestra después de inflar
- Inicializar Typeface en un fragmento
- FragmentStatePagerAdapter IllegalStateException: <MyFragment> no está actualmente en el FragmentManager
- Fragmento ya activo - Al intentar establecerArgumentos
- GetActivity () es nulo dentro de AlertDialog de un fragmento
- MapView en Fragmento (Android 4.0 o superior)
- Borrar fragmento back stack programmatic
- ¿Por qué se utiliza FrameLayout para fragmentos?
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 ();
-
Ver – findViewById ()
-
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);