5

Riguarda il problema del coordinamento del comportamento di un pulsante di azione mobile in un'attività che contiene 5 frammenti.Implementazione diversa per un pulsante di azione mobile in ogni frammento di un'attività

Nella mia app, ho un'attività che ospita un ViewPager e un xml definito con FloatingActionButton. ViewPager contiene frammenti e all'interno di ciascun frammento c'è un RecyclerView. Facendo clic sul pulsante di azione mobile, ho implementato scrollToPosition (0). Come ho implementato Floating ActionButton nel file xml dell'attività principale, scrollToPosition() funziona solo nell'ultimo frammento facendo clic sul pulsante di azione mobile. Come faccio a superare questo in modo che facendo clic sul pulsante mobile in qualsiasi frammento la vista del riciclatore scorre verso l'alto?

Ho provato a implementare floatingactionbutton nel file di layout dei frammenti e funziona perfettamente. Ma il problema con questo è il pulsante di azione mobile che si muoverà quando faccio scorrere da un frammento ad un altro frammento. Quindi c'è un modo per poter implementare floatingactionbutton nel file xml di attività principale ed essere ancora in grado di ottenere scrollToPosotion (0) in ogni frammento facendo clic su FloatingActionButton? Molte grazie per qualsiasi suggerimento.

Il seguente è il file xml che contiene il pulsante di azione mobile.

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 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:background="#f4f4f4" 
tools:context=".MainActivity"> 

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:fitsSystemWindows="true"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/tb_main" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     android:elevation="0dp" 
     android:fitsSystemWindows="true" 
     app:layout_scrollFlags="scroll|enterAlways" 
     app:popupTheme="@style/ThemeOverlay.AppCompat.Dark" /> 

    <com.myapp.now.extras.SlidingTabLayout 
     android:id="@+id/sl_tab" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:fitsSystemWindows="true"> 

    </com.myapp.now.extras.SlidingTabLayout> 

</android.support.design.widget.AppBarLayout> 


<android.support.v4.view.ViewPager 
    android:id="@+id/vp_tab" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    /> 


    <android.support.design.widget.FloatingActionButton 
    android:id="@+id/fab" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="bottom|right|end" 
    android:layout_marginBottom="@dimen/fab_margin_bottom" 
    android:layout_marginEnd="@dimen/fab_margin_right" 
    android:layout_marginRight="@dimen/fab_margin_right" 
    android:clickable="true" 
    android:src="@mipmap/top_scroll" 
    app:backgroundTint="@color/colorFAB" 
    app:borderWidth="0dp" 
    app:fabSize="normal" /> 

Il seguente è un file XML di un frammento

<FrameLayout  xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 
<android.support.v4.widget.SwipeRefreshLayout 
    android:id="@+id/srl_swipe" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <android.support.v7.widget.RecyclerView 
     android:id="@+id/rv_list" 
     android:scrollbars="vertical" 
     android:fadeScrollbars="true" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

</android.support.v4.widget.SwipeRefreshLayout> 

<ProgressBar 
    android:visibility="gone" 
    android:layout_gravity="center" 
    android:id="@+id/pbar" 
    android:layout_width="40dp" 
    android:layout_height="40dp" /> 

che segue è l'attuazione del pulsante di azione galleggiante in ogni frammento

fab = (android.support.design.widget.FloatingActionButton) view.findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      LinearLayoutManager llm = (LinearLayoutManager) mRecyclerView.getLayoutManager(); 
      llm.scrollToPositionWithOffset(0, 0); 
     } 
    }); 
+0

Fornire un codice per favore –

+0

Puoi controllare la mia risposta qui: http://stackoverflow.com/a/33586571/2023280 –

+0

@RBhagwat hai risolto questo problema? –

risposta

4

Non sono sicuro se questo funzionerà con SlidingTabLayout poiché utilizzo ViewPager.

Avere la FAB onClick chiamare un metodo (ad esempio onFABClick()) nella vostra attività e definirlo come:

public void onFABClick(View view) { 
    if (fragments.get(mViewPager.getCurrentItem()) instanceof FragmentA) { 
     if (fragmentA!= null) { 
     fragmentA.fabOnClick(); 
     } 
    } else if (fragments.get(mViewPager.getCurrentItem()) instanceof FragmentB) { 
     if (fragmentB!= null) { 
     fragmentB.fabOnClick(); 
     } 
    } 
    } 

Qui fragments è la matrice che contiene fragment oggetti. È la matrice passata all'adattatore di ViewPager. Immagino che dovrai cambiare mViewPager.getCurrentItem() con l'equivalente indice di ottenimento del metodo frammento corrente di SlidingTabLayout.

Infine, il metodo fabOnClick() è implementato in ciascun frammento. (Avrete bisogno di avere tutti i vostri frammenti implementano un'interfaccia (ad esempio FABActionInterface) e aggiungere la firma del metodo c'è.

Qui si sono fondamentalmente recuperando la FAB onclick e dirigere per chiamare un metodo sul frammento corrente.

Problemi correlati