android – 上下文动作栏菜单项的奇怪行为

android – 上下文动作栏菜单项的奇怪行为,第1张

概述我在上下文动作栏中有一些奇怪的行为. 首先: 只有在第二次点击溢出按钮时才会显示一个菜单项: 第二/第三: 有没有一种方法,图标不会使用这么多的空间? 当我更改添加属性android:showAsAction =“always”到所有项目,实际上有足够的空间来显示所有图标 – 但我的共享图标不可点击: 清洁项目没有帮助. 我在我的测试设备(Galaxy S3)上使用Android 4.2.2. 我 我在上下文动作栏中有一些奇怪的行为.

首先:

只有在第二次点击溢出按钮时才会显示一个菜单项:

第二/第三:

有没有一种方法,图标不会使用这么多的空间?

当我更改添加属性android:showAsAction =“always”到所有项目,实际上有足够的空间来显示所有图标 – 但我的共享图标不可点击:

清洁项目没有帮助.

我在我的测试设备(galaxy S3)上使用Android 4.2.2.

我甚至试图在我的XXX GS3上完全刷新一个新的ROM(CyanogenMod 10.1,SlimBean之前,也删除了底部的导航栏) – 没有帮助.

我也尝试了一个Nexus 4.有更多的空间,所以分享按钮和删除按钮是可见的.当我启动动作模式时,分享按钮不可点击,但是当我将设备转到横向模式时,它可以工作,当我将其恢复为纵向时,它仍然可以工作.在Nexus 4的基础上,共享按钮在旋转之前不起作用.

表现:

<uses-sdk androID:minSdkVersion="14" androID:targetSdkVersion="17" />

编译对minSdkVersion = 17没有任何区别.

我从这样的片段启动动作模式:

mActionMode = activity.startActionMode(mMultipleCallback);

在ActionMode.Callback中,我填充菜单:

@OverrIDepublic boolean onCreateActionMode(ActionMode mode,Menu menu) {    MenuInflater inflater = mode.getMenuInflater();    inflater.inflate(R.menu.management_cab,menu);    MenuItem item = menu.findItem(R.ID.managementCABShare);    mShareActionProvIDer = (ShareActionProvIDer) item.getActionProvIDer();    //...other stuff    return true;}

这里是XML:

<?xml version="1.0" enCoding="utf-8"?><menu xmlns:androID="http://schemas.androID.com/apk/res/androID" >    <item        androID:title="@string/checkAll"        androID:ID="@+ID/managementCABCheckAll"        androID:icon="@androID:drawable/checkBox_on_background">    </item>    <item        androID:title="@string/enable"        androID:ID="@+ID/managementCABEnable"        androID:icon="@drawable/sphere_green">    </item>    <item        androID:title="@string/disable"        androID:ID="@+ID/managementCABdisable"        androID:icon="@drawable/sphere_red">    </item>    <item        androID:title="@string/delete"        androID:ID="@+ID/managementCABDelete"        androID:icon="@androID:drawable/ic_menu_close_clear_cancel">    </item>    <item        androID:title="@string/share"        androID:ID="@+ID/managementCABShare"        androID:actionProvIDerClass="androID.Widget.ShareActionProvIDer"        androID:icon="@androID:drawable/ic_menu_share">    </item>    <item        androID:title="@string/export"        androID:ID="@+ID/managementCABExport"        androID:icon="@drawable/explorer">    </item></menu>

为了完整的回调:

protected ActionMode.Callback mMultipleCallback = new ActionMode.Callback() {    private ShareActionProvIDer mShareActionProvIDer;    @OverrIDe    public boolean onCreateActionMode(ActionMode mode,Menu menu) {        MenuInflater inflater = mode.getMenuInflater();        inflater.inflate(R.menu.management_cab,menu);        MenuItem item = menu.findItem(R.ID.managementCABShare);        mShareActionProvIDer = (ShareActionProvIDer) item.getActionProvIDer();        hIDeUnwantedCABItems(menu);        return true;    }    @OverrIDe    public boolean onActionItemClicked(ActionMode mode,MenuItem item) {        List<Integer> checkedpositions = getAllCheckedpositions();        switch (item.getItemID()) {        case R.ID.managementCABCheckAll:            changeCheckedOfAllitems(true);            return true;        case R.ID.managementCABEnable:            changeEnabled(checkedpositions,true);            return true;        case R.ID.managementCABdisable:            changeEnabled(checkedpositions,false);            return true;        case R.ID.managementCABDelete:            if (deletealert == null)                createDeleteDialog(checkedpositions);            initDeleteDialog(checkedpositions);            return true;        case R.ID.managementCABShare:            Intent shareIntent = new Intent();            shareIntent.setAction(Intent.ACTION_SEND_MulTIPLE);            shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM,exportItemsAndGetUris(checkedpositions));            shareIntent.setType("application/xml");            setShareIntent(shareIntent);            return true;        case R.ID.managementCABExport:            String message;            if (StorageController.copyUriListToExportFolder(exportItemsAndGetUris(checkedpositions)))                message = getActivity().getString(R.string.export_success);            else                message = getActivity().getString(R.string.export_fail);            Toast.makeText(getActivity(),message + ":\n" + StorageController.getExternalExportApplicationFolder(),Toast.LENGTH_LONG).show();            return true;        default:            return false;        }    }    @OverrIDe    public voID onDestroyActionMode(ActionMode mode) {        mActionMode = null;        changeCheckedOfAllitems(false);    }    @OverrIDe    public boolean onPrepareActionMode(ActionMode mode,Menu menu) {        return false;    }    private voID setShareIntent(Intent shareIntent) {        if (mShareActionProvIDer != null) {            mShareActionProvIDer.setShareIntent(shareIntent);        }    }};
解决方法 好的,解决不可分割的分享图标.这是我对API的误解.

我以为你可以像在菜单XML文件中的每个其他项目一样处理一个SharedActionProvIDer-Item.但实际上你不能.当该图标显示为 *** 作时,onActionItemClicked甚至不会触发此图标(这就是为什么在添加showAsAction =时始终不可点击).有趣的是,当图标未显示时,触发点击事件,但在溢出菜单中可见.这可能是上下文动作栏中的一个实际错误!

现在我终于想出如何触发一个SharedActionProvIDer-Item:

你必须(!)把一个Intent放在onCreateActionMode方法中:

public boolean onCreateActionMode(ActionMode mode,menu);    MenuItem item = menu.findItem(R.ID.managementCABShare);    initSharedActionProvIDer(item); //Check out this method in the next code fragment    return false;}

现在你可能会说:“你这个笨蛋,这是很明显的,更好的设置意图永远在那里,而不像以前那样在onActionItemClickedMethod”.

对不起,但我不同意:将它设置在这里并不真实.原因是:对我来说,意图随着您检查的每个附加项目而改变.它为您检查的每个项目创建一个导出XML文件,而我每次点击图标时都不想创建一个XML文件.这没有任何意义,我希望只有当用户真的要导出项目时才能创建所有的XML文件.

所以基本上我为此做了一个解决方法.一开始,我做出一个意图,并添加一个空的List< Uri>.该列表被保存为我的类中的成员变量,所以如果我添加项目,项目也将是意图.然后当用户单击共享项目时,列表将填充所有选定的项目.为了完成此 *** 作,我会覆盖OnShareTargetSelectedListener.当用户点击具体的共享目标(如电子邮件,保管箱等)时,会触发此方法.

现在这里是整个代码(该方法只从onCreateActionMode调用一次):

private voID initSharedActionProvIDer(MenuItem item) {    mShareActionProvIDer = (ShareActionProvIDer) item.getActionProvIDer();    mShareActionProvIDer.setonShareTargetSelectedListener(new OnShareTargetSelectedListener() {        @OverrIDe        public boolean onShareTargetSelected(ShareActionProvIDer source,Intent intent) {            //Here is the exportedfiles List populated            exportItemsAndSetList(getAllCheckedpositions());            return true;        }    });    Intent shareIntent = new Intent();    shareIntent.setAction(Intent.ACTION_SEND_MulTIPLE);    //exportedfiles is a member Variable which I populate with the selected items,with the exportItemsAndSetList method    shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM,exportedfiles);    shareIntent.setType("application/xml");    mShareActionProvIDer.setShareIntent(shareIntent);}

我希望你明白我在那里做了什么如果没有,请随时问.

以上所有这一切,我的一个问题解决了(当图标显示时,共享图标不可点击) – 但其他两个仍然打开(图标不会使用太多的空间和第一个问题).

问题2种解决:

看起来像AndroID需要更高分辨率文件夹(hdpi,xhdpi)中的图标真的处于更高的分辨率 – 我的启用/禁用图标只有一个32×32像素的大小(我只是把它们放在所有的文件夹),因此AndroID在某种程度上造成了很大的麻烦,所以在 *** 作栏上只有三个图标.我刚刚删除了所有图标,但原始的32×32像素在mdpi.现在AndroID升级了32×32像素的图标,可以在 *** 作栏中显示五个项目.这有点奇怪

问题1种解决:

看起来这与问题2直接相关,只要我解决问题2,删除图标直接放在 *** 作栏上.

还有一些测试我看到文本总是在那里,如果我添加showAsAction =永远不会删除图标.我真的认为它与问题2有关(图标真的做坏的东西).

我的问题几乎解决了.

我想我现在有一个(新)的真实错误:最近使用的共享 *** 作是浮动溢出图标.当点击那里时,溢出菜单仍然打开,但它看起来很可爱:

我如何解决这个问题?

好吧,我完成了这个****,所以我只是添加了showAsAction =永远不会分享图标. (是的,我看到了this,但如果我这样做,我得到一个例外,这也是正常生命周期的另一个变化…)

如果你知道比我使用的更好的解决方案,请随意评论:>

总结

以上是内存溢出为你收集整理的android – 上下文动作栏菜单项的奇怪行为全部内容,希望文章能够帮你解决android – 上下文动作栏菜单项的奇怪行为所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1132733.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存