Mar*_*ang 5 android android-layout android-toolbar
我正在尝试实现这样的功能:当我长按一个列表项时,动作模式应该开始,并且可以删除一个或多个项目.
我在MainActivity DocumentsActivity中开始搜索,它DocumentsFragment使用ListView及其项启动Fragment .ListAdapter setListAdapter(this.documentsAdapter)在Fragment的onCreate中通过方法调用进行初始化和设置.我onActivityCreated在片段中的listview上设置了各种监听器:
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);
}
Run Code Online (Sandbox Code Playgroud)
当我长时间点击listitem时,操作模式开始,菜单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>
Run Code Online (Sandbox Code Playgroud)
这就是活动中设置操作栏的方式:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
正如评论中提供的链接所指出的,您只需将以下行添加到您的 AppTheme 样式中:
<item name="windowActionModeOverlay">true</item>
Run Code Online (Sandbox Code Playgroud)
它只是表明操作模式应该覆盖窗口内容而不是将其向下推,它告诉您不需要为操作模式保留任何空间。
实际上,这个问题是由不同的原因引起的。首先,windowActionBar设置了,也是我删除了 中的两行的true属性。fitsSystemWindows.styles.xml
layout_marginTop="?actionBarSize"然后在活动布局中有一个我没有看到的属性,完全混乱。但这个属性需要存在,所以我在调用和onActivityCreated时在方法中处理它。onCreateActionModeonDestroyActionMode
之后我就自动遇到了列表视图项目消失的问题。我通过再次提交我的片段来修复它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);
}
Run Code Online (Sandbox Code Playgroud)