簡體   English   中英

加載新片段時調用上一個片段 onCreateOptionMenu

[英]Previous fragment onCreateOptionMenu is called when loading a new fragment

在我的mainActivity ,我定義了一個抽屜,並將用抽屜中的選定項目(作為片段)替換mainActivity約束布局。

@Override
public boolean onNavigationItemSelected(MenuItem item) {
    int id = item.getItemId();

    /**
     * Perform logout logic if logout is selected, otherwise go display corresponding screen
     */
    if (id == R.id.nav_logout) {
        logout(null, true);
    } else {
        switch(id) {
            case R.id.nav_event:
                fragment = new EventDashboard();
                Log.d(logTag, "showing Event screen "  + fragment.toString());
                fragmentTag = "event";
                break;
            case R.id.nav_contacts:
                fragment = new Contacts();
                Log.d(logTag, "showing Contact screen "  + fragment.toString());
                fragmentTag = "contacts";
                break;
            }

        if (fragment != null) {
            android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.content_main, fragment, fragmentTag);
            ft.commit();
        }

        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
    }
    return true;
}

這個 EventDashboard 片段中有兩個選項卡 (SectionPagerAdapter),即將發生的事件和過去的事件,我可以在每個選項卡之間滑動沒問題。 聯系人只是一個顯示用戶信息的簡單布局。

這段代碼一直運行良好,沒有任何問題,直到最近我將 searchView 添加到事件頁面。

searchView通過onCreateOptionMenu添加到EventDashboard片段

public class EventDashboard extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

        /**
         * Enable option menu
         */
        setHasOptionsMenu(true);

        return inflater.inflate(R.layout.fragment_event, container, false);

    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        //super.onCreateOptionsMenu(menu, inflater);
        /**
         * Inflate menu
         */
        inflater.inflate(R.menu.event_menu, menu);

        super.onCreateOptionsMenu(menu, inflater);
    }

    ...
}

EventTabUpComingEventTabPast片段中,我有以下代碼:

public class EventTabUpcoming extends Fragment implements SearchView.OnQueryTextListener {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.event_tab_upcoming, container, false);


        Log.d(logTag, "Showing Up-Coming events");
        sectionAdapter = new SectionedRecyclerViewAdapter();

        Log.i(logTag, "create recyclerView");
        RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.listUpcomingEvent);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL));

        recyclerView.setAdapter(sectionAdapter);

        setHasOptionsMenu(true);

        return view;
    }

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

        /**
         * Inflate menu
         */
        MenuItem item = menu.findItem(R.id.action_event_search);
        searchView = (SearchView) MenuItemCompat.getActionView(item);
        searchView.setOnQueryTextListener(this);
    }
}

EventTabPast具有非常相似的代碼,只是它顯示的數據不同。 搜索按鈕工作正常,我可以在每個選項卡中過濾任何事件,沒有問題。

現在,問題是當我滑動到EventDashboard片段中的不同選項卡,然后從抽屜中選擇 Contact 時,它現在拋出異常,如下所示,我不明白,而當前片段被所選片段替換,為什么它試圖從前一個片段調用onCreateOptionMenu 奇怪的是,如果我不滑動到EventDashboard片段中的不同選項卡,切換到 Contact 片段將沒有問題。

這是例外:

2019-02-26 22:49:19.286 21132-21132/com.myapp.event I/MyApp.MainActivity: Displaying selected screen id: 2131362023
2019-02-26 22:49:19.286 21132-21132/com.myapp.event D/MyApp.MainActivity: Displaying selectedScreen with id 2131362023
2019-02-26 22:49:19.293 21132-21132/com.myapp.event D/MyApp.MainActivity: showing Contact screen Contacts{8d6ec57}
2019-02-26 22:49:19.400 21132-21132/com.myapp.event E/MyApp.Contacts: loading user list and user lookup for the list
2019-02-26 22:49:19.412 21132-21209/com.myapp.event E/MyApp.UserListsRepository: getUsersForList Christmas
2019-02-26 22:49:19.412 21132-21209/com.myapp.event E/MyApp.UserListsLocalDataSource: getUsersForList Christmas
2019-02-26 22:49:19.417 21132-21132/com.myapp.event D/AndroidRuntime: Shutting down VM


    --------- beginning of crash
2019-02-26 22:49:19.417 21132-21132/com.myapp.event E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.myapp.event, PID: 21132
    java.lang.NullPointerException: Attempt to invoke interface method 'android.view.View android.view.MenuItem.getActionView()' on a null object reference
        at android.support.v4.view.MenuItemCompat.getActionView(MenuItemCompat.java:188)
        at com.myapp.event.Fragments.Events.EventTabPast.onCreateOptionsMenu(EventTabPast.java:94)
        at android.support.v4.app.Fragment.performCreateOptionsMenu(Fragment.java:2547)
        at android.support.v4.app.FragmentManagerImpl.dispatchCreateOptionsMenu(FragmentManager.java:3319)
        at android.support.v4.app.FragmentController.dispatchCreateOptionsMenu(FragmentController.java:331)
        at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:369)
        at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:94)
        at android.support.v7.app.AppCompatDelegateImpl$AppCompatWindowCallback.onCreatePanelMenu(AppCompatDelegateImpl.java:2546)
        at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:94)
        at android.support.v7.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:455)
        at android.support.v7.app.ToolbarActionBar$1.run(ToolbarActionBar.java:56)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
        at android.view.Choreographer.doCallbacks(Choreographer.java:723)
        at android.view.Choreographer.doFrame(Choreographer.java:655)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

如trace所示,mainActivity已經加載了新的片段Contact,但由於某種原因,它還嘗試調用onCreateOptionMenu。 有問題的行是 EventTabPast.java:94,即“searchView = (SearchView) MenuItemCompat.getActionView(item);”

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

    /**
     * Inflate menu
     */
    MenuItem item = menu.findItem(R.id.action_event_search);
    searchView = (SearchView) MenuItemCompat.getActionView(item);
    searchView.setOnQueryTextListener(this);
}

每當在片段中寫入 onCreateOptionMenu() 時,就意味着它在片段的父活動上創建

您在 Contact Fragment 的 onResume() 中編寫以下代碼

@Override
public void onResume()
{
    super.onResume();
    setHasOptionsMenu(false)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM