2015-04-19 23 views
9

Cerco molto sulla rete ma non c'è nulla che impedisca la chiusura del menu popup.Come impedire la chiusura del menu popup sulla casella di controllo fare clic su

Ogni volta che si fa clic sulla casella di controllo o su qualsiasi altra voce di menu popup, il menu popup si chiude da solo. Come posso impedirgli di ignorare quando l'utente seleziona/deseleziona la casella di controllo nel menu popup.

Sto visualizzando il menu popup sull'evento click della voce del menu della barra delle azioni.

//main_menu.xml 
<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="com.worldofjobs.woj.MainActivity" > 

<item 
    android:id="@+id/action_popUpMenu" 
    android:icon="@drawable/ic_action_overflow" 
    android:title="@string/main_action_popUpMenu" 
    app:showAsAction="always"/> 

</menu> 

//popup_items.xml 
<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" > 

<item 
    android:id="@+id/refresh_item" 
    android:title="@string/main_refresh"/> 
<item 
    android:id="@+id/checkbox_item" 
    android:checkable="true" 
    android:title="Start notification"/> 
<item 
    android:id="@+id/changePasswrod_item" 
    android:title="@string/main_changePassword"/> 
<item 
    android:id="@+id/deleteAccount_item" 
    android:title="@string/main_deleteAccount"/> 
<item 
    android:id="@+id/logout_item" 
    android:title="@string/main_logout"/> 

</menu> 

/** 
* Shows popup menu on click of action bar-menu inflates from 
* menu.pop_items-xml 
*/ 
private void showPopup() { 

    try { 

     View v = findViewById(R.id.action_popUpMenu); 

     PopupMenu popup = new PopupMenu(this, v); 
     popup.setOnMenuItemClickListener(MainActivity.this); 

     MenuInflater inflater = popup.getMenuInflater(); 
     inflater.inflate(R.menu.pop_items, popup.getMenu()); 
     popup.show(); 

    } catch (Exception e) { 

     Log.e("MainActivity-showPopup:", e.toString()); 
    } 
} 

/** 
* Handles click events of popup menu items 
*/ 
@Override 
public boolean onMenuItemClick(MenuItem item) { 

    super.onMenuItemSelected(1, item); 
    switch (item.getItemId()) { 

    case R.id.refresh_item: 
     refresh(); 
     return true; 

    case R.id.checkbox_item: 
     return true; 

    case R.id.changePasswrod_item: 
     changePasswordPopup(); 
     return true; 

    case R.id.deleteAccount_item: 
     deleteAccount(); 
     return true; 

    case R.id.logout_item: 
     session.logout(); 
     finish(); 
     return true; 
    } 
    return true; 
} 
+0

Dov'è il codice della casella di controllo, inserire il codice completo. –

+0

Controlla il mio codice aggiornato (notification_item - checkbox_item). checkbox_item è la voce di menu popup controllabile. Non ho ancora fatto nulla nel suo evento click/check finché non si interrompe la chiusura del menu popup. – Sushant

+0

@ sushant- Quale vista conservare in v –

risposta

0

Nel tuo caso R.id.checkbox_item

return false; 

Questo dirà il sistema che l'evento non è stato ancora handeled e non sarà dimiss il menu. Vedere HERE

+5

No. La sua non funziona. – Sushant

+0

Dove ascolti perché è stato modificato lo stato? –

+0

Non ho ancora fatto nulla al suo click/check evento fino a quando non si interrompe la chiusura del menu popup. – Sushant

0

Prova dichiarando l'PopupMenu a livello globale e chiamando popup.show(); prima di tornare vero in onMenuItemClick funzione.

5

Il trucco qui è mostrare il menu subito dopo averlo chiuso.
Di seguito è riportato un frammento di codice di esempio:

popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() { 
@Override 
public boolean onMenuItemClick(MenuItem item) { 
    if(item.getItemId()==R.id.search_by_date_checkbox){ 
     item.setChecked(!item.isChecked()); 
    } 
    //This is the trick here!!!! 
    popupMenu.show(); 
    return true; 
    } 

}); 

Si può provare questo trucco con il codice! Questo è come l'ho fatto. :)

14

L'utilizzo di popupMenu.show() per visualizzare nuovamente il menu di scelta rapida non funziona correttamente con voci di menu controllabili quando si modifica lo stato selezionato.

Qui un metodo che impedisce di chiudere il menu popup in primo luogo. Assicurati che onMenuItemClick restituisca false.

popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
    @Override 
    public boolean onMenuItemClick(MenuItem item) { 

     item.setChecked(!item.isChecked()); 

     // Do other stuff 

     // Keep the popup menu open 
     item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 
     item.setActionView(new View(context)); 
     item.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { 
      @Override 
      public boolean onMenuItemActionExpand(MenuItem item) { 
       return false; 
      } 

      @Override 
      public boolean onMenuItemActionCollapse(MenuItem item) { 
       return false; 
      } 
     }); 
     return false; 
    } 
}); 
+4

Funziona anche senza setOnActionExpandListener() – SergeyA

+0

Mi ha dato un errore dicendo che dovevo usare MenuItemCompat. Ho il codice ottimizzato nella mia risposta qui sotto (https: // StackOverflow.COM/A/44296077/2,423194 millions). –

0

Funziona aggiungendo popup.show(); al clic del pulsante e alla fine del clic.

final ImageButton layerButton = (ImageButton) findViewById(R.id.layers); 
final PopupMenu popup = new PopupMenu(MapsActivity.this, layerButton); 
popup.getMenuInflater().inflate(R.menu.toolbar_menu, popup.getMenu()); 

layerButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      //Here 
      popup.show(); 

      popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
       @Override 
       public boolean onMenuItemClick(MenuItem item) { 

        handleClicksOnCheckBoxes(item); 

        return true; 

       } 

      }); 

      //And here 
      popup.show(); 


     } 
    }); 

Tuttavia, questa non è una soluzione ottimale perché se la lista ha così tanti elementi che sarà possibile scorrere l'elenco, l'elenco verrà spostata verso l'alto quando si fa clic su un elemento.

1

La risposta di Oliver sopra (https://stackoverflow.com/a/31727213/2423194) mi ha causato un arresto anomalo e il suo messaggio mi ha suggerito di utilizzare MenuItemCompat. Dopo qualche ritocco a questo codice, funziona:

// Keep the popup menu open    
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 
item.setActionView(new View(getContext())); 
MenuItemCompat.setOnActionExpandListener(item, new MenuItemCompat.OnActionExpandListener() { 
    @Override 
    public boolean onMenuItemActionExpand(MenuItem item) { 
     return false; 
    } 

    @Override 
    public boolean onMenuItemActionCollapse(MenuItem item) { 
     return false; 
    } 
}); 

Grazie Oliver!

+1

MenuItemCompat.OnActionExpandListener ora è deprecato. –

+0

Sì, è deprecato. Usa 'item.setOnActionExpandListener' –