【问题标题】:How can I use a custom actionbar layout with AndroidAnnotations?如何在 AndroidAnnotations 中使用自定义操作栏布局?
【发布时间】:2014-07-16 20:02:59
【问题描述】:

如何在 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();
           }
        });
    }
}

但下面的 sn-p 没有:

@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

【问题讨论】:

  • 你能发布一个示例项目来重现这个问题吗?
  • 我不能发布这个项目,因为它是一个内部产品。但是上面的代码足以重现错误。
  • 我请你发布一个示例项目。我可以从代码创建它,但它需要额外的东西,代码本身是不够的......

标签: java android android-annotations


【解决方案1】:

我看到这个问题有一段时间了,我希望现在能有所帮助。所以我也遇到了这个问题,因为 Android Annotations 文档很差。实际上我必须解决这个问题两次,因为我的第一个解决方案在第一次点击时不起作用,我将在代码中解释这一点。

1.- 首先是创建一个菜单,你必须在 res/menu 中进行,我们将它命名为“myactivity_menu.xml”,它应该看起来像这样(它应该在你创建时默认创建活动):

<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文件夹(不确定,但我认为字符串是可选的)。

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

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

简单吗,只需在@EActivity 下添加@OptionsMenu 就可以了,您的菜单现在应该可见了。

然而,这里有一个很好的观点,那么我该如何使用菜单中的按钮或图标来做一些事情呢?这是一个非常好的问题,因为 AndroidAnnotations 文档对此并不清楚,示例非常差,可能会导致您感到困惑。所以这就是我们必须做的:

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

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

这需要在下面有一个 void 方法,我认为这是 AndroidAnnotations 文档中唯一正确的指示。

这段代码可以放在@AfterViews下。

但是,这仍然不清楚,导致 AndroidAnnotation 改变了从 onItem 派生的 Android 逻辑......那么如果我必须设置一个监听器会发生什么?

我的错误是在我们刚刚创建的 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 方法中使用了 Alert 并出现错误,请查看此问题,我已通过使用 this 得到修复

Link 1

Link 2

如果 AndroidAnnotations 的任何人正在阅读本文,请改进您的文档。

【讨论】:

  • 我是一名 AndroidAnnotations 开发人员。我们的文档缺少什么?
  • 感谢您的关心,我受了很多苦。我认为最友好的结构是 WordPress Codex 使用。首先,定义代码是关于什么的。之后,举几个例子。最后一个你可能正在寻找这个部分。我会强调这些例子。不了解如何使用 @OptionItem 的问题在于没有解释,这已经是一个监听器。在其他情况下,从未详细解释过使用服务之类的情况。你必须制作万无一失的文档。字面上写“这应该放在X文件中,如果没有创建,现在创建它。放在Y下面”
  • 感谢您的反馈!我认为 wiki 对菜单主题非常清楚:“@OptionsItem 标记接收菜单选择事件的方法”。请注意 AA 适用于已经熟悉 Android API 的开发人员。所以@OptionsItem 使用监听器是微不足道的。但是您可以随时查看生成的代码,这在 AA 中是一件非常棒的事情 - 没有魔法。 Bear in my wiki 是由 AA 开发人员编写的,而不是普通用户,因此我们可能会跳过一些对我们来说微不足道的信息。如果您有任何建议,请随时在聊天室或邮件列表中分享。
  • 拜托,谢谢您的关注。现在我明白了。那么我想建议你将 AA 重新聚焦于每一位观众。原因很简单,AA比Android API更适合菜鸟,更简单,更干净。我会调查你提到的渠道。再次,非常感谢你。希望您可以为像我这样的菜鸟改进您的 wiki,它将帮助很多初学者开发人员。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多