【发布时间】:2015-03-18 10:45:04
【问题描述】:
我想将 Switch 放入 Action Bar 并设置为 Switch OnCheckedChangeListener。
这是我的代码:
check_words_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/switch_action_bar"/>
</menu>
switch_action_bar.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent">
<Switch
android:id="@+id/switchForActionBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
和SomeFragment.java
public class SomeFragment extends Fragment implements CompoundButton.OnCheckedChangeListener {
// ...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.check_words_menu, menu);
MenuItem item = menu.findItem(R.id.myswitch);
item.setActionView(R.layout.switch_action_bar);
Switch mySwitch = (Switch) item.getActionView();
mySwitch.setOnCheckedChangeListener(this);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// some code
}
运行后我得到 ClassCastException:
03-18 13:39:55.750 7206-7206/com.chubarich.android.translator E/AndroidRuntime: 致命异常: main java.lang.ClassCastException: android.widget.RelativeLayout 不能转换为 android.widget.Switch 在 com.chubarich.android.translator.CheckWordsFragment.onCreateOptionsMenu(CheckWordsFragment.java:65) 在 android.app.FragmentManagerImpl.dispatchCreateOptionsMenu(FragmentManager.java:1871) 在 android.app.Activity.onCreatePanelMenu(Activity.java:2714) 在 android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:275) 在 android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:276) 在 android.support.v7.app.ActionBarActivityDelegate$1.onCreatePanelMenu(ActionBarActivityDelegate.java:79) 在 android.support.v7.app.ActionBarActivityDelegateBase.preparePanel(ActionBarActivityDelegateBase.java:979) 在 android.support.v7.app.ActionBarActivityDelegateBase.doInvalidatePanelMenu(ActionBarActivityDelegateBase.java:1182) 在 android.support.v7.app.ActionBarActivityDelegateBase.access$100(ActionBarActivityDelegateBase.java:79) 在 android.support.v7.app.ActionBarActivityDelegateBase$1.run(ActionBarActivityDelegateBase.java:115) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 在 android.view.Choreographer.doCallbacks(Choreographer.java:555) 在 android.view.Choreographer.doFrame(Choreographer.java:524) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 在 android.os.Handler.handleCallback(Handler.java:615) 在 android.os.Handler.dispatchMessage(Handler.java:92) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:4954) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565) 在 dalvik.system.NativeStart.main(Native Method)
65 行是 SomeFragment.java 中的Switch mySwitch = (Switch) item.getActionView();。
请告诉我,我的代码有什么问题?
【问题讨论】:
标签: android android-fragments android-actionbar