Wie bekomme ich dieses benutzerdefinierte Popup-Menü mit Material Design Android?

Ich möchte ein benutzerdefiniertes Popup-Menü wie Twitter in Android zum Beispiel mit Element und Bild zu realisieren, aber ich weiß nicht, was ist die Komponente für die verwendet.

In Material Design Website, Google präsentieren diese Lösung . Also ich denke, es gibt eine native Lösung, um dies zu erreichen.

  • Senden von REST-Aufruf an Google Cloud PHPMyAdmin Server funktioniert nicht?
  • Android: Wie kann ich die AlertDialog-Breite und -Ebene und die Schaltfläche des AlertDialog-Stils einstellen?
  • Fragmentzustand mit Navigationsschublade speichern
  • Wie mache ich ein Bild schütteln / wackeln, wenn geklickt?
  • Keine Ressource-ID gefunden für Attribut 'showAsAction' im Paket 'android'
  • Erstellen von Testabhängigkeiten bei der Verwendung von Dagger2
  • Bildbeschreibung hier eingeben

    Ich habe mit Popup-Menü versucht, aber ich kann nicht finden, wie man das Layout dieser Ansicht so anpassen kann.

  • Gradle Build Laufen in Android Studio zu lange
  • Android inapp billing responseList ist leer
  • Eclipse android emulator friert ein
  • Fehler: (3, 17) java: paket org.junit existiert nicht - intellij
  • Portierung von iOS App auf Android
  • Wie zu erkennen, wann das Gerät in libGDX umgedreht ist
  • 7 Solutions collect form web for “Wie bekomme ich dieses benutzerdefinierte Popup-Menü mit Material Design Android?”

    Sie können einen ListPopupWindow verwenden und Ihren benutzerdefinierten Adapter einreichen, über den Sie das Layout jeder einzelnen Zeile des ListPopupWindow . Für einen normalen PopupWindow musst du eine PopupWindow und zusätzlich musst du setContentWidth auf der Instanz von ListPopupWindow , die die Breite des Popup-Fensters durch die Größe seines Inhalts festlegt. Es ist ein kleiner Preis, den man bezahlen muss, aber für einen kleinen Datensatz ist keine große Sache. Ich habe diese Utility-Methode, um die maximale Breite der Zeile abzurufen:

     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; } 

    Es gibt ein Widget namens PopupMenu das im Grunde ein Menü an einer bestimmten Ansicht verankert ist. Ein Nachteil ist, dass es keine Symbole standardmäßig zeigt.

    Allerdings können Sie Reflexion verwenden und setForceShowIcon , um sie zu verraten. Der Code, den Sie benötigen, ist:

    • Da ein PopupMenu zu einer bestimmten Ansicht verankert ist, hat dein ActionBar Element ein actionLayout Attribut. Dieses Layout ( action_item.xml ) kann so einfach sein wie:

       <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 , der Ihren Artikel mit dem obigen Layout enthält

       <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> 
    • Dein popup_menu.xml , das Layout, das du für dein PopupMenu aufblasen 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> 
    • Und schließlich Code, um die Inflation durchzuführen, wenn ein ActionBar Element angeklickt wird

       @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); } 

    Beachten Sie, dass, um diesen mehrzeiligen Text in einem Menü zu erhalten, müssten Sie eine actionLayout für Ihre Popup-Menüpunkte verwenden.

    Verwenden Sie ein Pop-Up-Listenfragment . Die schöne Sache über Fragmente ist, dass man sie leicht animieren kann (Wenn man keine Fragmente versteht, empfehle ich zuerst das Lesen von Fragment Einführung )

    Wenn Sie die vollständige Kontrolle über den Pop-up-Inhalt wünschen, dann siehe Dialog Fragment

    Ich habe das gleiche Problem. Aber endlich habe ich bei meiner eigenen Lösung gefunden, dass ich dir meinen Code teile. Hoffe, das wird dir helfen.

     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; } 

    Dieser Code funktioniert in meiner App.

    Versuche dies :-

     <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> 

    Sie können das Tutorial von diesen verschiedenen Anbietern durchlaufen

    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/

    Alle von ihnen haben tolle Beispiele und Quellcode, um Ihnen zu helfen

    Hoffe das hilft dir 🙂

      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(); } 

    Einfachere Lösung. Fügen Sie dies kurz vor Ihnen .show () Methode hinzu.

     try { Field mFieldPopup=popupMenu.getClass().getDeclaredField("mPopup"); mFieldPopup.setAccessible(true); MenuPopupHelper mPopup = (MenuPopupHelper) mFieldPopup.get(popupMenu); mPopup.setForceShowIcon(true); } catch (Exception e) {} 
    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.