PopupWindow – no funciona en algunos dispositivos
Uso código siguiente para mostrar un pequeño popup:
public static PopupWindow showImportMenu(Activity activity, View anchor, PopupWindowClickListener onClickListener) { LayoutInflater inflater = LayoutInflater.from(activity); PopupImportBinding binding = DataBindingUtil.inflate(inflater, R.layout.popup_import, null, false); if (!RootTools.isRootAvailable()) binding.llImportRootMethod.setVisibility(View.GONE); PopupWindow popupWindow = new PopupWindow(activity, null, R.attr.popupMenuStyle); popupWindow.setFocusable(true); popupWindow.setContentView(binding.getRoot()); popupWindow.setOutsideTouchable(true); PopupWindowCompat.showAsDropDown(popupWindow, anchor, 0, 0, Gravity.BOTTOM); View.OnClickListener clickListener = new View.OnClickListener() { @Override public void onClick(View view) { onClickListener.onClick(popupWindow, view); } }; binding.llImportDefault.setOnClickListener(clickListener); binding.llImportRootMethod.setOnClickListener(clickListener); binding.llImportHTCFromContacts.setOnClickListener(clickListener); binding.llImportManual.setOnClickListener(clickListener); return popupWindow; }
Esto funciona en una gran cantidad de dispositivos, pero en algunos dispositivos raros no funciona, como:
- Custom PopupWindow con el método despreciado BitmapDrawable
- ¿Cómo puedo reemplazar mi código popupmenu con la lista popupwindow?
- Diálogos y ventanas emergentes en Android
- Ventana emergente de Android descarta al hacer clic fuera
- Android: setText () para TextView en PopupWindow no funciona
- Android 5.1.1 root slim rom
- Quizás otros … hasta ahora, no sé más sobre otros dispositivos
Me dieron la retroalimentación de que no aparece ninguna ventana emergente. ¿Alguien sabe por qué esto no está funcionando en el dispositivo mencionado anteriormente? ¿Y qué puedo hacer para que funcione en este dispositivo también?
EDITAR
Parece que no está claro que lo que quiero es seguir:
-
showAsDropDown
noshowAtLocation
o similar, nunca vi este problema conshowAtLocation
todavía - Mi solución está trabajando en casi todos los dispositivos, parece ser un teléfono / rom problema específico, tal vez ni siquiera solucionable, ya que podría ser un error en el dispositivo también => si alguien sabe de un error, diciéndome que sería bien también
- No quiero usar un diálogo (o cualquier otra cosa) en su lugar, que no está respondiendo a mi pregunta. Actualmente utilizo un
BottomSheet
que está bien para mí, pero todavía me gustaría saber si el problema puede ser resuelto y de alguna manera manejado
- Android Nougat PopupWindow showAsDropDown (...) La gravedad no funciona
- Android PopupWindow con la flecha de herramientas
- llamada de la ventana emergente de androide de oncreate
- Error de hilandero en la ventana emergente cuando hago clic
- Reproductor de vídeo flotante (como el reproductor de youtube) en android
- Facebook-esque Popup ¿Cómo?
- GLSurfaceView en un PopupWindow
- ¿Puede PopupWindow de Android mostrar otro PopupWindow?
Pruebe QuickAction
Actividad (EjemploActividad1.java) para mostrar cómo usar QuickAction:
public class Example1Activity extends Activity { private static final int ID_ADD = 1; private static final int ID_ACCEPT = 2; private static final int ID_UPLOAD = 3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.example1); ActionItem addItem = new ActionItem(ID_ADD, "Add", getResources().getDrawable(R.drawable.ic_add)); ActionItem acceptItem = new ActionItem(ID_ACCEPT, "Accept", getResources().getDrawable(R.drawable.ic_accept)); ActionItem uploadItem = new ActionItem(ID_UPLOAD, "Upload", getResources().getDrawable(R.drawable.ic_up)); //use setSticky(true) to disable QuickAction dialog being dismissed after an item is clicked uploadItem.setSticky(true); final QuickAction mQuickAction = new QuickAction(this); mQuickAction.addActionItem(addItem); mQuickAction.addActionItem(acceptItem); mQuickAction.addActionItem(uploadItem); //setup the action item click listener mQuickAction.setOnActionItemClickListener(new QuickAction.OnActionItemClickListener() { @Override public void onItemClick(QuickAction quickAction, int pos, int actionId) { ActionItem actionItem = quickAction.getActionItem(pos); if (actionId == ID_ADD) { Toast.makeText(getApplicationContext(), "Add item selected", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), actionItem.getTitle() + " selected", Toast.LENGTH_SHORT).show(); } } }); mQuickAction.setOnDismissListener(new QuickAction.OnDismissListener() { @Override public void onDismiss() { Toast.makeText(getApplicationContext(), "Ups..dismissed", Toast.LENGTH_SHORT).show(); } }); Button btn1 = (Button) this.findViewById(R.id.btn1); btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mQuickAction.show(v); } }) Button btn2 = (Button) this.findViewById(R.id.btn2); btn2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mQuickAction.show(v); mQuickAction.setAnimStyle(QuickAction.ANIM_GROW_FROM_CENTER); } }); } }
Salida:
# # Ok i implementado popupwindow para la clasificación en mi fragmento de la ficha y he comprobado el trabajo bien una vez que intente esto
He utilizado en ese diseño personalizado para la ventana emergente
final PopupWindow popupWindow = new PopupWindow(getActivity()); LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.popmenu1t1, null); l8[![enter image description here][1]][1] = (LinearLayout) view.findViewById(R.id.atoz); l8.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { date_sort="0"; discount_sort=""; price_sort=""; alpha_sort=""; popupWindow.dismiss(); } }); int width = 900; int height = 400; try { WindowManager wm = (WindowManager)view.getContext().getSystemService(Context.WINDOW_SERVICE); width = wm.getDefaultDisplay().getWidth(); height = wm.getDefaultDisplay().getHeight(); } catch (Exception e) { e.printStackTrace(); } popupWindow.setWidth(width*3/6); popupWindow.setFocusable(true); popupWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT); popupWindow.setContentView(view); popupWindow.setBackgroundDrawable(null); popupWindow.setOutsideTouchable(true); popupWindow.showAtLocation(view, Gravity.CENTER, 0, 0);
Encuentra la siguiente ventana de popupwindow de pantalla adjunta en mi aplicación
Había creado un cuadro de diálogo emergente personalizado que aparece en la parte inferior de la pantalla
public class MoreOptionDialog { private Dialog dialog; private Context context; private int size; public MoreOptionDialog(Context context) { this.context = context; } public void showMoreOptionDialog(List<String> listMoreOption) { dialog = new Dialog(new ContextThemeWrapper(context, R.style.DialogSlideAnim)); dialog.getWindow().setWindowAnimations(R.style.DialogSlideAnim); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); View view = View.inflate(context, R.layout.dialog_more_option, null); dialog.setContentView(view, new LinearLayout.LayoutParams(utility.getScreenWidth() - 100, size)); dialog.getWindow().setGravity(Gravity.BOTTOM); ListView listView = (ListView) view.findViewById(R.id.lvMoreOption); MoreOptionAdapter moreOptionAdapter = new MoreOptionAdapter(context, listMoreOption, Gravity.CENTER); listView.setAdapter(moreOptionAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { dialog.dismiss(); } }); dialog.show(); } }
Y el estilo está aquí
<style name="DialogSlideAnim"> <item name="android:windowAnimationStyle">@style/DialogAnimation</item> <item name="android:windowBackground">@color/color_white</item> <item name="android:windowFrame">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:windowActionBar">false</item> </style>
Y este diálogo funciona en todos los dispositivos 🙂
Algunas ROMs restringen el uso de popupview con sus propios permisos . Así que el usuario tiene que activar explícitamente el permiso para mostrar las vistas emergentes.
Incluso MIUI limitará popupview para que se muestre de forma predeterminada.
Por favor, eche un vistazo si hay algún permiso en esa ROM o dispositivos.
- ApplicationTestCase obsoleto en el nivel 24 de API
- AlarmManager no siempre ejecuta BroadcastReceiver