我设法在操作栏内放置了一个开关(就像在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/

10-12 06:26