Autore Topic: apertura menu su onLongClick  (Letto 703 volte)

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
apertura menu su onLongClick
« il: 04 Aprile 2013, 14:19:55 CEST »
0
salve,
scusate il titolo poco chiaro ma non so come spiegarmi :-P

praticamente volevo creare uno di quei menu che si aprono quando si fa il longclick su qualcosa...
es banale..
sulla rubrica quando si tiene premuto esce il menu...
per far quel menu c'e' una funzione apposta oppure è una semplice dialog?

+ che altro se fosse una dialog avrei in memoria una dialog "nascosta" per ogni oggetto della mia lista...
diventerebbe una cosa pesante... o no?



attualmente ho una lista con parecchie voci.. ho creato un listener e associato ad ogni elemento della lista il suo listener (ogni oggetto listener ha nel costruttore l'oggetto riga) quindi se ho 200 righe ho 200 oggetti listener.... se ad ogni listener ho un dialog avrei anche altri 200 dialog...
« Ultima modifica: 04 Aprile 2013, 14:24:35 CEST da Trigun »

Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:apertura menu su onLongClick
« Risposta #1 il: 04 Aprile 2013, 16:08:11 CEST »
0
è giusto settare l'onLongClickListener a ogni riga della lista,l'importante è che il listener non lo crei al momento ma lo crei prima e lo passi a tutte le righe,altrimenti hai sì 200 listener diversi ma che fanno tutti la stessa cosa.

il dialog o lo crei al momento nel listener o tieni il suo riferimento da qualche parte(nell'activity?nell'adapter?) e lo modifiche e mostri nel listener

Offline s1m0

  • Utente junior
  • **
  • Post: 122
  • Respect: +14
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Sistema operativo:
    Android 4.1.2
Re:apertura menu su onLongClick
« Risposta #2 il: 04 Aprile 2013, 16:15:13 CEST »
+1
Devi utilizzare il ContextMenu

1) Chiami il registerForContextMenu

Codice: [Seleziona]
registerForContextMenu(myListview);

2) Implementi il metodo onCreateContextMenu, inserendo le voci che vuoi far visualizzare e i relativi ID
Codice: [Seleziona]

private final int CONTEXTMENU_EDIT = 0;
private final int CONTEXTMENU_DELETE = 1;

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
                menu.add(0, CONTEXTMENU_EDIT, 0, R.string.contextMenu_edit);
        menu.add(0, CONTEXTMENU_DELETE, 1, R.string.contextMenu_delete);
}
3) Implementi il metodo onContextItemSelected
Codice: [Seleziona]
@Override
public boolean onContextItemSelected(android.view.MenuItem item) {

        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        long id = myListview.getItemIdAtPosition(info.position);

        switch(tem.getItemId())
        {
           case CONTEXTMENU_EDIT:
                Toast.makeText(activity, "CONTEXTMENU_EDIT - id " + id, Toast.LENGTH_SHORT).show();
                return true;
           case CONTEXTMENU_DELETE:
                Toast.makeText(activity, "CONTEXTMENU_DELETE - id " + id, Toast.LENGTH_SHORT).show();
                return true;
        }

        return false;
}
« Ultima modifica: 04 Aprile 2013, 16:37:18 CEST da s1m0 »
Un click sul pulsante "Thanks" è sempre gradito :-)

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:apertura menu su onLongClick
« Risposta #3 il: 04 Aprile 2013, 16:19:49 CEST »
0
sisi l'evento funziona ^^ già testato tempo fa che l'avevo implementato.. perchè mi era venuta l'idea ma alla fine non ho mai fatto il menu perchè non sapevo che metterci :-P
ora 1 opzione mi è venuta e quindi la volevo mettere :-)
il problema è che se metto la dialog dentro la mia classe listener avrei dal punto di vista software un oggetto dialog assegnato ad ogni listener....
e mi sembrava pesante come cosa..

quello che mi interessava sapere era se c'era una funzione già prefatta per gestire la cosa... un po' come il menu che si apre con il tasto menu del telefono che è "standard"



edit
ecco credo che mi abbia risposto simo :-P ora vado a vedermi se è quello che cercavo io

Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:apertura menu su onLongClick
« Risposta #4 il: 04 Aprile 2013, 16:30:23 CEST »
+1
esatto oppure puoi usare il contextmenu :P
Menus | Android Developers


cmq io non dicevo di mettere il dialog dentro il listener,lo dichiari e lo crei prima,che ne so nell'activity o nell'adapter, e al listener lo mostri,oppure lo crei e lo mostri al momento dell'onclick

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:apertura menu su onLongClick
« Risposta #5 il: 04 Aprile 2013, 17:55:57 CEST »
0
sto provando il context ma non mi funziona....

il codice che uso è questo:

Codice (Java): [Seleziona]
        @SuppressLint("SimpleDateFormat")
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                context = this;
                this.db = MyDatabase.getInstance();
                if (!checkPreferencesData()) {
                        Intent myIntent = new Intent(this, Settings.class);
                        this.startActivity(myIntent);
                } else {
                        setContentView(R.layout.main);
                        mAdapter = new ListinoExpandleAdapter();
                        setListAdapter(mAdapter);
                        registerForContextMenu(getExpandableListView());
                        Configuration config = getResources().getConfiguration();

                        if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
                                ListinoAdapter mAdapterList = new ListinoAdapter();
                                ListView lista = (ListView) findViewById(R.id.menu_list);
                                lista.setAdapter(mAdapterList);
                        }

                        ExpandableListView expandableListView = getExpandableListView();
                        int groupCount = expandableListView.getExpandableListAdapter()
                                        .getGroupCount();
                        for (int i = 0; i < groupCount; i++) {
                                if (((Gruppo) expandableListView.getExpandableListAdapter().getGroup(i)).getStatus() == 1)
                                        expandableListView.expandGroup(i);

                                if (savedInstanceState != null) {
                                        position = savedInstanceState.getInt("position");
                                        state = savedInstanceState.getParcelable("state");
                                        expandableListView.setSelection(position);
                                        expandableListView.onRestoreInstanceState(state);
                                }

                        }
                        runTask();

                        Bundle extras = getIntent().getExtras();
                        if (extras != null) {
                                if (extras.getInt("showLog") == 1)
                                        showDialog(DIALOG_LOG_STAMP);
                        }
                }
        }

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v,
                        ContextMenuInfo menuInfo) {
                super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(0, 99808, 0, "test");
        }
       
        @Override
        public boolean onContextItemSelected(android.view.MenuItem item) {

                AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
                long id = getExpandableListView().getItemIdAtPosition(info.position);

                switch(item.getItemId())
                {
                   case 99808:
                        Log.v("context", "test " + id);
                        return true;
                }

                return false;
        }


ora io ho aggiunto solo le 2 nuove funzioni.. poichè avevo già dichiarato (per non so quale motivo credo serva alla expanded list) la chiamata registerForContextMenu()

solo che non fa nulla... se tengo premuto...
ovviamente ho fatto una cosa cosi' al volo x testarla e le funzioni del menu son da sistemare ^^


edit
mi correggo il menu esce... ma solo se premo sui gruppi e non sulla linea.. (è una lista espandibile di quelle che ci premi sopra e ti si apre chiude tutta la sezione...)
come posso far per gestire anche il resto? :-P


edit2:
penso che il problema dipenda da registerForContextMenu(getExpandableListView());
forse non dovrei metter quella funzione dentro... ma quella roba stava già li da tanto tempo... credo faccia parte della expanded list view...



edit3
secondo questa guida
Context menus for expandable lists | Steve Oliver
dovrebbe funzionare... pero' dalla parte iniziale dice solo di metter la funzione ma non dice che gli devo dare in pasto ....
« Ultima modifica: 04 Aprile 2013, 18:52:06 CEST da Trigun »

Offline s1m0

  • Utente junior
  • **
  • Post: 122
  • Respect: +14
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Sistema operativo:
    Android 4.1.2
Re:apertura menu su onLongClick
« Risposta #6 il: 04 Aprile 2013, 19:29:36 CEST »
0
Credo che per ogni child devi settare il context menu tramite il metodo setOnCreateContextMenuListener.

Guarda questo esempio: http://stackoverflow.com/a/11585498
Un click sul pulsante "Thanks" è sempre gradito :-)

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:apertura menu su onLongClick
« Risposta #7 il: 04 Aprile 2013, 20:10:27 CEST »
0
eh ma se leggi la risposta dice di fare come faccio io...
non vorrei sia dovuto al fatto che come child del gruppo io uso delle righe modificate con parecchi campi e per questo mi fa tutti sti problemi....
anche se non credo....

Post unito: 06 Aprile 2013, 08:52:10 CEST
ok credo di aver trovato cosa causa il problema...

praticamente dipende dall'adapter e in particolare da getChildView

il mio codice è questo:

Codice (Java): [Seleziona]
        public View getChildView(int groupPosition, int childPosition,
                        boolean isLastChild, View convertView, ViewGroup parent) {
                ViewHolder layout;
                String s = "";

                 if (convertView == null) {
                        convertView = inflater.inflate(R.layout.rigaordine, null);
                        layout = new ViewHolder();
                        layout.lay = (LinearLayout) convertView
                                        .findViewById(R.id.rigaordine);
                        layout.infotxt = (TextView) convertView.findViewById(R.id.infotxt);
                        layout.infotxt2 = (TextView) convertView
                                        .findViewById(R.id.infotxt2);
                        layout.nome = (TextView) convertView.findViewById(R.id.nome);
                        layout.history = (TextView) convertView.findViewById(R.id.history);
                        layout.quantita = (TextView) convertView
                                        .findViewById(R.id.quantita);
                        layout.aggiungi = (Button) convertView.findViewById(R.id.aggiungi);
                        layout.sottrai = (Button) convertView.findViewById(R.id.sottrai);
                        layout.historymarker = (LinearLayout) convertView
                                        .findViewById(R.id.historymarker);
//                       layout.info = (ImageView) convertView.findViewById(R.id.info);
                        convertView.setTag(layout);
                } else {
                        layout = (ViewHolder) convertView.getTag();
                }
                layout.nome.setText(getChild(groupPosition, childPosition).getNome());

//              layout.lay.setOnLongClickListener(new RigaListener(getChild(
//                              groupPosition, childPosition)));
                layout.aggiungi.setOnClickListener(new QuantitaEditListener(1,
                                getChild(groupPosition, childPosition)));
                layout.sottrai.setOnClickListener(new QuantitaEditListener(-1,
                                getChild(groupPosition, childPosition)));
                // layout.info.setOnClickListener(new QuantitaEditListener(0, getChild(
                // groupPosition, childPosition)));
               

                int widt = layout.nome.getWidth();
                if (widt != 0 && ListinoApp.getInstance().nameViewWidth != widt) {
                        ListinoApp.getInstance().nameViewWidth = widt;
                }

                layout.historymarker.setLayoutParams(new LayoutParams((int) (ListinoApp
                                .getInstance().nameViewWidth * getChild(groupPosition,
                                childPosition).getMarker()), LayoutParams.MATCH_PARENT));

                layout.infotxt
                                .setText(getChild(groupPosition, childPosition).getInfo());
                layout.infotxt2.setText(getChild(groupPosition, childPosition)
                                .getInfo2());
                for (int i = getChild(groupPosition, childPosition).getQuantityList()
                                .size() - 1; i > 0; i--) {
                        s += getChild(groupPosition, childPosition).getQuantityList()
                                        .get(i) + " ";
                }
                layout.history.setText(s);
                layout.quantita.setText(""
                                + getChild(groupPosition, childPosition).getQuantityList().get(
                                                0));
                return convertView;
        }


Codice (Java): [Seleziona]
        class ViewHolder {
                TextView nome;
                TextView infotxt;
                TextView infotxt2;
                TextView history;
                TextView quantita;
                Button aggiungi;
                Button sottrai;
                ImageView info;
                LinearLayout lay;
                LinearLayout historymarker;
        }

ora sto provando a togliere pezzo per pezzo di codice e vedere cosa causa il problema...

ma non mi sembra di aver fatto cose particolarmente strane...

Post unito: 06 Aprile 2013, 09:35:00 CEST
ok trovato la soluzione...


basta mettere
convertview.setLongClickable(true);
o inserirlo nell'xml...


fonte:
http://stackoverflow.com/a/10368525
« Ultima modifica: 06 Aprile 2013, 09:35:01 CEST da Trigun, Reason: Merged DoublePost »