2013-09-03 2 views
14

Vorrei implementare un menu popup simile al Play Store di Google come mostrato di seguito.Android - Menu a comparsa quando si preme la visualizzazione delle voci dell'elenco?

enter image description here

in modo sostanzialmente da quello che ho capito, avrò bisogno di un'attività e una disposizione per questa attività con un controllo ListView definito in esso. ho bisogno di creare il mio adattatore personalizzato. inoltre, ho bisogno di creare un layout di lista conterrebbe le informazioni e una vista (con i 3 punti) che servirà come pulsante per avviare il menu popup? il problema che sto vedendo qui è che come faccio a creare un listener solo per questa vista e come faccio a fare riferimento al valore per quella specifica voce di elenco nella vista elenco.

Non ho ancora alcun codice disponibile in quanto non ho ancora iniziato nulla relativo a questo. Attualmente sto ottenendo informazioni in teoria per ora ma, se necessario, creerò un codice di esempio.

grazie.

+0

è possibile aprire il menu a comparsa sul metodo ItemClick di listview. – Piyush

+2

inizio pugno quindi tornare dopo aver provato qualcosa .. E passare attraverso tutorial listView.E pratico –

risposta

0

È necessario impostare Listener del pulsante nel metodo getView() - del proprio list-adapter. In questo metodo getView() - si assegna un layout a un elemento elenco. se hai fatto questo, devi solo impostare il Listener su questa vista (pulsante) e gestire l'evento onClick().

4

prima di tutto è necessario rendere il proprio adattatore personalizzato con una vista che ha i 3 punti.

quindi nel metodo getView() o newView() si imposta l'ascoltatore sull'immagine a 3 punti.

Penso che PopupMenu è quello che stai cercando, è supportata dal API 11.

se si desidera supportare la versione anche in precedenza delle API è possibile utilizzare PopupMenu classe fornito dal support library v7.

l'utilizzo è abbastanza semplice. tu lo definisci con l'id della vista che vuoi mostrare al menu accanto, e poi puoi gonfiare direttamente una risorsa di menu lì come se fosse un menu comune.

0

Non sono sicuro di aver capito correttamente ma è possibile attivare questo metodo per aprire una finestra di dialogo a comparsa con un listview.

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setTitle("Title if Any"); 
    builder.setItems(R.array.listoptions, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int itemClicked) { 
        String[] option_array = getResources().getStringArray(R.array.listoptions); 

        String optionSelected = option_array[itemClicked]; 
      } 
    }); 
    return builder.create(); 
} 

Vedi Adding a List

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string-array name="listoption"> 
    <item>Install</item> 
    <item>Add to listview</item> 
</string-array> 
</resources> 

Spero che questo aiuti.

8

È possibile utilizzare in questo modo:

public class MainActivity extends Activity { 
    ListView listView_Actions; 
    ArrayList<String> actionsArrayList; 
    Button btn_ViewPopUp; 
    ArrayAdapter<String> actionsAdapter; 
    static final int CUSTOM_DIALOG_ID1 = 1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     btn_ViewPopUp=(Button) findViewById(R.id.btn_ViewPopUp); 

     actionsArrayList=new ArrayList<String>(); 
     actionsArrayList.add("Action 1"); 
     actionsArrayList.add("Action 2"); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 

     btn_ViewPopUp.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       showDialog(CUSTOM_DIALOG_ID1); 
       actionsAdapter = new MyCustomBaseAdapter(getApplicationContext(), R.layout.list_actions, actionsArrayList); 
       listView_Actions.setAdapter(actionsAdapter); 
      } 
     }); 
    } 

    @Override 
    protected Dialog onCreateDialog(int id) { 
     Dialog dialog = null; 
     switch (id) { 
      case CUSTOM_DIALOG_ID1: 
       dialog = new Dialog(MainActivity.this); 
       dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
       dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 
       dialog.setContentView(R.layout.list_actions); 
       listView_Actions = (ListView) dialog.findViewById(R.id.listView_Actions); 
       break; 
     } 
     return dialog; 
    } 

    class MyCustomBaseAdapter extends ArrayAdapter<String> 
    { 
     public MyCustomBaseAdapter(Context context, int textViewResourceId, ArrayList<String> actionsArrayList) { 
      super(context, textViewResourceId,actionsArrayList); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View v = inflater.inflate(R.layout.action_list_cell, null); 
      final TextView lblContactAction; 
      lblContactAction = (TextView) v.findViewById(R.id.txtContactAction); 

      lblContactAction.append(actionsArrayList.get(position)); 
      return v; 
     } 
    } 
} 

Ora i file XML:

action_list_cell.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:background="@android:color/background_light" > 

    <TextView 
     android:id="@+id/txtContactAction" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="" 
     android:textSize="18dp" 
     android:textColor="@android:color/black" /> 

</LinearLayout> 

list_actions.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:background="@drawable/rounded_corner_top"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="10dp" 
     android:orientation="vertical" > 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="#DB6A16" 
      android:orientation="vertical" 
      android:paddingBottom="2dp" 
      android:paddingLeft="2dp" 
      android:paddingRight="2dp" > 

      <ListView 
       android:id="@+id/listView_Actions" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:background="#ffffff" > 
      </ListView> 
     </LinearLayout> 
    </LinearLayout> 

</LinearLayout> 
+0

bello ...! Io uso lo stesso metodo. :) –

+0

Ciao, ho usato il tuo codice all'interno di Fragments ma protetto Dialog onCreateDialog (int id) Il metodo non è presente in Fragments, cosa dovrei fare? – Achin

+0

Ora showDialog è obsoleto. utilizzare PopupMenu invece – Anthone

8

ActionBarCompat Lista PopupMenu implementazione è here (con porta di nuovo a disposizione perché utilizza ABC)!

enter image description here

È inoltre possibile ottenere questo campione da Github o da SDK (Mr.Morgan commentato di seguito)

/sdk/campioni/android-19/ui/ActionBarCompat-ListPopupMenu. Assicurarsi di installare I campioni per SDK sotto Android 4.4.2 (API 19)

+6

Dove ottenere questo esempio? – zest

+1

@zest Questo esempio può essere trovato in '/ sdk/samples/android-19/ui/ActionBarCompat-ListPopupMenu'. Assicurati di installare _Samples per SDK_ sotto _Android 4.4.2 (API 19) _. –

+0

grazie per aver segnalato, aggiornato la risposta. –

2

Ora showDialog è deprecato, utilizzare PopupMenu invece E AppCompat PopupMenu f si desidera supportare versione prima V11

public class MainActivity extends Activity { 
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 
     } 
    } 
15

utilizzando popup menu è abbastanza semplice per creare un menu con questi tre passi:

1 - Aggiungere un click ascoltatore al tasto menu utilizzando OnClickListener o come io preferisco dalla xml di layout:

<ImageButton android:id="@+id/menu_button" android:onClick="showMenu" ... /> 

2 - Creare il layout del menu menu_layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:id="@+id/item_settings" 
     android:showAsAction="ifRoom|withText" 
     android:title="Settings" 
     android:visible="true"/> 
    <item 
     android:id="@+id/item_about" 
     android:showAsAction="ifRoom|withText" 
     android:title="About" 
     android:visible="true"/> 
</menu> 

3 - creare un menu a comparsa, gonfiare il layout xml e spettacolo it:

public void showMenu (View view) 
{ 
    PopupMenu menu = new PopupMenu (this, view); 
    menu.setOnMenuItemClickListener (new PopupMenu.OnMenuItemClickListener() 
    { 
     @Override 
     public boolean onMenuItemClick (MenuItem item) 
     { 
      int id = item.getItemId(); 
      switch (id) 
      { 
       case R.id.item_settings: Log.i (Tag, "settings"); break; 
       case R.id.item_about: Log.i (Tag, "about"); break; 
      } 
      return true; 
     } 
    }); 
    menu.inflate (R.menu.menu_layout); 
    menu.show(); 
} 
+0

risposta elegante, la più semplice che ho trovato! Salvato il mio giorno – TapanHP

+0

Come visualizzare le icone con il menu delle opzioni? 'Android: icon' non funziona per me. –