Creación de un menú después de un evento de clics largo en una vista de lista -- android campo con listview campo con menu campo con long-click camp Relacionados El problema

creating a menu after a long click event on a list view


70
vote

problema

Español

Tengo una vista de lista conectada a una base de datos, que muestra todas las entradas. Quiero que aparezca un menú. Si el usuario hace clic a largo, hace clic en un elemento en la vista ListView (Entrada de la base de datos), que muestra las opciones para editar o eliminar la entrada. Cómo puedo hacer esto.

Hasta ahora, he intentado usar un oyente onitemlongClick y una brindis que muestra el ID de la vista haga clic a largo.

  @Override public boolean onItemLongClick(AdapterView<?> parent, View view,         int position, long id) {      String res = Long.toString(id);      Toast toast = Toast.makeText(this, res, Toast.LENGTH_SHORT);      toast.show();      return true; }   
Original en ingles

I have a list view connected to a database, showing a all the entries. I want a menu to show up if the user long clicks a item in the listview(database entry), showing options to edit or delete the entry. how can i do this.

Till now, I have tried using a onItemLongClick listener and a toast in it showing the id of the view long clicked.

@Override public boolean onItemLongClick(AdapterView<?> parent, View view,         int position, long id) {      String res = Long.toString(id);      Toast toast = Toast.makeText(this, res, Toast.LENGTH_SHORT);      toast.show();      return true; } 
           

Lista de respuestas

50
 
vote
vote
La mejor respuesta
 

En lugar de usar import { Injectable, Compiler, Injector } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class LazyComponentService { private componenttRefs = { myFirstLazyModuleId: import('../path/to/first/lazy/module/component.module'), mySecondLazyModuleId: import('../path/to/second/lazy/module/component.module') }; constructor( private compiler: Compiler, private injector: Injector, ) { } async loadComponent(moduleId, container) { let ref; try { const moduleObj = await this.componenttRefs[moduleId]; const module = moduleObj[Object.keys(moduleObj)[0]]; const moduleFactory = await this.compiler.compileModuleAsync(module); const moduleRef: any = moduleFactory.create(this.injector); const componentFactory = moduleRef.instance.resolveComponent(); ref = container.createComponent(componentFactory, null, moduleRef.injector); } catch (e) { console.error(e); } return ref; } } 2 puede usar

  import { Injectable, Compiler, Injector } from '@angular/core';  @Injectable({     providedIn: 'root' }) export class LazyComponentService {      private componenttRefs = {         myFirstLazyModuleId: import('../path/to/first/lazy/module/component.module'),         mySecondLazyModuleId: import('../path/to/second/lazy/module/component.module')     };      constructor(         private compiler: Compiler,         private injector: Injector,     ) { }      async loadComponent(moduleId, container) {          let ref;         try {             const moduleObj = await this.componenttRefs[moduleId];             const module = moduleObj[Object.keys(moduleObj)[0]];             const moduleFactory = await this.compiler.compileModuleAsync(module);             const moduleRef: any = moduleFactory.create(this.injector);             const componentFactory = moduleRef.instance.resolveComponent();             ref = container.createComponent(componentFactory, null, moduleRef.injector);         } catch (e) {             console.error(e);         }         return ref;      }  } 3  

donde configura las opciones para editar y eliminar o lo que sea que necesite.

Las acciones para el elemento seleccionado en el menú contextual se pueden procesar en

  import { Injectable, Compiler, Injector } from '@angular/core';  @Injectable({     providedIn: 'root' }) export class LazyComponentService {      private componenttRefs = {         myFirstLazyModuleId: import('../path/to/first/lazy/module/component.module'),         mySecondLazyModuleId: import('../path/to/second/lazy/module/component.module')     };      constructor(         private compiler: Compiler,         private injector: Injector,     ) { }      async loadComponent(moduleId, container) {          let ref;         try {             const moduleObj = await this.componenttRefs[moduleId];             const module = moduleObj[Object.keys(moduleObj)[0]];             const moduleFactory = await this.compiler.compileModuleAsync(module);             const moduleRef: any = moduleFactory.create(this.injector);             const componentFactory = moduleRef.instance.resolveComponent();             ref = container.createComponent(componentFactory, null, moduleRef.injector);         } catch (e) {             console.error(e);         }         return ref;      }  } 4  

Para obtener más información sobre el menú contextual, consulte aquí .

Para un tutorial paso a paso, visite aquí .

editar El segundo enlace se rompe ya que era bastante viejo. Pero supongo que puede referir a una de las otras respuestas altamente votadas para ver todos los pasos involucrados,

 

Instead of using onItemLongClick you can use

public void onCreateContextMenu(final ContextMenu menu,                      final View v, final ContextMenuInfo menuInfo) {  ... } 

where you setup the options for edit and delete or whatever you need to.

The actions for the item selected from the context menu can be processed in

public boolean onContextItemSelected(final MenuItem item) 

For more information on context menu see here.

For a step by step tutorial visit here.

Edit The second link is broken as it was quite old. But I guess you can refer one of the other highly voted answer to see all the steps involved,

 
 
     
     
116
 
vote

Primero debe registrar su menú contextual en la vista de lista.

  import { Injectable, Compiler, Injector } from '@angular/core';  @Injectable({     providedIn: 'root' }) export class LazyComponentService {      private componenttRefs = {         myFirstLazyModuleId: import('../path/to/first/lazy/module/component.module'),         mySecondLazyModuleId: import('../path/to/second/lazy/module/component.module')     };      constructor(         private compiler: Compiler,         private injector: Injector,     ) { }      async loadComponent(moduleId, container) {          let ref;         try {             const moduleObj = await this.componenttRefs[moduleId];             const module = moduleObj[Object.keys(moduleObj)[0]];             const moduleFactory = await this.compiler.compileModuleAsync(module);             const moduleRef: any = moduleFactory.create(this.injector);             const componentFactory = moduleRef.instance.resolveComponent();             ref = container.createComponent(componentFactory, null, moduleRef.injector);         } catch (e) {             console.error(e);         }         return ref;      }  } 5  

Luego, simplemente anula los métodos de actividad.

  import { Injectable, Compiler, Injector } from '@angular/core';  @Injectable({     providedIn: 'root' }) export class LazyComponentService {      private componenttRefs = {         myFirstLazyModuleId: import('../path/to/first/lazy/module/component.module'),         mySecondLazyModuleId: import('../path/to/second/lazy/module/component.module')     };      constructor(         private compiler: Compiler,         private injector: Injector,     ) { }      async loadComponent(moduleId, container) {          let ref;         try {             const moduleObj = await this.componenttRefs[moduleId];             const module = moduleObj[Object.keys(moduleObj)[0]];             const moduleFactory = await this.compiler.compileModuleAsync(module);             const moduleRef: any = moduleFactory.create(this.injector);             const componentFactory = moduleRef.instance.resolveComponent();             ref = container.createComponent(componentFactory, null, moduleRef.injector);         } catch (e) {             console.error(e);         }         return ref;      }  } 6  

Aquí hay un ejemplo de archivo MENU_LIST.XML (debe colocar el archivo en la carpeta RES / MENU).

  import { Injectable, Compiler, Injector } from '@angular/core';  @Injectable({     providedIn: 'root' }) export class LazyComponentService {      private componenttRefs = {         myFirstLazyModuleId: import('../path/to/first/lazy/module/component.module'),         mySecondLazyModuleId: import('../path/to/second/lazy/module/component.module')     };      constructor(         private compiler: Compiler,         private injector: Injector,     ) { }      async loadComponent(moduleId, container) {          let ref;         try {             const moduleObj = await this.componenttRefs[moduleId];             const module = moduleObj[Object.keys(moduleObj)[0]];             const moduleFactory = await this.compiler.compileModuleAsync(module);             const moduleRef: any = moduleFactory.create(this.injector);             const componentFactory = moduleRef.instance.resolveComponent();             ref = container.createComponent(componentFactory, null, moduleRef.injector);         } catch (e) {             console.error(e);         }         return ref;      }  } 7  

Espero que lo ayude.

 

First you need to register your context menu on list view.

lv = (ListView) findViewById(R.id.list_view); registerForContextMenu(lv); 

Then, just override activity methods.

/**  * MENU  */  @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {       super.onCreateContextMenu(menu, v, menuInfo);       if (v.getId()==R.id.list_view) {           MenuInflater inflater = getMenuInflater();           inflater.inflate(R.menu.menu_list, menu);       } }  @Override public boolean onContextItemSelected(MenuItem item) {       AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();       switch(item.getItemId()) {          case R.id.add:          // add stuff here             return true;           case R.id.edit:             // edit stuff here                 return true;           case R.id.delete:         // remove stuff here                 return true;           default:                 return super.onContextItemSelected(item);       } } 

Here is an example of menu_list.xml file (you have to put the file in the res/menu folder).

<?xml version="1.0" encoding="utf-8"?> <menu   xmlns:android="http://schemas.android.com/apk/res/android">         <item android:id="@+id/add"               android:icon="@android:drawable/ic_menu_add"               android:title="@string/menu_add" />        <item android:id="@+id/edit"               android:icon="@android:drawable/ic_menu_edit"               android:title="@string/menu_edit" />         <item android:id="@+id/delete"             android:icon="@android:drawable/my_icon_delete"              android:title="@string/menu_delete" />  </menu> 

Hope it will help.

 
 
         
         
6
 
vote

Otro enfoque:

  import { Injectable, Compiler, Injector } from '@angular/core';  @Injectable({     providedIn: 'root' }) export class LazyComponentService {      private componenttRefs = {         myFirstLazyModuleId: import('../path/to/first/lazy/module/component.module'),         mySecondLazyModuleId: import('../path/to/second/lazy/module/component.module')     };      constructor(         private compiler: Compiler,         private injector: Injector,     ) { }      async loadComponent(moduleId, container) {          let ref;         try {             const moduleObj = await this.componenttRefs[moduleId];             const module = moduleObj[Object.keys(moduleObj)[0]];             const moduleFactory = await this.compiler.compileModuleAsync(module);             const moduleRef: any = moduleFactory.create(this.injector);             const componentFactory = moduleRef.instance.resolveComponent();             ref = container.createComponent(componentFactory, null, moduleRef.injector);         } catch (e) {             console.error(e);         }         return ref;      }  } 8  
 

Another approach:

//Deleted individual cart items     //on list view cell long press     cartItemList.setOnItemLongClickListener (new OnItemLongClickListener() {           @SuppressWarnings("rawtypes")         public boolean onItemLongClick(AdapterView parent, View view, final int position, long id) {               final CharSequence[] items = { "Delete" };                  AlertDialog.Builder builder = new AlertDialog.Builder(context);                  builder.setTitle("Action:");                 builder.setItems(items, new DialogInterface.OnClickListener() {                      public void onClick(DialogInterface dialog, int item) {                         cart = cartList.get(position);                         db.removeProductFromCart(context, cart);                          new AlertDialog.Builder(context)                         .setTitle(getString(R.string.success))                         .setMessage(getString(R.string.item_removed))                         .setPositiveButton("Done", new DialogInterface.OnClickListener() {                             public void onClick(DialogInterface dialog, int which) {                                  Intent intent = new Intent(CartDetailsActivity.this, HomeScreen.class);                                 startActivity(intent);                             }                          })                          .show();                      }                  });                  AlertDialog alert = builder.create();                  alert.show();             //do your stuff here               return false;           }         }); 
 
 
2
 
vote

Puede llamar import { Injectable, Compiler, Injector } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class LazyComponentService { private componenttRefs = { myFirstLazyModuleId: import('../path/to/first/lazy/module/component.module'), mySecondLazyModuleId: import('../path/to/second/lazy/module/component.module') }; constructor( private compiler: Compiler, private injector: Injector, ) { } async loadComponent(moduleId, container) { let ref; try { const moduleObj = await this.componenttRefs[moduleId]; const module = moduleObj[Object.keys(moduleObj)[0]]; const moduleFactory = await this.compiler.compileModuleAsync(module); const moduleRef: any = moduleFactory.create(this.injector); const componentFactory = moduleRef.instance.resolveComponent(); ref = container.createComponent(componentFactory, null, moduleRef.injector); } catch (e) { console.error(e); } return ref; } } 9 en su método de clics

ver aquí
http://developer.android.com/reference/Android /app/activity.html#openoptionsMenu%28%29

 

You can call Activity.openOptionsMenu() in your click item method

check here
http://developer.android.com/reference/android/app/Activity.html#openOptionsMenu%28%29

 
 
 
 
1
 
vote

**

Después de registrar su menú contextual en la vista de lista

** Anular OnCreeContextMenu método como este

  @NgModule({   imports: [     MyModules...   ],   declarations: [     MyFirstLazyComponent   ] }) export class MyFirstLazyComponentModule {    constructor(private componentFactoryResolver: ComponentFactoryResolver) { }    public resolveComponent(): ComponentFactory<MyFirstLazyComponent> {     return this.componentFactoryResolver.resolveComponentFactory(MyFirstLazyComponent);   }  } 0  

luego codificando para cada elemento que se puede seleccionar

  @NgModule({   imports: [     MyModules...   ],   declarations: [     MyFirstLazyComponent   ] }) export class MyFirstLazyComponentModule {    constructor(private componentFactoryResolver: ComponentFactoryResolver) { }    public resolveComponent(): ComponentFactory<MyFirstLazyComponent> {     return this.componentFactoryResolver.resolveComponentFactory(MyFirstLazyComponent);   }  } 1  
 

**

after register your context menu on list view

** override onCreateContextMenu Method like this

@Override     public void onCreateContextMenu(ContextMenu menu,View v, ContextMenu.ContextMenuInfo menuInfo){         if (v.getId() == R.id.listView){             AdapterView.AdapterContextMenuInfo info =(AdapterView.AdapterContextMenuInfo)menuInfo;             MenuItem mnu1=menu.add(0,0,0,"Delete");             MenuItem mnu2=menu.add(0,1,1,"Share");         }     } 

then coding for each item that can be selected

 @Override     public boolean onContextItemSelected(MenuItem menuItem){         AdapterView.AdapterContextMenuInfo info=(AdapterView.AdapterContextMenuInfo)menuItem.getMenuInfo();         switch (menuItem.getItemId()) {             case 0:                 Toast.makeText(this, "Delete Selected", Toast.LENGTH_LONG).show();                 break;             case 1:                 Toast.makeText(this, "Share Selected", Toast.LENGTH_LONG).show();                 break;              default:                 break;          }         return true;     } 
 
 
0
 
vote

Utilizar RegisterForContextMenu (); Para vincular el menú contextual a cualquier sucesor de vista.

Para acceder a los datos de LISTITEM seleccionados, use simple el AdapterView.AdapterContextMenuInfo. E.G.:

  @Override public boolean onContextItemSelected(MenuItem item) {     AdapterView.AdapterContextMenuInfo menuinfo = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();     long selectid = menuinfo.id; //_id from database in this case     int selectpos = menuinfo.position; //position in the adapter     switch (item.getItemId()) {     case 1:         doSomething(selectid);     break;     case 2:         doSomethingElse(selectpos);     }     return super.onContextItemSelected(item); }   
 

Use registerForContextMenu(); to link context menu to any View successor.

To access to selected ListItem data, simple use the AdapterView.AdapterContextMenuInfo. E.g.:

@Override public boolean onContextItemSelected(MenuItem item) {     AdapterView.AdapterContextMenuInfo menuinfo = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();     long selectid = menuinfo.id; //_id from database in this case     int selectpos = menuinfo.position; //position in the adapter     switch (item.getItemId()) {     case 1:         doSomething(selectid);     break;     case 2:         doSomethingElse(selectpos);     }     return super.onContextItemSelected(item); } 
 
 
0
 
vote

Una nota rápida para aquellos que aún luchan, hay dos métodos

  registerForContextMenu(list); unregisterForContextMenu(list);   

Asegúrese de elegir el primero.

 

A quick note for those still struggling, there're two methods

registerForContextMenu(list); unregisterForContextMenu(list); 

Make sure you pick the first.

 
 

Relacionados problema

23  Mapas de Android: ¿Cómo hacer clic por largo en un mapa?  ( Android maps how to long click a map ) 
¿Cómo hago clic por largo en un MUMVIEW para que aparezca un marcador de lugar en ese punto en el mapa? Intenté un par de maneras sin éxito: 1) Uso de se...

6  Cómo activar un Android LongMlick en la prueba de Xamarin UI  ( How to trigger an android longclick in xamarin ui test ) 
Tengo un reciclaje con un código de acción que puede activarse con un clic largo en un elemento de reciclaje. ¿Cómo activar un clic largo en Android con las...

1  Deshabilite la barra de acción contextual y haga clic a largo clic en Copiar / Pegar  ( Disable contextual action bar and long click copy paste ) 
He buscado mucho por esto, pero no puedo encontrar ningún consejo ... Estoy proporcionando mi propia implementación de la barra de acción clásica, por lo que ...

39  ¿Cómo implementa el menú contextual en un Listactivity en Android?  ( How do you implement context menu in a listactivity on android ) 
¿Cómo implementa un menú de contexto activado por un clic largo o toque en una lista que está utilizando los diseños incorporados y un cuadro de lista? ...

0  Botón de largo clic no funciona  ( Button long click does not work ) 
Estoy trabajando en una tabla de sonido y quiero implementar un clic largo para compartir el sonido. Estoy trabajando con un switch Case para cada botón ...

2  El evento de clics largo no se desplaza cuando también se escucha al tacto  ( Long click event doesnt fire when also listening for touch ) 
¿Hay una buena manera de escuchar el public class Studente { private String nome; private String cognome; private String matricola; private ...

2  Androide. Gesturefetector Longpress - Umbral más largo o tiempo de espera  ( Android gesturedetector longpress longer threshold or timeout ) 
Necesito capturar una prensa prolongada, más las coordenadas del evento. Me parece que un umbral o tiempo de espera más largo para la acción de prensa prolong...

2  Android: haga clic largo de texto en el botón  ( Android long click text on button ) 
En mi aplicación Android, estoy tratando de crear un botón con dos líneas de texto. Uno mostrará lo que está haciendo el botón cuando se hace clic en (corto),...

1  Método de clic largo en Appio, Python  ( Long click method in appium python ) 
¿Hay algún método de clics largo en el appio en Python? Necesito hacer clic a largo plazo en el área en mi programa. def testDevice1(self): password ...

1  setonlongclicklistener para varios botones a la vez  ( Setonlongclicklistener for several buttons at once ) 
Quiero que Button1,2,3 responda a una LongLeglick, el usuario será solicitado para ingresar al botón del texto. Dentro de Oncreate, escribí: $process = "12...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos