2017-09-04 2 views
2

Je travaille sur une application pour la plate-forme TV et j'utilise le RCU pour la navigation.Désactiver le focus sur le fragment

J'ai un cas d'utilisation où j'ai deux fragments l'un sur l'autre et visibles sur l'écran en même temps. Y at-il un moyen de désactiver le fragment de focalisation qui est ci-dessous?

setFocusable (false) sur la vue fragments ne fonctionne pas, et je suis en mesure de concentrer les éléments dans le fragment ci-dessous.

Merci d'avance.

+0

Vous pouvez ajouter setonclicklistner dans onCreate par programmation. –

+0

quelque chose comme ça. https://stackoverflow.com/a/25841415/3364266 –

+0

Pourquoi onClickListener? J'ai besoin de quelque chose comme onFocusChanged? Je n'utilise pas d'événements tactiles, c'est Android TV avec télécommande. – Veljko

Répondre

2

La solution que je suis venu avec à la fin est:

Ajouté auditeurs du cycle de vie personnalisé pour le fragment à savoir: onFragmentResume et onFragmentPause événements que j'appelle manuellement quand je dois montrer/cache ou passe d'un fragment à l'autre.

@Override 
public void onFragmentResume() { 

    //Enable focus 
    if (getView() != null) { 

     //Enable focus 
     setEnableView((ViewGroup) view, true); 

     //Clear focusable elements 
     focusableViews.clear(); 
    } 

    //Restore previous focus 
    if (previousFocus != null) { 
     previousFocus.requestFocus(); 
    } 
} 

@Override 
public void onFragmentPause() { 

    //Disable focus and store previously focused 
    if (getView() != null) { 

     //Store last focused element 
     previousFocus = getView().findFocus(); 

     //Clear current focus 
     getView().clearFocus(); 

     //Disable focus 
     setEnableView((ViewGroup) view, false); 
    } 
} 

/** 
* Find focusable elements in view hierarchy 
* 
* @param viewGroup view 
*/ 
private void findFocusableViews(ViewGroup viewGroup) { 

    int childCount = viewGroup.getChildCount(); 
    for (int i = 0; i < childCount; i++) { 
     View view = viewGroup.getChildAt(i); 
     if (view.isFocusable()) { 
      if (!focusableViews.contains(view)) { 
       focusableViews.add(view); 
      } 
     } 
     if (view instanceof ViewGroup) { 
      findFocusableViews((ViewGroup) view); 
     } 
    } 
} 

/** 
* Enable view 
* 
* @param viewGroup 
* @param isEnabled 
*/ 
private void setEnableView(ViewGroup viewGroup, boolean isEnabled) { 

    //Find focusable elements 
    findFocusableViews(viewGroup); 

    for (View view : focusableViews) { 
     view.setEnabled(isEnabled); 
     view.setFocusable(isEnabled); 
    } 
}