Search code examples
androidandroid-layoutandroid-toolbar

Toolbar won't disappear in action mode


I am trying to implement the feature that, when I am long clicking a list item, the action mode shall start and it shall be possible to delete one or more items.
I am starting in DocumentsActivity a search, which starts a Fragment DocumentsFragment with a ListView and their items. The ListAdapter is initialized and set via method call setListAdapter(this.documentsAdapter) in onCreate of Fragment. I set various listeners on the listview in the onActivityCreated in the Fragment:

public void onActivityCreated(Bundle savedInstanceState) {

    getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            getListView().setItemChecked(position, true);
            return true; 
    }});
    getListView().setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            menu.clear();
            ((DocumentsActivity)getActivity()).getMenuInflater().inflate(R.menu.documents_context_menu, menu);
            return true;
        }
    });
    super.onActivityCreated(savedInstanceState);
}

When long clicking on a listitem the action mode gets started and the menu documents_context_menu appears to be the action bar. But the problem is, the action bar appears above the toolbar and the toolbar won't disappear (see the picture).

I've tried to call getSupportActionBar().hide() or set it to null or even use another style/theme. It all didn't work. Sometimes the blue toolbar was completely white, but that is all.

I have absolutely no idea why the toolbar won't disappear. May you give some advice?

Thanks in advance!

_____ Update 1 _____

This is the styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:fitsSystemWindows">true</item>
    <item name="colorAccent">@color/darkblue100</item>
    <item name="android:actionOverflowButtonStyle">@style/ActionButtonOverflow</item>
    <item name="actionOverflowButtonStyle">@style/ActionButtonOverflow</item>
    <item name="android:actionMenuTextColor">@color/black</item>
</style>

And this is how the action bar is set in the Activity:

protected void onCreate(Bundle savedInstanceState) {
    handleIntent(getIntent());
    requestWindowFeature(5);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_documents);
    Toolbar mToolbar = (Toolbar) findViewById(R.id.tool_bar);
    setSupportActionBar(mToolbar);
    args = getIntent().getExtras();
    if (findViewById(R.id.container_documents) != null && savedInstanceState == null) {
        showDocumentsFragment();
    }
}

Solution

  • Actually the issue were caused by different things. First, the windowActionBar was set true, also was the attribute fitsSystemWindows.I deleted both lines in styles.xml.

    Then there was in the activity layout the attribute layout_marginTop="?actionBarSize" I did not see, following in complete confusion. But this attribute needs to be there so I am handling it in the method onActivityCreated when onCreateActionMode and onDestroyActionMode are called.

    After that all I had the automagically problem that the listview items disappeared. I fixed it by commiting my fragment again in onDestroyActionMode.

    public void onActivityCreated(Bundle savedInstanceState) {
    
        getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
        getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {...}
        });
        getListView().setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
            LinearLayout ll = ((DocumentsActivity)getActivity()).findViewById(R.id.container_documents);
    
            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                DrawerLayout.LayoutParams params = (DrawerLayout.LayoutParams) ll.getLayoutParams();
                params.setMargins(0, 0, 0, 0);
                ll.setLayoutParams(params);
    
                ((DocumentsActivity)getActivity()).getSupportActionBar().hide();
                MenuInflater inflater = mode.getMenuInflater();
                inflater.inflate(R.menu.documents_context_menu, menu);
                return true;
            }
    
            @Override
            public void onDestroyActionMode(ActionMode mode) {
                DrawerLayout.LayoutParams params = (DrawerLayout.LayoutParams) ll.getLayoutParams();
                params.setMargins(0, R.attr.actionBarSize, 0, 0);
                ll.setLayoutParams(params);
                ((DocumentsActivity)getActivity()).getSupportActionBar().show();
    
                if (getFragmentManager() != null)
                    getFragmentManager()
                    .beginTransaction()
                    .detach(this)
                    .attach(this)
                    .commit();
            }
        });
    
        super.onActivityCreated(savedInstanceState);
    }