我试图在EditText中进行长按,但是当我进行长时间点击时,我收到以下错误.我希望能够长按一次以获取“复制/粘贴/全选”上下文弹出窗口,以便用户可以将文本粘贴到框中.

Fatal Exception: android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@799bfc6 is not valid; is your activity running?

EditText位于PopupWindow的ScrollView中.因此,当错误发生时,我当前在PopupWindow打开的Activity上处于活动状态,并且我在PopupWindow中包含的EditText中进行长按.

Gradle设置

compileSdkVersion 25

buildToolsVersion '25.0.0'

defaultConfig {

applicationId 'com.accoservice.cico'

minSdkVersion 17

targetSdkVersion 25

versionCode 37

versionName '4.2.6'

multiDexEnabled true

}

包含EditText的布局:

android:id="@+id/outer_layout"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="#73000000">

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_gravity="top"

android:layout_marginLeft="20dp"

android:layout_marginRight="20dp"

android:layout_marginTop="100dp"

android:layout_marginBottom="5dp"

android:background="#ffffff"

android:orientation="vertical">

android:id="@+id/title"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginBottom="5dp"

android:layout_marginLeft="5dp"

android:layout_marginTop="15dp"

android:singleLine="true"

android:text="@string/note_msg"

android:textColor="#62CCFE"

android:textSize="18sp" />

android:layout_width="fill_parent"

android:layout_height="2dp"

android:layout_marginBottom="5dp"

android:layout_marginTop="10dp"

android:background="#62CCFE" />

android:id="@+id/sv_resolution_note"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginLeft="5dp"

android:layout_marginRight="5dp"

android:layout_marginTop="5dp">

android:id="@+id/et_note_msz"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_above="@+id/view"

android:layout_alignParentTop="true"

android:scrollbars="vertical"

android:focusable="true"

android:gravity="left"

android:maxLines="20"

android:hint="@string/write_note"

android:inputType="textFilter|textMultiLine|textCapSentences"

android:singleLine="false"

android:textIsSelectable="true"

android:enabled="true"

android:longClickable="true" />

android:id="@+id/view"

android:layout_width="fill_parent"

android:layout_height="1dp"

android:layout_above="@+id/send_note"

android:layout_alignParentLeft="true"

android:layout_alignParentStart="true"

android:background="@android:color/darker_gray" />

android:id="@+id/send_note"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_above="@+id/viewss"

android:layout_gravity="center"

android:background="@color/white"

android:text="@string/add_note" />

android:id="@+id/viewss"

android:layout_width="fill_parent"

android:layout_height="1dp"

android:layout_alignParentBottom="true"

android:layout_alignParentLeft="true"

android:layout_alignParentStart="true"

android:background="@android:color/darker_gray" />

弹出窗口:

@Override

public void onClick(View v) {

noteDialog(getResources().getString(R.string.laborentryresolutionstart), tv_labor_entry_resolution_start);

}

public void noteDialog(String noteTitle, final TextView tv_resolution_note)

{

LayoutInflater layoutInflater = (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);

final View popupView;

popupView = layoutInflater.inflate(R.layout.resolution_note, null);

TextView title = (TextView) popupView.findViewById(R.id.title);

title.setText(noteTitle);

final EditText editText = (EditText) popupView.findViewById(R.id.et_note_msz);

final PopupWindow popupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);

popupWindow.update();

popupWindow.setFocusable(true);

popupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

editText.setEnabled(false);

editText.setEnabled(true);

editText.setFocusable(true);

editText.setOnLongClickListener(new View.OnLongClickListener() {

@Override

public boolean onLongClick(View v) {

//ADD HERE ABOUT CUT COPY PASTE

// TODO Auto-generated method stub

return false;

}

});

if (!tv_resolution_note.getText().toString().isEmpty()) {

editText.setText(tv_resolution_note.getText().toString());

}

Button btnDone = (Button) popupView.findViewById(R.id.send_note);

LinearLayout outer_layout = (LinearLayout) popupView.findViewById(R.id.outer_layout);

outer_layout.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

popupWindow.dismiss();

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

imm.toggleSoftInput(InputMethodManager.RESULT_HIDDEN, 0);

}

});

System.gc();

try {

btnDone.setOnClickListener(new Button.OnClickListener() {

@Override

public void onClick(View v) {

EditText noteMsz = (EditText) popupView.findViewById(R.id.et_note_msz);

tv_resolution_note.setText(noteMsz.getText().toString());

popupWindow.dismiss();

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

imm.toggleSoftInput(InputMethodManager.RESULT_HIDDEN, 0);

invalidateOptionsMenu();

}

});

} catch (Exception e) {

}

popupWindow.setFocusable(true);

popupWindow.setBackgroundDrawable(new BitmapDrawable(null, ""));

popupWindow.showAsDropDown(tv_labor_sym_entry, 0, -60);

popupWindow.update();

}

解决方法:

根据我的说法,你得到这个错误的原因是outer_layout的onClickListener与editText的onLongClickListener一起被触发.并且,由于popupWindow.dismiss是在outer_layout的click侦听器内调用的,因此弹出窗口会在editText的长按侦听器代码运行之前被解除,从而导致错误.

对此最简单的解决方案是为onLongClick方法返回true: –

editText.setOnLongClickListener(new View.OnLongClickListener() {

@Override

public boolean onLongClick(View v) {

//ADD HERE ABOUT CUT COPY PASTE

// TODO Auto-generated method stub

return true;

}

});

通过这样做,您将消耗给定的长按,并且它不会启动任何其他不需要的侦听器.

onLongClick() – This returns a boolean to indicate whether you have

consumed the event and it should not be carried further. That is,

return true to indicate that you have handled the event and it should

stop here; return false if you have not handled it and/or the event

should continue to any other on-click listeners.

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐