2012-07-10 57 views
1

我有一个活动继承自ListActivity并使用AndroidAnnotations。虽然.onListItemClick工作正常,但列表项目的上下文菜单根本没有出现,即使.onCreateContextMenu未被调用,但.onListItemClick在长按一下列表项目后也会触发。这里是我的代码:ListActivity中的AndroidAnnotations和上下文菜单

@OptionsMenu(R.menu.places) 
@EActivity(R.layout.places) 
public class PlacesPicker extends ListActivity { 

    private static String[] DATA_SOURCE = { PlacesDB.PLACE_NAME, PlacesDB.PLACE_DESC }; 
    private static int[] DATA_DESTINATION = { R.id.place_name, R.id.place_desc }; 

    public static ListView lv; 

    @Bean 
    PlacesDB db; 

    Cursor cursor; 

    @AfterInject 
    public void init() { 

     cursor = db.getPlaces(null, null); 
     startManagingCursor(cursor); 

     SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.place_item, cursor, DATA_SOURCE, DATA_DESTINATION); 
     setListAdapter(adapter); 

     lv = getListView(); 

     registerForContextMenu(lv); 

    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
       // It works fine 
       // It works even after long tap instead of context menu! 
     Toast.makeText(this, "Item clicked!", Toast.LENGTH_SHORT).show(); 
    } 

    @OptionsItem 
    public void addPlace(){ 
       // It works OK too 
     startActivity(new Intent(this, PlaceEditor_.class)); 

    } 

    public void editPlace() { 
     // ...skipped for brevity... 
    } 

    public void deletePlace() { 
      // ...skipped... 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
       // This isn't ever called! 
     super.onCreateContextMenu(menu, v, menuInfo); 

     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.place_options, menu); 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
     // ...skipped... 
    } 

} 

有人可以告诉我这里有什么问题吗?感谢您的提前。

回答

5

我明白了!这是我自己的错误:.init()方法必须注释为@AfterViews,而不是@AfterInject。它的工作原理是这样的:ListActivity有一个默认的的ListView创建的时候,那么我的豆PlacesDB注入,将触发@AfterInject方法后,即.init()其中默认的ListView注册了上下文菜单, R.layout.places被设置为活动内容视图与另一的ListView这是注册后!因此,改变注释@AfterViews使得.init().setContentView(R.layout.places),然后我自己的ListView从布局注册上下文菜单运行,一切都开始工作:)