0

Contextenon répondantes application dans « Applications récentes » quand PopUpMenu et Modifier le texte actuel

Je travaille avec popupwindows pour permettre à un utilisateur de rapidement renomme un dans une activité Vignettes.

Je fais ceci en utilisant un ViewSwitcher pour échanger le TextView (nom d'origine) pour un EditText (nouveau nom).

Problème

Lorsque le EditText et PopUpWindow confirmer sont présents un l'utilisateur appuie sur "RECENT APPS", vous ne pouvez pas pour une raison quelconque à revenir dans l'application. ie. lorsque vous cliquez dessus, il ne répondra pas.

Diagnostic

Je pense que c'est un problème avec la fenêtre Focus. J'ai essayé EditText.clearFocus() de ET et en rejetant tous les PopUps , pas de chance.

Existe-t-il un moyen d'utiliser onFocusChangeListener pour supprimer ce problème?

code (je l'ai essayé d'enlever autant les éléments superflus que possible)

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(); 
     } 
    } 
} 

pour les personnes visuels

enter image description here

enter image description here

enter image description here

Répondre

0

Je résolu la question ... et il était étonnamment plus grande et sans aucun rapport avec la Focus/popups (vision tunnel fait que je suppose).

Dans mon manifeste, j'utilisais android:launchMode="singleTop" qui était en train de créer un comportement étrange lorsque TheHubActivity était envoyé à des applications récentes parce que c'était mon activité d'entrée. À partir de Developer Docs singleTop fonctionne comme suit:

De même, une nouvelle instance d'une activité «singleTop» peut également être créée pour gérer une nouvelle intention. Cependant, si la tâche cible a déjà une instance existante de l'activité en haut de sa pile, cette instance recevra la nouvelle intention (dans un appel onNewIntent()); une nouvelle instance n'est pas créée. Dans d'autres circonstances - par exemple, si une instance existante de l'activité "singleTop" est dans la tâche cible, mais pas en haut de la pile, ou si elle est en haut d'une pile, mais pas dans la tâche cible - un une nouvelle instance serait créée et poussée sur la pile.

<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>