我正在尝试实现以下功能:长时间单击列表项时,将启动操作模式,并且可以删除一个或多个项目。
我从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();
}
}
答案 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)
在科特林,假设您的Activity
从AppCompatActivity
延伸
您应该获取支持操作栏的实例并调用方法
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"
,但我没有看到它。但是该属性必须存在,因此在调用onActivityCreated
和onCreateActionMode
时,我将在方法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);
}