Cum de a opri clicurile lungi fiind tratate ca pe un scurt-click atunci când nu este afișat niciun meniu contextual

Am o vizualizare de listă care a fost înregistrată pentru un meniu contextual. Pentru anumite elemente din listă, un meniu contextual nu este aplicabil. În aceste cazuri, pur și simplu nu măresc un meniu în metoda onCreateContextMenu.

Din păcate, acest lucru înseamnă că atunci când elementele care nu afișează un meniu contextual sunt clicuri lungi pe Android, atunci acestea se ocupă de un clic scurt (probabil că meniul contextual va reveni în mod normal pentru a spune că evenimentul cu clic lung a fost gestionat).

Acest lucru duce la un comportament inconsistent în vizualizarea de listă - unele elemente afișează un meniu contextual atunci când faceți clic pe ele lungi - alții nu fac și apoi efectuează comportamentul implicit al clicurilor. Cum pot să mă asigur că și elemente care nu afișează un meniu contextual consumă un click lung, astfel încât metoda onItemClick să nu fie apelată?

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {

  AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
  Playable playable = (Playable) info.targetView.getTag(R.id.playable);
  if (playable != null && !(playable instanceof AutoRadioStation) && !(playable.getId().equals(Playlist.AUTOMATIC_PLAYLIST))) {
    v.setTag(R.id.playable, playable);//This copies the tag so that it is contained within the view used for the menu.
    Drawable stationImage = (Drawable) ((ImageView) info.targetView.findViewById(R.id.artwork)).getDrawable().getConstantState().newDrawable();

    menu.setHeaderTitle(playable.getName());
    menu.setHeaderIcon(stationImage);
    MenuInflater inflater = getActivity().getMenuInflater();
    inflater.inflate(R.menu.saved_context_menu, menu);
  }
}
1

2 răspunsuri

Am avut o problemă similară și am ajuns la un Dialog în locul unui meniu contextual.

Activitatea mea implementează OnItemLongClickListener și Îmi arăt din onLongItemClick() dacă condiția este îndeplinită.

1
adăugat
Nu cred că puteți declanșa direct meniul contextual, este afișat pe clic lung atunci când este implementat onCreateContextMenu. Dacă nu mă înșel, trebuie să creați dialogul dvs., care este un proces destul de ușor, după cum puteți vedea în link-ul doc atașat la răspunsul meu
adăugat autor znat, sursa
M-am uitat la asta pentru că cel puțin asta însemna că aș putea reveni adevărat din OnItemLongClick în toate cazurile. Trebuie să creați propriul dialog sau există o modalitate de a invoca meniul contextual normal pentru vizualizarea de listă din OnItemLongClickListener?
adăugat autor Barry Irvine, sursa

În sfârșit, am reușit să pun în aplicare o versiune a soluției NathanZ. Nu pare să existe multe lucruri despre transformarea unui contextMenu într-un DialogFragment, așa că îmi voi lipi cea mai mare parte a soluției aici.

Implementarea unui ascultător onLongItemClick a însemnat, de asemenea, că am reușit să am un eveniment cu clic lung care nu necesită un meniu în vizualizarea de listă. Din păcate pentru că nu puteți trece prin meniuri la un dialog, a trebuit să reutilizez un tip ListViewElement existent pentru a stoca un id și un șir de text pentru fiecare element "meniu" din lista mea.

  @Override
  public boolean onItemLongClick(AdapterView<?> parent, View view, int item, long position) {

    Playable playable = (Playable) view.getTag(R.id.playable);
    //Switch haptic feedback off by default so if we don't handle the long click we don't vibrate
    parent.setHapticFeedbackEnabled(false);

    if (playable == null) {
     //This must be a message bar so the only option is to update all saved content
      updateAll();
      parent.setHapticFeedbackEnabled(true);
    } else {
      if (!(playable instanceof AutoRadioStation) && !(playable.getId().equals(Playlist.AUTOMATIC_PLAYLIST))) {
        Drawable drawable = (Drawable) ((ImageView) view.findViewById(R.id.artwork)).getDrawable().getConstantState().newDrawable();
        showContextDialog(playable, drawable);
        parent.setHapticFeedbackEnabled(true);
      }
    }
    return true;
  }
  private void showContextDialog(Playable playable, Drawable drawable) {
    FragmentManager fm = getActivity().getSupportFragmentManager();
    final List array = new ArrayList();
    array.add(new ListViewElement(R.id.menu_share, null, getString(R.string.share), true));
    array.add(new ListViewElement(R.id.menu_delete, null, getString(R.string.delete), true));
    ContextMenuDialog dialog = new ContextMenuDialog(drawable, playable.getName(), array, playable);
    dialog.setOnItemClickListener(this);
    dialog.show(fm, "Context Menu");
  }

  //Callback from the ContextMenuDialog class
  @Override
  public void onItemClickDialogFragment(int option, Playable playable) {
    switch (option) {
      case R.id.menu_delete :
       //Perform delete actions
        break;
      case R.id.menu_share :
       //Perform share actions
        break;
    }
  }


public class ContextMenuDialog extends DialogFragment implements OnItemClickListener {

  private Drawable drawableIcon;
  private String title;
  private List values;
  private Playable playable;
  private DialogFragmentOnItemClickListener listener;

  public interface DialogFragmentOnItemClickListener {
    void onItemClickDialogFragment(int option, Playable playable);
  }

  public void setOnItemClickListener(DialogFragmentOnItemClickListener listener) {
    this.listener = listener;
  }

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //Create the dialog without a title since the layout includes a customized title
    setStyle(DialogFragment.STYLE_NO_TITLE, R.style.MyDialogStyle);
  }

  public ContextMenuDialog(Drawable drawableIcon, String title, List values, Playable playable) {
    this.drawableIcon = drawableIcon;
    this.title = title;
    this.values = values;
    this.playable = playable;
  }


  public ContextMenuDialog(int drawableResource, String title, List values, Playable playable) {
    this.drawableIcon = getResources().getDrawable(drawableResource);
    this.title = title;
    this.values = values;
    this.playable = playable;
  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.context_menu, container, true);
    TextView titleView = (TextView) view.findViewById(R.id.context_menu_title);
    titleView.setText(title);
    ImageView icon = (ImageView) view.findViewById(R.id.context_menu_artwork);
    icon.setImageDrawable(drawableIcon);

    ListView listView = (ListView) view.findViewById(R.id.context_menu_listview);
    ContextMenuAdapter adapter = new ContextMenuAdapter(getActivity(), R.layout.context_menu_list_item, values);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(this);
    return view;
 }
1
adăugat
Android dezvoltatori, România — Moldova
Android dezvoltatori, România — Moldova
27 participanți

Parteneri: ciupacabra.com, @php_ro, @js_ro, @node_ro iOS: @ro_ios Reguli: https://github.com/js-ro/it-telegram/blob/master/RULES.md