2017-09-04 6 views
2

Ich arbeite an der Anwendung für TV-Plattform und RCU für die Navigation verwenden.Fokus auf Fragment deaktivieren

Ich habe Anwendungsfall, wo ich zwei Fragmente übereinander und gleichzeitig auf dem Bildschirm sichtbar haben.

Gibt es eine Möglichkeit, Fokus zu deaktivieren, die unten ist? setFocusable (false) auf Fragmenten Ansicht funktioniert nicht, und ich bin in der Lage, Elemente in Fragment unten zu konzentrieren.

Vielen Dank im Voraus.

+0

Sie können Setonclicklistner in OnCreate programmgesteuert hinzufügen. –

+0

so etwas wie das. https://StackOverflow.com/a/25841415/3364266 –

+0

Warum onClickListener? Ich brauche etwas wie onFocusChanged? Ich verwende keine Berührungsereignisse, es ist Android TV mit Fernbedienung. – Veljko

Antwort

2

Die Lösung, die ich mit am Ende habe kommen ist:

Added benutzerdefinierten Lifecycle-Listener für das Fragment nämlich: onFragmentResume und onFragmentPause Ereignisse, die ich manuell aufrufen, wenn ich zeigen muss/Verstecke oder wechsle zwischen Fragmenten.

@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); 
    } 
} 
Verwandte Themen