Long press on the "Edit" command: cannot add window

I try to make a long click in EditText , but when I make a long click, I get the error below. I would like to be able to make a long click to get the Copy / Paste / Select All popup menu so that the user can paste text into the field.

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

EditText is located in ScrollView in PopupWindow. Therefore, when an error occurs, I am currently active in the Activity with the PopupWindow open, and I make a long click on the EditText that is contained in the PopupWindow.

Gradle Settings

 compileSdkVersion 25 buildToolsVersion '25.0.0' defaultConfig { applicationId 'com.accoservice.cico' minSdkVersion 17 targetSdkVersion 25 versionCode 37 versionName '4.2.6' multiDexEnabled true } 

Layout containing an EditText file:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/outer_layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#73000000"> <LinearLayout 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"> <TextView 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" /> <View android:layout_width="fill_parent" android:layout_height="2dp" android:layout_marginBottom="5dp" android:layout_marginTop="10dp" android:background="#62CCFE" /> <ScrollView 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"> <EditText 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" /> </ScrollView> <View 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" /> <Button 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" /> <View 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" /> </LinearLayout> </LinearLayout> 

Display window:

 @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(); } 
+5
source share
4 answers

We went with a redesign to select a popup and fix the error that was there.

0
source

For me, the reason you get this error is because the outer_layout onClickListener launched along with the onLongClickListener your editText . And, since popupWindow.dismiss is called inside the click listener of your outer_layout , the popup is discarded before your editText long click listen code can be triggered, thereby causing an error.

The simplest solution for this would be to return true for your onLongClick method: -

 editText.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { //ADD HERE ABOUT CUT COPY PASTE // TODO Auto-generated method stub return true; } }); 

This way you will use this long click and it will not launch any other unwanted listeners.

onLongClick () - returns a boolean value indicating whether you have consumed an event and cannot be carried forward. That is, return true to indicate that you have processed the event, and it should stop here; return false if you did not process it and / or the event should continue in any other click listener.

+4
source

You can call your popup too soon. In my example ( gist here ), I launch a popup with a button click. This happens after onCreate() and other life cycles start. In this example, everything is working fine.

If, however, I try to instantiate a popup in onCreate() , I get a logcat error that reads: "android.view.WindowManager $ BadTokenException: cannot add window", which is what you see.

I believe that you instantly create an instance of your popup. Start it later in the activity lifecycle, and specifically after running onCreate() . If you need to instantiate this method, you can attach the code to the message queue of the user interface by calling post(Runnable) . (See here ).

I am sure this is your problem. If this does not help, update your question with more information on how and when you instantiate the popup.

0
source

in your main business

closed content mContext;

 public void onCreate(){ mContext = this; } 

replace getBaseContext () with mContext

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

or

  LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
0
source

Source: https://habr.com/ru/post/1271649/


All Articles