我设法在操作栏内放置了一个开关(就像在Wi-Fi设置中一样)。
我将以下 mainmenu.xml 文件放在/menu文件夹中:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/item1"
android:titleCondensed="Service"
android:title="Service"
android:actionViewClass="android.widget.Switch"
android:showAsAction="always|withText">
</item>
之后,我覆盖了 Activity 中的
onCreateOptionsMenu()
方法,如下所示:@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.mainmenu, menu);
// Get widget's instance
swtService = (Switch)menu.findItem(R.id.item1).getActionView();
swtService.setOnCheckedChangeListener(this);
return super.onCreateOptionsMenu(menu);
}
不幸的是,我不知道何时调用此方法。
这是问题所在:似乎甚至在
onCreateOptionsMenu
之前都没有调用onResume()
,因此抛出了NullPointerException
:@Override
public void onResume()
{
super.onResume();
// Synchronize the switch with service's status
swtService.setChecked(ServiceHelper.isServiceStarted(this, MySystemService.class.getName()));
}
我想念什么吗?
还有另一种方法可以将 View 放置在操作栏中吗?
编辑
我的目标API是17,我不在乎较低的API。 :)
这是应用程序的快照,显示了称为的生命周期方法:
谢谢
最佳答案
试试这个:
@Override
public void onPrepareOptionsMenu(Menu menu){
super.onPrepareOptionsMenu(menu);
swtService.setChecked(ServiceHelper.isServiceStarted(this, MySystemService.class.getName()));
}
@Override
public void onResume()
{
super.onResume();
this.getActivity().invalidateOptionsMenu(); // If you are using fragment
invalidateOptionsMenu(); // If you are using activity
}
关于android - 在ActionBar中获取Switch实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15338471/