1

ListActivityから継承され、AndroidAnnotationsを使用しているアクティビティがあります。正常に動作している間.onListItemClick、リストアイテムのコンテキストメニューはまったく表示され.onCreateContextMenuず、呼び出されませんが、.onListItemClickリストアイテムを長押しすると起動します。これが私のコードです:

@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...
    }

}

誰かがここで何が悪いのか教えてもらえますか?よろしくお願いします。

4

1 に答える 1

5

わかった!それは私自身の間違いでした。メソッドには、ではなく、として.init()注釈を付ける必要があります。これは次のように機能します。ListActivityは作成時にデフォルトのListViewを持ち、その後Bean PlacesDBが挿入されます。その後、メソッドが起動されます。つまり、デフォルトのListViewがコンテキストメニューに登録され、その後、アクティビティのコンテンツビューとして設定されます。登録されていないListView!したがって、アノテーションを変更して、その後に実行、次に自分のListViewを実行するようにします@AfterViews@AfterInject@AfterInject.init() R.layout.places @AfterViews.init() .setContentView(R.layout.places)レイアウトからコンテキストメニューに登録され、すべてが機能し始めます:)

于 2012-07-11T07:31:18.230 に答える