Come realizzare questo menu popup personalizzato con Material Design Android?

Voglio realizzare un menu popup personalizzato come Twitter in Android per esempio con l'elemento e l'image, ma non so quale sia il componente utilizzato per questo.

Nel sito web Material Design, google presenta questa soluzione . Quindi penso, c'è una soluzione nativa per raggiungere questo objective.

  • Forza una telecamera per aprire sempre in modalità ritratto in android
  • Come impostare il ritardo in android?
  • Invio di file Android Bluetooth
  • EditText con i themes personalizzati sottolineano sotto la maniglia di selezione
  • Retrofit2: Modifica del corpo di richiesta in OkHttp Interceptor
  • android: sposta una vista sul movimento del touch (ACTION_MOVE)
  • immettere qui la descrizione dell'immagine

    Ho provato con il menu Popup , ma non riesco a trovare come personalizzare il layout di questa visualizzazione come quello.

  • BufferQueue è stato abbandonato: durante la riproduzione di video con TextureView
  • Come disegna il text con un bordo su un MapView in Android?
  • Come redirect verso la window di impostazione GPS in android o ios utilizzando il phonegap per accendere o spegnere un GPS
  • Android Studio DexIndexOverflowException: ID metodo non in
  • Android: android.view.ViewRoot $ CalledFromWrongThreadException - Come risolvere il problema?
  • Eclipse Android e gitignore
  • 7 Solutions collect form web for “Come realizzare questo menu popup personalizzato con Material Design Android?”

    è ansible utilizzare un ListPopupWindow , inviando l'adattatore personalizzato, attraverso il quale è ansible controllare il layout di each singola row del ListPopupWindow . Per quanto riguarda un normale PopupWindow è necessario fornire una visualizzazione di ancoraggio e inoltre è necessario call setContentWidth nell'istanza di ListPopupWindow , che imposta la width della window popup per la dimensione del suo contenuto. È un piccolo prezzo che devi pagare, ma per un piccolo set di dati non è un grosso problema. Ho questo metodo di utilità per recuperare la width massima della row:

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

    C'è un widget denominato PopupMenu che è fondamentalmente un menu ancorato a una vista specifica. Un inconveniente è che non visualizza le icone per impostazione predefinita.

    Tuttavia, è ansible utilizzare la riflessione e call setForceShowIcon per rivelarli. Il codice che ti serve è:

    • Poiché un PopupMenu è ancorato a una vista specifica, l'elemento ActionBar ha un attributo actionLayout . Quel layout ( action_item.xml ) può essere semplice come:

       <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 ActionBar che contiene il tuo elemento con il layout di cui sopra

       <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> 
    • Il tuo popup_menu.xml , il layout che PopupMenu per il tuo 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> 
    • E finalmente codice per eseguire l'inflazione quando viene cliccato un elemento 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); } 

    Nota, per get il text multi-line in un menu, è necessario utilizzare un actionLayout per le voci di menu popup troppo.

    Utilizza un frammento di elenco popup . La cosa bella dei frammenti è che puoi facilmente animarli (se non capisci i frammenti che raccommand la prima lettura dell'introduzione a frammento )

    Se si desidera un controllo completo sul contenuto pop-up, vedere Fragmento di dialogo

    Ho lo stesso problema, ma finalmente ho trovato alla mia propria soluzione che ti sto condividendo il mio codice. Spero che ti aiuterà.

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

    Questo codice funziona nella mia applicazione.

    Prova questo :-

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

    Puoi passare attraverso il tutorial di questi diversi fornitori

    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/

    Tutti hanno grandi esempi e codice sorgente per aiutarti

    Spero che questo ti aiuti 🙂

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

    Soluzione più semplice. Aggiungi questo metodo appena prima di te .show ().

     try { Field mFieldPopup=popupMenu.getClass().getDeclaredField("mPopup"); mFieldPopup.setAccessible(true); MenuPopupHelper mPopup = (MenuPopupHelper) mFieldPopup.get(popupMenu); mPopup.setForceShowIcon(true); } catch (Exception e) {} 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.