您的位置:首页 > 移动开发 > Android开发

关于使用ActionMode做长按事件报空问题

2016-08-27 10:27 447 查看
在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中的此样式注销也可以解决,估计是国内厂家对底层进行了修改,导致此问题!(我在用向外的测试机测试无此问题!)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 解决方案