在6.0奇葩问题中,我已经对此问题分析过了,但是并没有一个很好的解决方案,虽然开了开发版本,但是导致对于的开发版本已经会出现长按报null问题!最近在查看源码时发现,在分析ActionBarContextView类时发现,ActionMode初始化时走了initTitle()此方法!而当时长按报出的异常如下
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setOnClickListener(android.view.View$OnClickListener)' on a null object reference下面为源码,其中只有一个地方为onClickListener:
public void initForMode(final ActionMode mode) {
if (mClose == null) {
LayoutInflater inflater = LayoutInflater.from(mContext);
mClose = (NineLinearLayout)inflater.inflate(R.layout.abs__action_mode_close_item, this, false);
addView(mClose);
} else if (mClose.getParent() == null) {
addView(mClose);
}
View closeButton = mClose.findViewById(R.id.abs__action_mode_close_button);
closeButton.setOnClickListener(new OnClickListener() { //此处,也就是说, 他没有findViewById成功导致的此问题
public void onClick(View v) {
mode.finish();
}
});
final MenuBuilder menu = (MenuBuilder) mode.getMenu();
if (mActionMenuPresenter != null) {
mActionMenuPresenter.dismissPopupMenus();
}
mActionMenuPresenter = new ActionMenuPresenter(mContext);
mActionMenuPresenter.setReserveOverflow(true);
final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.MATCH_PARENT);
if (!mSplitActionBar) {
menu.addMenuPresenter(mActionMenuPresenter);
mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
mMenuView.setBackgroundDrawable(null);
addView(mMenuView, layoutParams);
} else {
// Allow full screen width in split mode.
mActionMenuPresenter.setWidthLimit(
getContext().getResources().getDisplayMetrics().widthPixels, true);
// No limit to the item count; use whatever will fit.
mActionMenuPresenter.setItemLimit(Integer.MAX_VALUE);
// Span the whole width
layoutParams.width = LayoutParams.MATCH_PARENT;
layoutParams.height = mContentHeight;
menu.addMenuPresenter(mActionMenuPresenter);
mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
mMenuView.setBackgroundDrawable(mSplitBackground);
mSplitView.addView(mMenuView, layoutParams);
}
mAnimateInOnLayout = true;
}
这个点击事件是将actionMode finish掉,也就是调用ActionMode最左边的按钮
我又跑到代码中寻找左边按钮的布局,最后发现
android.support.v7.internal.widget.TintImageView
也就是说他调用的V7包!
然后我看了一下项目的activity,发现继承的是Activity,于是尝试使用v7中的AppCompatActivity,然后此问题解决!
AppCompatActivity
更2016.8.19日:
在实际发现一个很严重的问题,无法修改actionMode的样式了,所以就继续寻找,发现:
<item name="*android:closeItemLayout">@layout/ty_material_action_mode_close_item</item>
在value样式中,将v21和value中的此样式注销也可以解决,估计是国内厂家对底层进行了修改,导致此问题!(我在用向外的测试机测试无此问题!)