安卓注解。在 menuItem 的 actionLayout 中单击按钮

AndroidAnnotations. button click inside actionLayout of menuItem

在 AA+AppCompat 中,我尝试将 Activity 中的以下代码更改为 AA 样式。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.menu_done, menu);
    MenuItem menuItem = menu.findItem(R.id.itemDone);
    View menuView = MenuItemCompat.getActionView(menuItem);
    mButtonQuestionPost = (Button) menuView.findViewById(R.id.buttonMenuDone);
    mButtonQuestionPost.setOnClickListener(this);

    return super.onCreateOptionsMenu(menu);
}

首先,将Activity的头部改成如下。菜单按预期显示。

@EActivity(R.layout.activity_question_post)
@OptionsMenu(R.menu.menu_done)
public class QuestionPostActivity extends FragmentActivity {...

并且,尝试执行如下按钮单击方法但没有触发。我用 @OptionsItem 更改了 @Click 或更改了这个那个的属性,但没有成功。

@Click(R.id.buttonMenuDone)
void buttonMenuDone(){
    if (mQuestionPostFragment.validatePost()) {
        setSupportProgressBarIndeterminate(true);
        mQuestionPostFragment.postQuestion();
    }
}

menu.xml如下。请注意,我出于设计目的使用 actionLayout

<item
    android:id="@+id/itemDone"
    android:title="@string/done"
    app:showAsAction="always"
    android:menuCategory="system"
    app:actionLayout="@layout/item_menu_done"
    />

item_menu_done如下。

<Button
    android:layout_width="48dp"
    android:layout_height="?actionBarSize"
    android:id="@+id/buttonMenuDone"
    android:text="@string/done"
    android:textColor="@android:color/white"
    android:textSize="14sp"
    android:background="?attr/actionBarItemBackground"
    />

AA生成的文件没有MenuItemCompat.getActionView(menuItem),但很难用AA生成。有人可以帮我吗?

恐怕您无法将具有 @Click 的侦听器绑定到菜单操作视图,因为 Activity.findViewById 在菜单项中找不到该视图。你可以做的是注入菜单项,然后像你已经做的那样手动绑定你的监听器。

@EActivity(R.layout.activity_question_post)
@OptionsMenu(R.menu.menu_done)
public class QuestionPostActivity extends FragmentActivity {

    @OptionsMenuItem(R.id.menuItemDone)
    MenuItem buttonMenuDone;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // this will be called by the generated subclass after it injected the menu
        MenuItemCompat.getActionView(itemDone).findViewById(R.id.buttonMenuDone).setOnClickListener(this);
        return true;
    }
}

如果有人需要它,现在您可以像这样使用 OptionsItem() 注释:

//Even with system items
@OptionsItem(android.R.id.home)
void onHomeItemClicked() {
    finish();
}

//Or your custom ones
@OptionsItem(R.id.buttonMenuDone)
void onMenuDoneItemClicked() {
    //Do your stuff
}