Android custom выпадающее / всплывающее меню
Как сделать пользовательское выпадающее / всплывающее меню, привязанное к кнопке?
Мне нужно, чтобы он работал как всплывающее меню (привязанное к виду), и делать что-то, когда я нажимаю элемент из меню.
Как добавить элементы в меню по коду, сохраняя высоту меню и сделать его прокручиваемым, если есть более 5 элементов. Мне не нужно добавлять никаких изображений, просто текст.
4 ответа:
для создания всплывающего меню в android.
activity_main.xml
содержит только одну кнопку.
File: activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="62dp" android:layout_marginTop="50dp" android:text="Show Popup" /> </RelativeLayout>
popup_menu.xml
Он содержит три элемента, как показано ниже. Он создается внутри каталога res / menu. Файл: poupup_menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/one" android:title="One"/> <item android:id="@+id/two" android:title="Two"/> <item android:id="@+id/three" android:title="Three"/> </menu>
занятия
он отображает всплывающее меню при нажатии кнопки. Файл: В MainActivity.java
public class MainActivity extends Activity { private Button button1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //Creating the instance of PopupMenu PopupMenu popup = new PopupMenu(MainActivity.this, button1); //Inflating the Popup using xml file popup.getMenuInflater() .inflate(R.menu.popup_menu, popup.getMenu()); //registering popup with OnMenuItemClickListener popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { Toast.makeText( MainActivity.this, "You Clicked : " + item.getTitle(), Toast.LENGTH_SHORT ).show(); return true; } }); popup.show(); //showing popup menu } }); //closing the setOnClickListener method } }
добавить программно:
PopupMenu menu = new PopupMenu(this, view); menu.getMenu().add("One"); menu.getMenu().add("Two"); menu.getMenu().add("Three"); menu.show();
соблюдать этой ссылка для создания меню программно.
Я знаю, что это старый вопрос, но я нашел другой ответ, который работал лучше для меня, и он, кажется, не появляется ни в одном из ответов.
создать макет xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="5dip" android:paddingBottom="5dip" android:paddingStart="10dip" android:paddingEnd="10dip"> <ImageView android:id="@+id/shoe_select_icon" android:layout_width="30dp" android:layout_height="30dp" android:layout_gravity="center_vertical" android:scaleType="fitXY" /> <TextView android:id="@+id/shoe_select_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:textSize="20sp" android:paddingStart="10dp" android:paddingEnd="10dp"/> </LinearLayout>
создать ListPopupWindow и карту с содержанием:
ListPopupWindow popupWindow; List<HashMap<String, Object>> data = new ArrayList<>(); HashMap<String, Object> map = new HashMap<>(); map.put(TITLE, getString(R.string.left)); map.put(ICON, R.drawable.left); data.add(map); map = new HashMap<>(); map.put(TITLE, getString(R.string.right)); map.put(ICON, R.drawable.right); data.add(map);
затем по щелчку мыши, откройте меню с помощью этой функции:
private void showListMenu(final View anchor) { popupWindow = new ListPopupWindow(this); ListAdapter adapter = new SimpleAdapter( this, data, R.layout.shoe_select, new String[] {TITLE, ICON}, // These are just the keys that the data uses (constant strings) new int[] {R.id.shoe_select_text, R.id.shoe_select_icon}); // The view ids to map the data to popupWindow.setAnchorView(anchor); popupWindow.setAdapter(adapter); popupWindow.setWidth(400); popupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { switch (position){ case 0: devicesAdapter.setSelectedLeftPosition(devicesList.getChildAdapterPosition(anchor)); break; case 1: devicesAdapter.setSelectedRightPosition(devicesList.getChildAdapterPosition(anchor)); break; default: break; } runOnUiThread(new Runnable() { @Override public void run() { devicesAdapter.notifyDataSetChanged(); } }); popupWindow.dismiss(); } }); popupWindow.show(); }
Путь Котлина
fun showPopupMenu(view: View) { PopupMenu(view.context, view).apply { menuInflater.inflate(R.menu.popup_men, menu) setOnMenuItemClickListener { item -> Toast.makeText(view.context, "You Clicked : " + item.title, Toast.LENGTH_SHORT).show() true } }.show() }
обновление: в приведенном выше коде функция apply возвращает
this
которых не требуется, поэтому мы можем использоватьrun
которые ничего не возвращают, и чтобы сделать его еще проще, мы также можем удалить фигурные скобки метода showPopupMenu.Еще Проще:
fun showPopupMenu(view: View) = PopupMenu(view.context, view).run { menuInflater.inflate(R.menu.popup_men, menu) setOnMenuItemClickListener { item -> Toast.makeText(view.context, "You Clicked : " + item.title, Toast.LENGTH_SHORT).show() true } show() }
сначала создайте папку с именем "меню" в папке "res".
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/search" android:icon="@android:drawable/ic_menu_search" android:title="Search"/> <item android:id="@+id/add" android:icon="@android:drawable/ic_menu_add" android:title="Add"/> <item android:id="@+id/edit" android:icon="@android:drawable/ic_menu_edit" android:title="Edit"> <menu> <item android:id="@+id/share" android:icon="@android:drawable/ic_menu_share" android:title="Share"/> </menu> </item> </menu>
затем создайте свой класс Activity:
public class PopupMenu1 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.popup_menu_1); } public void onPopupButtonClick(View button) { PopupMenu popup = new PopupMenu(this, button); popup.getMenuInflater().inflate(R.menu.popup, popup.getMenu()); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { Toast.makeText(PopupMenu1.this, "Clicked popup menu item " + item.getTitle(), Toast.LENGTH_SHORT).show(); return true; } }); popup.show(); } }