如何在AndroidAnnotations中使用自定义操作栏布局?

时间:2014-07-16 20:02:59

标签: java android android-annotations

如何在AndroidAnnotations中使用自定义操作栏布局?

有效的代码:

@EActivity(R.layout.activity_register_classes)
public class RegisterClassesActivity extends ActionBarActivity {

    @AfterViews
    void setupActionBar() {
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayShowCustomEnabled(true);
        actionBar.setDisplayShowHomeEnabled(false);
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setCustomView(R.layout.fragment_save_cancel_action_bar);

        findViewById(R.id.id_cancel).setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               Toast.makeText(getBaseContext(), "Cancelando...", Toast.LENGTH_SHORT).show();
           }
        });
    }
}

但以下代码段不是:

@EActivity(R.layout.activity_register_classes)
public class RegisterClassesActivity extends ActionBarActivity {

    @AfterViews
    void setupActionBar() {
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayShowCustomEnabled(true);
        actionBar.setDisplayShowHomeEnabled(false);
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setCustomView(R.layout.fragment_save_cancel_action_bar);
    }

    @Click(R.id.id_save)
    void cancel() {
        Toast.makeText(getBaseContext(), "Cancel...", Toast.LENGTH_SHORT).show();
    }
}

我正在使用该库的3.0.1版本。 Android API 19

1 个答案:

答案 0 :(得分:1)

我认为这个问题有一段时间了,我希望现在能够提供帮助。所以我遇到这个问题也导致Android Annotations文件很差。实际上我必须解决这个问题两次,因为我的第一个解决方案在第一次使用时没有用,我将在代码中解释这个。

1.-第一个是创建一个菜单,你必须在res / menu里面进行操作,让它命名为" myactivity_menu.xml"它应该看起来像这样(它应该在创建Activity时默认创建):

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"    tools:context=".MyActivity">
    <item android:id="@+id/thisIsAnId"
        android:icon="@drawable/your_drawable"
        android:title="@string/your_string"
        app:showAsAction="always"/> />
</menu>

此代码中的重要一点是给它一个id(你将需要它),如果你想拥有一个好看的图标,就像任何其他资产一样将图标上传到你的drawable文件夹(不确定,但我认为string是可选的。)

2.-现在转到您的活动并使用AndroidAnnotations以这种方式调用菜单:

@EActivity(R.layout.my_activity)
@OptionsMenu(R.menu.myactivity_menu)

就是这么简单只需在@EActivity下添加@OptionsMenu就可以了,现在你的菜单应该可见了。

然而,这里有一个很好的观点,那么如何使用菜单中的按钮或图标做些什么呢?是一个非常好的问题导致AndroidAnnotations doc不清楚这个,例子非常差,可能会引起你的困惑。所以这就是我们要做的事情:

3.-这里我们要为菜单项设置一个查找器:

   @OptionsItem(R.id.thisIsAnId)
    void whatEverToDoWithMyMenuItem() {
    }

下面需要一个void方法,我认为这是AndroidAnnotations doc中唯一适当的指示。

此代码可以放在@AfterViews下。

然而,这个还不清楚,导致AndroidAnnotation改变Android逻辑派生自onItem ......那么如果我必须设置一个监听器会发生什么呢?

我的错误是在我们刚刚创建的void方法中使用普通的Android逻辑。这不会很好。

4.-所以在这一点上我们必须简单地添加我们想要做的事情,因为我们已经有了听众:

    @OptionsItem(R.id.thisIsAnId)
    void whatEverToDoWithMyMenuItem() {
      Toast toast = Toast.makeText(getApplicationContext(), "Sample Text",       
      Toast.LENGTH_LONG);
      toast.show();
    }

这里的诀窍是当我们@OptionsItem(R.id.thisIsAnId)时,已经设置了点击的监听器,所以我们可以在下面的void方法中做任何我们想做的事。

如果由于某种原因你在voide方法中使用了一个警告并得到一个错误请看到这个问题,我使用this修复了我的

Link 1

Link 2

如果AndroidAnnotations中的任何人正在阅读此内容,请改进您的文档。