动作栏中的 SwitchCompat,带有片段

Posted

技术标签:

【中文标题】动作栏中的 SwitchCompat,带有片段【英文标题】:SwitchCompat in actionbar, with fragment 【发布时间】:2015-02-20 20:41:32 【问题描述】:

尝试将 SwitchCompat 设置为操作栏时出现错误。

这是我的 abswitch.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/abswitch"
    android:layout_
    android:layout_
    android:orientation="horizontal" >

    <android.support.v7.widget.SwitchCompat
        android:id="@+id/switchForActionBar"
        android:layout_
        android:layout_
        android:layout_centerVertical="true"
        android:text="" />

</RelativeLayout>

这里是我的 profile_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/myswitch"
        android:title=""
        app:showAsAction="always"
        android:actionLayout="@layout/abswitch"/>
</menu>

这里是来自片段的 onCreateOptionsMenu

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 
    inflater.inflate(R.menu.profile_menu, menu);
    MenuItem item = menu.findItem(R.id.myswitch);
    item.setActionView(R.layout.abswitch);
    SwitchCompat switchCompat = (SwitchCompat) item.getActionView();
    super.onCreateOptionsMenu(menu, inflater);

这是我每次尝试启动我的应用时都会遇到的错误

Process: ru.dennes544.vkapp, PID: 15974
java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.support.v7.widget.SwitchCompat
        at ru.dennes544.vkapp.Profile.onCreateOptionsMenu(Profile.java:216)
        at android.support.v4.app.Fragment.performCreateOptionsMenu(Fragment.java:1868)
        at android.support.v4.app.FragmentManagerImpl.dispatchCreateOptionsMenu(FragmentManager.java:1989)
        at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:276)
        at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:276)
        at android.support.v7.app.ActionBarActivityDelegate$1.onCreatePanelMenu(ActionBarActivityDelegate.java:79)
        at android.support.v7.widget.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:49)
        at android.support.v7.internal.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:459)
        at android.support.v7.internal.app.ToolbarActionBar$1.run(ToolbarActionBar.java:69)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

提前致谢。

附:抱歉 pastebin 链接,*** 没有正确格式化 xml 的

编辑:想通了。

在 profile_menu.xml 中更改

<item
    android:id="@+id/toggleservice"
    app:actionViewClass="android.support.v7.widget.SwitchCompat"
    app:showAsAction="always"
    android:title=""/>

在 Profile.class 中

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 
    inflater.inflate(R.menu.profile_menu, menu);
    MenuItem item = menu.findItem(R.id.toggleservice);
    SwitchCompat switchCompat = (SwitchCompat) MenuItemCompat.getActionView(item);
    super.onCreateOptionsMenu(menu, inflater);

现在它的工作。谢谢大家!

【问题讨论】:

item.getActionView() 是相对布局。可能,您需要在操作视图上再做一次findViewById() @S.D.如果对你来说不难,你能解释更多吗?我是android编程的新手... @S.D.我修好了,谢谢! 请发布答案,而不是编辑问题。 这对我有用。但是如果我想在 switchcompat 下面添加一个文本呢? 【参考方案1】:

代替:

SwitchCompat switchCompat = (SwitchCompat) MenuItemCompat.getActionView(item);

你应该这样做:

RelativeLayout relativeLayout= (RelativeLayout) MenuItemCompat.getActionView(item);
SwitchCompat switchCompat = (SwitchCompat) relativeLayout.findViewById(R.id.switchForActionBar);

差不多

【讨论】:

【参考方案2】:

MenuItemCompat.getActionView(item) 已弃用,因此使用 MenuItem.getActionView

这样使用

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 
    inflater.inflate(R.menu.profile_menu, menu);
    MenuItem item = menu.findItem(R.id.toggleservice);
    SwitchCompat switchCompat = (SwitchCompat) item.getActionView();
    super.onCreateOptionsMenu(menu, inflater);

【讨论】:

以上是关于动作栏中的 SwitchCompat,带有片段的主要内容,如果未能解决你的问题,请参考以下文章

仅在父片段中的操作栏中显示搜索视图

操作栏标签片段中的片段?

如何将片段目标绑定到底部导航栏中的菜单项?

SwitchCompat

带有操作栏图标单击的 NavigationUI 导致片段淡入淡出

如果在底部导航栏中选择了其他项目,如何删除 floatingActionButton 替换片段