2017-11-27 1 views
0

enter image description here Ich habe mehrere Fragmente, die denselben Container verwenden, und wenn ein Fragment über ein anderes hinzugefügt wird, möchte ich den Fokus nur zwischen den Ansichten des kürzlich hinzugefügten Fragments verschieben . Ich habe versucht, es mit onBackstackChangeListener() zu lösen, aber es scheint nicht zu funktionieren. Wie im Bild möchte ich nur auf das Pin-Entry-Fragment fokussieren, aber der Fokus verschiebt sich auch auf die "Enter" -Buttons auf dem Fragment hinter dem Pin-Entry-Fragment. Bitte helfen Sie.Fokus auf nur ein Fragment in einem Container mit mehreren hinzugefügten Fragmenten beschränken

+0

Machen Sie die oberste Wurzel Ihrer Fragmente anklickbar in XML. – ADM

+0

@ADM können Sie bitte mehr erklären ... –

Antwort

0

Wenn Sie einen einzelnen Container für alle Fragmente verwenden, müssen Sie den obersten Stamm Ihrer Fragmente anklickbar setzen. Andernfalls kann Fragment hinter den Fokus für anklickbare Elemente greifen. Sehen Sie sich zum Beispiel das Fragmentlayout unten an.

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:clickable="true" 
android:orientation="vertical"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="right" 
    android:background="?selectableItemBackground" 
    android:gravity="center_vertical" 
    android:textColor="@color/white" 
    android:textSize="@dimen/normal_text" /> 
</LinearLayout> 
+0

Ich fürchte, das scheint nicht mit meinen Codes zu funktionieren. Danke trotzdem. –

+0

Das ist vielleicht, weil Ihr Enter-Pin-Fragment wrap_content ist. Make, wenn das Elternteil gefüllt wird. – ADM

+0

@NishanKhadka können Sie eine Lösung finden, ich habe das gleiche Problem – ysfcyln

0

Ich fand eine Arbeit um dieses Problem, aber es ist keine echte Lösung, Beste Antwort wird als richtige Antwort markiert.

Umgehen: Fügen Sie Ansichten um Ihr Layout hinzu, die den Fokus benötigen, um in sich selbst zu bleiben. Zum Beispiel:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:orientation="horizontal"/> 
<View 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:focusable="true" 
     android:id="@+id/left_view"/> 
<LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal"> 
<TextView 
       android:id="@+id/buyOrWatch" 
       android:layout_width="90dp" 
       android:layout_height="30dp" 
       android:layout_margin="5dp" 
       android:background="@drawable/movie_buy_selector" 
       android:focusable="true" 
       android:gravity="center" 
       android:text="@string/buy" 
       android:textColor="@color/color_white" /> 

      <TextView 
       android:id="@+id/preview" 
       android:layout_width="90dp" 
       android:layout_height="30dp" 
       android:layout_margin="5dp" 
       android:layout_marginTop="15dp" 
       android:background="@drawable/movie_buy_selector" 
       android:focusable="true" 
       android:gravity="center" 
       android:text="@string/preview" 
       android:textColor="@color/color_white" /> 
     </LinearLayout> 

<View 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:focusable="true" 
      android:id="@+id/right_view"/> 

stellte ich das Layout mit der Textviews zwischen den beiden Ansichten mit fokussierbaren 0DP Breite. Verknüpfen Sie jetzt in Ihrer Fragmentklasse diese Ansichten und definieren Sie dann für diese Ansichten focusChangeListener(). zum Beispiel, wenn leftView bindet mit der ID sehen android:id="@+id/left_view" und buyOrWatch mit TextViewandroid:id="@+id/buyOrWatch" hat, dann,

leftView.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
      @Override 
      public void onFocusChange(View view, boolean hasFocus) { 
       if(hasFocus){ 
        buyOrWatch.requestFocus(); 
       } 
      } 
     }); 

können Sie ähnliche Zuhörer Fokusänderung wie oben für jede Ansichten definieren, dann solange das Fragment sichtbar ist, Fokus bleibt bei im Fragment. Hoffe, das hilft jemandem.

Verwandte Themen