当前位置: 首页 > 知识库问答 >
问题:

invalidateOptionsMenu()在“重新启动”活动时不工作

庾才
2023-03-14

我有一个活动,我们称之为FirstActivity.java,它有一个带有通过片段实例化的导航抽屉的actionBar。在这个片段NavigationDrawerFragment.java中,为了实例化ActionBar,我将方法onCreateOptionsMenu(菜单菜单,MenuInflater inflater)、onOptionsItemSelected(MenuItem项)和onPrepareOptionsMenu(菜单菜单)放入了实例化ActionBar。在actionBar的右侧,我有一个带有“Messages”图标的按钮,它指向用户的收件箱片段。当新消息传入时,我在FirstActivity中调用invalidateOptionsMenu()并在onPrepareOptionsMenu(Menu Menu)中将图标更改为更亮的图标。到目前为止一切正常。

问题是:我可以通过导航抽屉中的一个选项离开第一个。我是故意这么做的。我们称之为SecondActivity.java。

Intent myIntent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(myIntent);
finish();

当我再次调用firstactivity时,也是通过意图调用,invalidateOptionsMenu()方法停止工作。它不触发onCreateOptionsMenu或OnPrepareOptionsMenu方法。我也尝试过supportInvalidateOptionsMenu()但没有成功。

只有当我点击菜单按钮(在actionBar的左侧)时,才会调用这些方法并更改messages图标。有人知道这种奇怪行为的原因吗?

public class FirstActivity extends ActionBarActivity impements NavigationDrawerFragment.NavigationDrawerCallbacks {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_activity);

//        When a new message arrives
        if (thereIsAnIncomingMessage) {
            invalidateOptionsMenu();
        }
    }
}

first_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical" android:id="@+id/first_activity_layout">

    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".FirstActivity">

        <!-- As the main content view, the view below consumes the entire
             space available using match_parent in both dimensions. -->
        <FrameLayout android:id="@+id/container" android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <!-- android:layout_gravity="start" tells DrawerLayout to treat
             this as a sliding drawer on the left side for left-to-right
             languages and on the right side for right-to-left languages.
             If you're not building against API 17 or higher, use
             android:layout_gravity="left" instead. -->
        <!-- The drawer is given a fixed width in dp and extends the full height of
             the container. -->
        <fragment android:id="@+id/navigation_drawer"
            android:layout_width="@dimen/navigation_drawer_width" android:layout_height="match_parent"
            android:layout_gravity="start"
            android:name="com.example.Controller.Main.NavigationBar.NavigationDrawerFragment"
            tools:layout="@layout/fragment_navigation_drawer" />

    </android.support.v4.widget.DrawerLayout>

</LinearLayout>

NavigationDrawerFragment.java

public class NavigationDrawerFragment extends Fragment {

    private RelativeLayout relativeLayout;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setHasOptionsMenu(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        relativeLayout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
        return relativeLayout;
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);

        menu.clear();
        inflater.inflate(R.menu.menu_main, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.action_menu) {
//            Open navigation drawer menu
            return mDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item);
        } else if (item.getItemId == R.id.action_chat) {
//            Open messages fragment
            MessagesFragment messagesFragment = new MessagesFragment();
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

            fragmentTransaction.replace(R.id.container, messagesFragment, "MESSAGES_FRAGMENT");
            fragmentTransaction.addToBackStack("chatFrag");
            fragmentTransaction.commit();
        }
    }

    @Override
    public void onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);

        if (FirstActivity.thereIsAnIncomingMessage) {
            menu.getItem(0).setIcon(R.drawable.new_message_icon);
        } else {
            menu.getItem(0).setIcon(R.drawable.message_icon);
        }
    }

    public interface NavigationDrawerCallbacks {
        void onNavigationDrawerItemSelected(int position);
    }
}

共有1个答案

祁飞扬
2023-03-14

问题是,当您单击“后退”按钮时,不会调用firstactivityoncreate方法。相反,您可以将代码放在onresume中,如下所示:

    @Override
    public void onResume(){
        super.onResume();
        if(thereIsAnIncomingMessage)
            invalidateOptionsMenu();
    }

请参阅正式的活动生命周期文档。

 类似资料:
  • 问题内容: 重新启动活动时,上一个活动的延迟太多,无法调用。 我正在使用此代码重新启动我的活动 PlayerActivity.java 让我们分别调用 PreviousPlayerActivity 和 NewPlayerActivity ,之前的活动以及新的活动。(请记住,它们是相同的PlayerActivity)。 序列 重新启动应用程序时,将在activity-lifecycle中遵循此流程。

  • 我想在Android上启动另一个活动,但出现以下错误: 请指定构造函数调用;分类器Page2没有伴随对象 实例化类后。我应该怎么做来纠正错误?我的代码:

  • 问题内容: 我正在使用CSS着色器+动画。我的着色器类定义如下: 我正在尝试使用jQuery通过和动态设置/取消设置样式(shader + animation) 但是,奇怪的是,当我重置类时(例如,在removeClass之后调用addClass),仅重新应用了着色器,而没有应用动画(我已钩住AnimationStart事件以查看动画何时开始)。有人知道为什么会这样吗,我该如何解决? 编辑:我在这

  • 我想在设备重新启动后与启动通知(如消息、Viber通知、Whatsapp等)并排启动锁定屏幕活动。如何做到这一点??.我已经制作了一个广播接收器,它接收引导完成操作,然后启动一个服务,该服务再次用intent.action_screen_off和intent.action_screen_on意图过滤器注册相同的接收器,该接收器启动锁定屏幕活动。以下是我的代码: AndroidManifest.xm

  • 当我点击listview项时,我试图启动一个活动。但是当我运行程序时,我得到了一些错误,比如: list_layout.xml

  • 我用Inno Setup做了一个安装程序,在一些文件运行后我需要重启电脑,所以我用了这篇文章中的解决方案。 inno安装示例“CodePrepareToInstall”。iss运行良好,所以我使用了代码进行测试安装,但计算机重新启动后安装程序无法启动。 两个安装程序(inno demo和我的测试)都在“HKLM\Software\Microsoft\Windows\CurrentVersion\R