5

我设法在操作栏中放置了一个开关(如在 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>

之后我覆盖了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抛出了 a :

@Override
public void onResume()
{
    super.onResume();

    // Synchronize the switch with service's status
    swtService.setChecked(ServiceHelper.isServiceStarted(this, MySystemService.class.getName()));
}

我错过了什么吗?还有另一种方法可以在操作栏中放置视图吗?

编辑

我的目标 API 是 17,我不关心更低的。:)

这是应用程序的截图,显示了调用的生命周期方法: 生命周期方法

谢谢

4

1 回答 1

1

尝试这个:

    @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
}
于 2013-03-11T14:09:25.230 回答