工具栏在操作模式下不会消失

时间:2019-01-14 14:43:59

标签: android android-layout android-toolbar

我正在尝试实现以下功能:长时间单击列表项时,将启动操作模式,并且可以删除一个或多个项目。
我从MainActivity DocumentsActivity开始搜索,该搜索从ListView及其项开始一个片段DocumentsFragment。 ListAdapter通过Fragment中onCreate中的方法调用setListAdapter(this.documentsAdapter)进行初始化和设置。我在片段的onActivityCreated的列表视图中设置了各种侦听器:

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);
}

当我长时间单击列表项时,动作模式开始,并且菜单documents_context_menu似乎是动作栏。但是问题是,操作栏出现在工具栏上方,并且工具栏不会消失(参见图片)。

我尝试调用getSupportActionBar().hide()或将其设置为null甚至使用其他样式/主题。一切都没有用。有时蓝色的工具栏是完全白色的,但是仅此而已。

我绝对不知道为什么工具栏不会消失。你可以给点建议吗?

谢谢!

_____更新1 _____

这是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>

这是在“活动”中设置操作栏的方式:

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();
    }
}

6 个答案:

答案 0 :(得分:2)

据我了解您的代码,您已经完成了您提供的用作ToolBar的工具栏并使用了.NoActionBar主题,但根据Android Developer的要求,您还应该在自己的窗口中将windowActionBar属性设置为false样式。 enter link description here第二段将其清除。

希望对您有帮助!

答案 1 :(得分:2)

所有这些答案都不错,您应该尝试一下,但是您需要的是ContextualMenu,因此您应该首先将视图添加到registerForContextMenu(),以便菜单知道哪些菜单是上下文菜单,然后实现{{1 }}中您onCreateContextMenu

Activity

然后像这样实现@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.context_menu, menu); }

onContextItemSelected()

然后,您必须对视图执行操作并实现@Override public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()) { case R.id.edit: editNote(info.id); return true; case R.id.delete: deleteNote(info.id); return true; default: return super.onContextItemSelected(item); } } ,然后使用AbsListView.MultiChoiceModeListener参数调用setChoiceMode()。像这样:

CHOICE_MODE_MULTIPLE_MODAL

我所说的所有内容,甚至更多,您可以在this android developer documentation

中找到

答案 2 :(得分:1)

在科特林,假设您的ActivityAppCompatActivity延伸

  • 您应该获取支持操作栏的实例并调用方法

    supportActionBar?.show()supportActionBar?.hide()

  • 如果您使用的是片段,则可以从Fragment的活动实例访问操作栏

    (activity as AppCompatActivity).supportActionBar?.show()

答案 3 :(得分:0)

正如评论中提供的链接所指出的那样,您只需要在AppTheme样式中添加以下行即可:

<item name="windowActionModeOverlay">true</item>

它只是表明动作模式应该覆盖窗口内容而不是向下推,它表明您不需要任何保留空间来放置动作模式。

答案 4 :(得分:0)

添加:

 //Set action mode null after use
    public void setNullToActionMode() {
        if (mActionMode != null)
            mActionMode = null;
    }

或者:

//Remove selected selections
public void removeSelection() {

    mSelectedItemsIds = new SparseBooleanArray();
}

答案 5 :(得分:0)

实际上是由不同的设置引起的。 首先,多次说过,windowActionBar被设置为true,属性fitsSystemWindows. 我也删除了styles.xml 中的两行。

然后,在活动布局中,我完全看不到属性layout_marginTop="?actionBarSize",但我没有看到它。但是该属性必须存在,因此在调用onActivityCreatedonCreateActionMode时,我将在方法onDestroyActionMode中对其进行处理。

那之后,我就自动地遇到了列表视图项消失的问题。我通过在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);
}