Intereting Posts
Как реализовать расширяемые панели в Android? Динамически добавлять элементы в список, используя пользовательский адаптер для Android-приложения Android – onAttach (Контекст), не вызываемый API 23 Есть ли способ проверить приложения Android прямо на телефоне без эмулятора? Используйте библиотеку DataBinding для установки ресурса цвет фона или нулевого Не может оценивать модуль «реагировать на собственные карты»: конфигурация с именем «по умолчанию» не найдена Статические андроидные ярлыки для нескольких ароматов? BitmapFactory.decodeResource возвращает измененный Bitmap в Android 2.2 и неизменный Bitmap в Android 1.6 Android onBackStackChanged () не вызван Сцена переходного фликера RETROFIT POST Объект Realm Android – общий доступ к содержимому Facebook Как использовать View Stub в android Построить ошибки с зависимостью XML с java-объектом в build.gradle для модификации Используйте модули Dagger без директивы «инъекций»

Как реализовать это настраиваемое всплывающее меню с помощью Material Design Android?

Я хочу реализовать пользовательское всплывающее меню, например, Twitter в Android, например, с изображением и изображением, но я не знаю, для чего этот компонент используется.

На веб-сайте Material Design, google представляет это решение . Поэтому, я думаю, есть собственное решение для достижения этого.

Введите описание изображения здесь

Я попробовал с всплывающим меню , но не могу найти, как настроить макет этого вида.

Solutions Collecting From Web of "Как реализовать это настраиваемое всплывающее меню с помощью Material Design Android?"

Вы можете использовать ListPopupWindow , отправляя свой собственный адаптер, с помощью которого вы можете управлять макетом каждой строки ListPopupWindow . Что касается обычного PopupWindow вы должны предоставить якорный вид, и вам дополнительно нужно вызвать setContentWidth в экземпляре ListPopupWindow , который устанавливает ширину всплывающего окна по размеру его содержимого. Это небольшая цена, которую вы должны заплатить, но для небольшого набора данных это не большое дело. У меня есть этот метод утилиты для получения максимальной ширины строки:

 public int measureContentWidth(ListAdapter adapter) { int maxWidth = 0; int count = adapter.getCount(); final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); View itemView = null; for (int i = 0; i < count; i++) { itemView = adapter.getView(i, itemView, this); itemView.measure(widthMeasureSpec, heightMeasureSpec); maxWidth = Math.max(maxWidth, itemView.getMeasuredWidth()); } return maxWidth; } 

Существует виджет PopupMenu который в основном представляет собой меню, привязанное к определенному виду. Один из недостатков заключается в том, что по умолчанию не отображаются значки.

Однако вы можете использовать отражение и вызвать setForceShowIcon чтобы выявить их. Код, который вам нужен:

  • Поскольку PopupMenu привязан к определенному виду, ваш элемент ActionBar имеет атрибут actionLayout . Этот макет ( action_item.xml ) может быть таким простым, как:

     <Button xmlns:android="http://schemas.android.com/apk/res/android" style="?attr/actionButtonStyle" android:layout_gravity="center" android:text="Show popup" android:textStyle="bold" android:textSize="12sp" android:layout_width="wrap_content" android:layout_height="match_parent"/> 
  • Стиль меню ActionBar , содержащий ваш элемент с указанным выше макетом

     <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/popup_item" android:title="Show popup" android:showAsAction="always" android:actionLayout="@layout/action_item"/> </menu> 
  • Ваш popup_menu.xml , макет, который вы будете раздувать для вашего PopupMenu

     <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/item1" android:title="Item1" android:icon="@mipmap/ic_launcher"/> </menu> 
  • И, наконец, код для выполнения инфляции при нажатии элемента ActionBar

     @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_add_item: PopupMenu popup = new PopupMenu(this, item.getActionView()); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.popup_menu, popup.getMenu()); // Use reflection to invoke setForceShowIcon try { Field[] fields = popup.getClass().getDeclaredFields(); for (Field field : fields) { if ("mPopup".equals(field.getName())) { field.setAccessible(true); Object menuPopupHelper = field.get(popup); Class<?> classPopupHelper = Class .forName(menuPopupHelper.getClass().getName()); Method setForceIcons = classPopupHelper .getMethod("setForceShowIcon", boolean.class); setForceIcons.invoke(menuPopupHelper, true); break; } } } catch (Exception e) { e.printStackTrace(); } popup.show(); return true; } return super.onOptionsItemSelected(item); } 

Обратите внимание, что для получения этого многострочного текста в меню вам также нужно будет использовать actionLayout для ваших пунктов всплывающего меню.

Используйте фрагмент списка всплывающих окон . Хорошая вещь о фрагментах заключается в том, что вы можете легко их анимировать (если вы не понимаете фрагменты, я рекомендую первое чтение Fragment Introduction )

Если вам нужен полный контроль над всплывающим контентом, см. Раздел «Диалоговый фрагмент»

У меня такая же проблема. Но, наконец, я нашел в своем собственном решении, что я делюсь с вами своим кодом. Надеюсь, это вам поможет.

 popupWindowDogs = popupWindowDogs(); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // popupWindowDogs.showAsDropDown(v, -5, 0); popupWindowDogs().showAtLocation(v, Gravity.CENTER, 0, 0); } }); // Detect touched area detector = new SimpleGestureFilter(this, this); 

}

 public PopupWindow popupWindowDogs() { // initialize a pop up window type PopupWindow popupWindow = new PopupWindow(this); // the drop down list is a list view final ListView listView = new ListView(this); // set our adapter and pass our pop up window contents listView.setAdapter(dogsAdapter(popUpContents)); // listView.setBackgroundColor(Color.DKGRAY); listView.setBackgroundResource(R.drawable.ss4); listView.setPadding(0, 0, 0, 10); listView.setDivider(null); try { listView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { View c = listView.getChildAt(0); String cc = listView.getChildAt(0).toString(); int scrolly = -c.getTop() + listView.getFirstVisiblePosition() * c.getHeight(); /* * Toast.makeText(getApplicationContext(), scrolly + "", Toast.LENGTH_SHORT) * .show(); */} @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }); } catch (Exception e) { Toast.makeText(getApplicationContext(), e.toString() + "", Toast.LENGTH_SHORT) .show(); } listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View v, int arg2, long arg3) { try { // TODO Auto-generated method stub Context mContext = v.getContext(); Swipetouch mainActivity = ((Swipetouch) mContext); // add some animation when a list item was clicked Animation fadeInAnimation = AnimationUtils.loadAnimation(v.getContext(), android.R.anim.fade_in); fadeInAnimation.setDuration(10); v.startAnimation(fadeInAnimation); // dismiss the pop up mainActivity.popupWindowDogs.dismiss(); // get the text and set it as the button text String val = (String) arg0.getItemAtPosition(arg2); // Toast.makeText(mContext, val, Toast.LENGTH_SHORT).show(); if (val.equals("Signup Now")) { Intent ii = new Intent(getApplicationContext(), Registration.class); startActivity(ii); stopService(new Intent(Swipetouch.this, MyService.class)); stopService(new Intent(Swipetouch.this, MyService.class)); } else if (val.equals("Login")) { Intent ii = new Intent(getApplicationContext(), MyLoginActivity.class); startActivity(ii); stopService(new Intent(Swipetouch.this, MyService.class)); } else if (val.equals("Exit")) { finish(); stopService(new Intent(Swipetouch.this, MyService.class)); } else if (val.equals("Friends")) { Intent ii = new Intent(getApplicationContext(), MyLoginActivity.class); startActivity(ii); } else if (val.equals("Exit")) { stopService(new Intent(Swipetouch.this, MyService.class)); finish(); } } catch (Exception e) { Toast.makeText(Swipetouch.this, e.toString(), Toast.LENGTH_SHORT).show(); } } }); // some other visual settings popupWindow.setFocusable(true); popupWindow.setWidth(250); // popupWindow.setHeight(300); popupWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT); // set the list view as pop up window content // SET WALLPAPER IMAGE /* * popupWindow.setBackgroundDrawable(getWallpaper()); popupWindow.setHeight(300); */ // layout.setBackgroundResource(R.drawable.sshadow); // layout.setBackgroundColor(Color.TRANSPARENT); // popupWindow.setContentView(layout); popupWindow.setBackgroundDrawable(new ColorDrawable( android.graphics.Color.TRANSPARENT)); popupWindow.setContentView(listView); return popupWindow; } 

Этот код работает в моем приложении.

Попробуй это :-

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".LocationDetailsActivity"> <item xmlns:tools="http://schemas.android.com/tools" android:icon="@android:drawable/ic_menu_mapmode" app:showAsAction="ifRoom" android:title="@string/title_of_menu" tools:context=".LocationDetailsActivity"> //the menu list with icon <menu> <item android:id="@+id/action_map_type_normal" android:orderInCategory="100" android:icon="some_icon" //place your icon here android:title="Vacation spots" /> <item android:id="@+id/action_map_type_satellite" android:orderInCategory="100" android:icon="some_icon" //place your icon here android:title="Friends and family" /> <item android:id="@+id/action_map_type_hybrid" android:orderInCategory="100" android:icon="some_icon" //place your icon here android:title="Restaurants" /> </menu> </item> 

Вы можете ознакомиться с учебным пособием от этих разных поставщиков

http://developer.android.com/guide/topics/ui/actionbar.html

http://www.vogella.com/tutorials/AndroidActionBar/article.html

http://www.androidhive.info/2013/11/android-working-with-action-bar/

Все они имеют отличные примеры и исходный код, чтобы помочь вам

Надеюсь, это поможет вам 🙂

  try { java.lang.reflect.Field[] fields = popup.getClass().getDeclaredFields(); for (java.lang.reflect.Field field : fields) { if ("mPopup".equals(field.getName())) { field.setAccessible(true); Object menuPopupHelper = field.get(popup); Class<?> classPopupHelper = Class .forName(menuPopupHelper.getClass().getName()); Method setForceIcons = classPopupHelper .getMethod("setForceShowIcon", boolean.class); setForceIcons.invoke(menuPopupHelper, true); break; } } } catch (Exception e) { e.printStackTrace(); } 

Простое решение. Добавьте это прямо перед вами .show ().

 try { Field mFieldPopup=popupMenu.getClass().getDeclaredField("mPopup"); mFieldPopup.setAccessible(true); MenuPopupHelper mPopup = (MenuPopupHelper) mFieldPopup.get(popupMenu); mPopup.setForceShowIcon(true); } catch (Exception e) {}