0

КонтекстNon реагирующие приложение в «Последние приложения», когда POPUPMENU и редактирование текста Present

Я работаю с popupwindows, чтобы позволить пользователю быстро переименовать в cardview в деятельности.

Я делаю это с помощью ViewSwitcher, чтобы обменять TextView (оригинальное название) на EditText (новое имя).

Проблема

Когда EditText и PopUpWindow для подтверждения присутствуют пользователь нажимает "RECENT APPS", вы не можете по каким-то причинам получить обратно в приложение. т.е., когда вы нажмете на него, он не ответит.

Диагноз

Я думаю, что это проблема с окном Focus. Я пробовал EditText.clearFocus() от ET и отклонил все PopUps , не повезло.

Есть ли способ использовать onFocusChangeListener для устранения этой проблемы?

Код (Я пытался удалить как можно больше лишние элементы, как это возможно)

TheHubActivity.java

public class TheHubActivity extends AppCompatActivity implements RecyclerViewAdapter.onCardClickListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

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

     recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
     //... Set up recycle view 

     rvContent = new ArrayList<>(); 
    } 

    @Override 
    public void onCardLongClick(Flow longClickedFlow, int cardPosition, View cardViewClicked) { 
     showLongClickPopUpMenu(longClickedFlow,cardPosition, cardViewClicked); 
    } 

    private void showLongClickPopUpMenu(final Flow longClickedFlow, final int cardPosition, final View cardViewClicked) { 

     LayoutInflater layoutInflater = (LayoutInflater) this 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View layout = layoutInflater.inflate(R.layout.popup_window_longclick, null); 

     LinearLayout viewGroup = (LinearLayout) layout.findViewById(R.id.popup_longclick); 

     // Creating the PopupWindow 
     final PopupWindow popup = new PopupWindow(layout, RecyclerView.LayoutParams.WRAP_CONTENT, 
       RecyclerView.LayoutParams.WRAP_CONTENT); 


     popup.setFocusable(true); 

     // Getting a reference to Close button, and close the popup when clicked. 
     ImageView delete = (ImageView) layout.findViewById(R.id.popup_delete_item); 

     delete.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       /*.... Delete current Flow from internal file and UI */ 
       popup.dismiss(); 
      } 
     }); 

     ImageView edit = (ImageView) layout.findViewById(R.id.popup_edit_item); 

     edit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       popup.dismiss(); 
       renameFlow(cardPosition, cardViewClicked); 
      } 
     }); 

     // Displaying the popup at the specified location, + offsets. 
     popup.showAsDropDown(cardViewClicked, cardViewClicked.getMeasuredWidth(),popupDisplayHeight, Gravity.TOP); 

     longClickPopup = popup; 
    } 

    private void renameFlow(final int cardPosition, final View cardViewClicked) { 
     final ViewSwitcher switcher = (ViewSwitcher) cardViewClicked.findViewById(R.id.rename_switcher); 
     final EditText rename = (EditText) switcher.findViewById(R.id.item_flow_rename); 

     rename.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 
       if (rename.hasFocus()) { 
        showEditPopupWindow(rename, cardViewClicked, switcher, cardPosition); 
       } else { 
        imm.hideSoftInputFromWindow(rename.getWindowToken(), 0); 
       } 

      } 
     }); 

     switcher.showNext(); 

     rename.requestFocus(); 
     imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_IMPLICIT_ONLY); 
     /* Forces keyboard */ 


    } 

    private void showEditPopupWindow(final EditText newName, View cardViewClicked, final ViewSwitcher switcher, final int cardPosition) { 
     LayoutInflater layoutInflater = (LayoutInflater) this 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View layout = layoutInflater.inflate(R.layout.popup_window_editing, null); 

     LinearLayout viewGroup = (LinearLayout) layout.findViewById(R.id.popup_editing); 

     // Creating the PopupWindow 
     final PopupWindow popup = new PopupWindow(layout, RecyclerView.LayoutParams.WRAP_CONTENT, 
       RecyclerView.LayoutParams.WRAP_CONTENT); 

     popup.setFocusable(false); // So that user can edit text 

     // Getting a reference to Close button, and close the popup when clicked. 
     ImageView confirmEdit = (ImageView) layout.findViewById(R.id.popup_confirm_item_changes); 

     confirmEdit.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       /* .. Changes name of cardview through edit text */ 
        switcher.showNext(); 
        popup.dismiss(); 
        newName.clearFocus(); 
       } 

      } 
     }); 

     ImageView cancelEdit = (ImageView) layout.findViewById(R.id.popup_cancel_item_changes); 

     cancelEdit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       switcher.showNext(); 
       popup.dismiss(); 
      } 
     }); 

     popup.showAsDropDown(cardViewClicked, cardViewClicked.getMeasuredWidth(),popupDisplayHeight, Gravity.TOP); 
     editingPopup = popup; 
    } 


    @Override 
    protected void onPause() { 
     dismissPopups(); 
     super.onPause(); 
    } 

    private void dismissPopups() { 
     if (longClickPopup!=null && longClickPopup.isShowing()) { 
      longClickPopup.dismiss(); 
     } 

     if (editingPopup!=null && editingPopup.isShowing()) { 
      editingPopup.dismiss(); 
     } 
    } 
} 

для визуальных Людей

enter image description here

enter image description here

enter image description here

ответ

0

Я решил проблему ... и это было удивительно больше и никакого отношения к Focus/POPUPS (туннельное зрение делает это, я думаю).

В моем манифесте я использовал android:launchMode="singleTop", который создавал странное поведение, когда TheHubActivity был отправлен в недавние приложения, потому что это была моя активность входа. Из функций DeveloperTocs SingleTop такие функции:

Аналогичным образом, новый экземпляр действия «singleTop» также может быть создан для обработки нового намерения. Однако, если целевая задача уже имеет существующий экземпляр активности вверху своего стека, этот экземпляр получит новое намерение (в вызове onNewIntent()); новый экземпляр не создается. В других случаях - например, если существующий экземпляр действия «singleTop» находится в целевой задаче, но не в верхней части стека, или если он находится в верхней части стека, но не в целевой задаче - новый экземпляр будет создан и помещен в стек.

<activity 
      android:name=".TheHubActivity" 
      android:label="@string/app_name" 
      ~~~~~~android:launchMode="singleTop"~~~~~~~~ 
      android:screenOrientation="portrait"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity>