2011-05-05 32 views
7

Aptal soru için özür dilerim, ama bu kodda neleri değiştirmem/eklemem gerekir - liste menüsündeki öğeye kısa basarak içerik menüsünü görüntülemek için?Bağlam menüsü kısa bir tıklamayla

public class MyActivity extends ListActivity implements AdapterView.OnItemClickListener { 
    static final String[] COUNTRIES = new String[]{ 
      "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", 
      "Angola", "Anguilla", "Antarctica" 
    }; 

    /** 
    * Called when the activity is first created. 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, COUNTRIES)); 

     ListView lv = getListView(); 
     lv.setTextFilterEnabled(true); 

     lv.setOnItemClickListener(this); 
    } 


    public void onCreateContextMenu(ContextMenu menu, View v, 
            ContextMenu.ContextMenuInfo menuInfo) { 
     Log.e("sdklfjsdkljfl", " <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< "); 
     menu.setHeaderTitle("HELLO"); 

    } 

    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
     Log.e("kjhasjkdhkas", "sdkhjkhskaf"); 
     this.openContextMenu(view); 
    } 
} 

cevap

5

Görünümde registerForContextMenu öğesini çağırmanız gerekir.

public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
    registerForContextMenu(view); 
    view.setLongClickable(false); // undo setting of this flag in registerForContextMenu 
    this.openContextMenu(view); 
} 

Ayrıca aslında menü öğeleri eklemek gerekir veya menü ya göstermez olacak (yanlış) setLongClickable çağrısı eklemek için DÜZENLENMİŞ. Sadece başlığın ayarlanması yeterli değil.

NOT: Bunu henüz tam olarak izlemedim, ancak registerForContextMenu (view) çağrısı, uzun bir basında içerik menüsünü istediğiniz varsayılarak bir bayrak ayarlar. Bu bayrak ayarlandığında, AbsListView'daki onTouch mantığı bir şekilde artık bir daha tetiklenmiyor. Bunu tamamen kazmak için zamanım yok. ArrayAdapter gibi basit bir adaptör kullanırken ve varsayılan ListView ile bir ListActivity kullanırken, kısa tıklatmada bağlam menüsünün görünmesi veya longclick'in kullanılması arasında karar vermeniz gerekecektir.

Uzun basımlarla ilgilenmiyorsanız, bağlam menüsünüzün registerForContextMenu (görünüm) 'de ayarlanmış bayrağı iptal ederek kısa bir basışta çalışmasını sağlayabilirsiniz;

Belki de başka birinin kodu bulmak için daha fazla bilgi veya daha fazla zamanı vardır.

+0

Bunu, teşekkür yaptı, ama Bu- sonra sadece neden Birkerede 1 liste öğesi için bağlam menüsünü çağırabilir? – eve

+0

Cevabı daha fazla bilgi ile güncelledim. Ne olduğu konusunda tam olarak emin değilim, ve bugün bunu incelemek için zamanım yok. Sizin için çalışabilecek bir geçici çözüm gönderdim. – slund

7

Burada yayınlanan diğer çözümler benim için çalışmadı çünkü bir ListFragment kullanıyordum. Ancak aşağıdaki çözümleri ListFragment ve (genel olarak ya da sadece herhangi bir eski liste görünümü) bir ListActivity ikisi için oldukça güzel iş gibi görünüyor:

public void onListItemClick(ListView l, View v, int position, long id){ 
    l.showContextMenuForChild(v); 
} 

Çok daha basit ve zarif. Aslında, ListView sınıfının aslında uzun bir tıklama ile bağlam menüsünü nasıl başlattığı budur.

0

uzun tıklama devre dışı bırakmak için registerForContextMenu() sonra bu eklemeyi unutmayın :

listview.setLongClickable(isRestricted()); 
İlgili konular