草庐IT

android - 操作栏子菜单不适用于 actionLayout

coder 2023-12-06 原文

您好,我正在开发一个 Android 应用程序。在我的应用程序中,我使用的是 ActionBarSherlock。我通过以下方式在操作栏中定义了几个菜单项:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:id="@+id/card_menu"
     android:title="cards" 
     android:showAsAction="always"
     android:actionLayout="@layout/action_button"
  >
         <menu>
             <item android:id="@+id/C1"
              android:title="C1" />
             <item android:id="@+id/C2"
              android:title="c2" />
             <item android:id="@+id/C3"
               android:title="C3" />
         </menu>
 </item>
<item android:id="@+id/notification"
      android:title="Notifications"
      android:showAsAction="always"
      android:actionLayout="@layout/notification_icon"
      android:icon="@drawable/notification"
 />

<item android:id="@+id/filter"
      android:icon="@drawable/filter"
      android:title="Filter" 
      android:showAsAction="always"
 />

现在,一切都显示得很好,但我的问题是,当我单击 card_menu 项时,我在其中定义了子菜单并定义了操作布局;它没有显示那些子菜单。
我的其他菜单项工作正常。仅当我为我的项目定义一个包含子菜单的操作布局时,我才无法显示子菜单。
如果我删除 Action 布局,那么它工作正常...

我知道如果我们为一个项目定义一个 Action 布局,那么我们必须手动处理点击监听器。我是通过以下方式做到的:

final MenuItem item = menu.findItem(R.id.card_menu);
        item.getActionView().setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            onOptionsItemSelected(item);
            Toast.makeText(getActivity(), "click on menu", Toast.LENGTH_SHORT).show();
        }
        });

我能够处理该项目的点击事件,但无法显示下拉子菜单项目..

如何解决这个问题?如何打开我的子菜单?

需要帮助....谢谢...

最佳答案

我遇到了类似的问题,并通过在 Actionbar 中使用 Spinner 的技巧解决了这个问题。 所以我在 res/menu 中的 actionbar 布局是(action_share 很重要):

<item android:id="@+id/action_share"
    android:showAsAction="always"
    android:actionLayout="@layout/actionbar_spinner_export" />

在我的 res/layout 文件夹中,我放入了 actionbar_spinner_export:

<Spinner xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/sp_export"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/actionbar_item_selector" />

然后在 onCreateOptionsMenu 中,我得到了这个微调器并向其添加了一个自定义 ArrayAdapter。我只能在 c# 中发布代码,因为我正在使用 Xamarin.Android 跨平台开发。但它对于 Java 来说几乎是一样的:

IMenuItem spinnerExport = menu.FindItem(Resource.Id.action_share);
        _sp_export = spinnerExport.ActionView.FindViewById<Spinner>(Resource.Id.sp_export);
        _sp_export.Adapter = new ExportAdapter(_parent, Resource.Layout.actionbar_export_row, new List<String>{"Drucken", "Als PDF", "Als Text", "Als Tabelle"});

然后在我的自定义 ExportAdapter 中,我将图像放入 getView 中,我想显示(在本例中为共享图标)。在 getDropDownView 中,我放置了所有项目。这是代码:

class ExportAdapter : ArrayAdapter
{
    private List<String> _objects = null;
    private Context _context = null;

    public ExportAdapter(Context context, int resourceId, List<String> objects) : base(context, resourceId)
    {
        _context = context;
        _objects = objects;
    }

    public override View GetView (int position, View convertView, ViewGroup parent)
    {
        convertView = ((Activity) _context).LayoutInflater.Inflate(Resource.Layout.actionbar_export_row, parent, false);

        TextView tv_text = convertView.FindViewById<TextView>(Resource.Id.tv_text);
        ImageView iv_image = convertView.FindViewById<ImageView>(Resource.Id.iv_image);

        RelativeLayout.LayoutParams lp_iv = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WrapContent, RelativeLayout.LayoutParams.WrapContent);
        lp_iv.AddRule(LayoutRules.CenterInParent);
        iv_image.LayoutParameters = lp_iv;
        iv_image.SetPadding(5,5,5,5);

        tv_text.Visibility = ViewStates.Gone;
        iv_image.SetImageResource(Resource.Drawable.ic_action_share);

        return convertView;
    }

    public override View GetDropDownView (int position, View convertView, ViewGroup parent)
    {
        convertView = ((Activity) _context).LayoutInflater.Inflate(Resource.Layout.actionbar_export_row, parent, false);

        TextView tv_text= convertView.FindViewById<TextView>(Resource.Id.tv_text);
        tv_text.Text = _objects.ElementAt(position);

        return convertView;
    }

    public override int Count {
        get {
            return _objects.Count();
        }
    }

    public String getItemAtIndex(int position)
    {
        return _objects.ElementAt(position);
    }
}

这样,我就有了一个 actionbar 图标,它看起来像一个真正的 actionbar-item。当我点击它时,微调器中的项目就会出现。

关于android - 操作栏子菜单不适用于 actionLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14933088/

有关android - 操作栏子菜单不适用于 actionLayout的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  3. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

  4. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  5. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  6. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  7. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  8. ruby - "undefined method"用于 rails 模型 - 2

    我正在使用带有Rails的Devise,我想添加一个方法“getAllComments”,所以我这样写:classUser在我的Controller中:defdashboard@user=current_user@comments=@user.getAllComments();end当我访问我的url时,我得到了undefinedmethod`getAllComments'for#我做错了什么?谢谢 最佳答案 因为getAllComments是一个类方法,而您正试图将其作为实例方法访问。您要么需要访问它:User.getAllCom

  9. Ruby on Rails regexp equals-tilde 与 array include 用于检查选项列表 - 2

    我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试

  10. ruby - 在 Ruby 中是否有一种惯用的方法来操作 2 个数组? - 2

    a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],

随机推荐