I have a an activity with 3 fragments. Each fragment has to have a FAB with different icon an action. The FAB is defined on the main activity layout. Now I saw that I cannot access it from fragments. How can I do it?
Here's my code: main_activity layout:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
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"
tools:context=".MainActivity">
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:layout_constraintBottom_toTopOf="parent"
app:layout_constraintTop_toBottomOf="parent"
tools:layout_editor_absoluteX="16dp">
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabGravity="fill"
app:tabMode="fixed" />
</android.support.v4.view.ViewPager>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="24dp"
android:src="@android:drawable/ic_dialog_email"
android:visibility="visible"
app:layout_constraintBottom_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</android.support.constraint.ConstraintLayout>
my fragment layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBackgroundFragment">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/contact_recycleview">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
inflating the fragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
v= inflater.inflate(R.layout.filters_fragment,container,false);
myrecyclerview = (RecyclerView) v.findViewById(R.id.contact_recycleview);
recyclerAdapter = new RecyclerViewAdapterCall(getContext(), lstCall);
myrecyclerview.setLayoutManager(new LinearLayoutManager((getActivity())));
myrecyclerview.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL));
myrecyclerview.setAdapter(recyclerAdapter);
return v;
}
so here I'll like to change icon an action, how?
Step 1 create interface
public interface FabButtonClick {
void onFabClicked();
void onFabClickedTwo();
}
Step 2 : inside activity
FabButtonClick fabButtonClick ;
inside `oncreate()` of activity
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switch(mViewPager.getCurrentItem()){
case 0:
fabButtonClick.onFabClicked()
break;
case 1:
fabButtonClick.onFabClickedTwo()
break;
etc
}
}
});
Inside of activity only
private void setListener(FabButtonClick interface){
fabButtonClick =interface;
}
fragment implement FabButtonClick
Inside fragments onViewCreated
((YOUR_ACTIVITY_NAME)getActivity()).setListener(this)
Overridden method from interface now let you handle fab clicks in Fragment
Android developer guide recommend the following way to do Activity, Fragment communication.
Fragment access Activity by listener. Activity access Fragment by getSupportFragmentManager().getFragments()
So you have two ways to use the fab.
First, directly access the fab in Fragment
class MyFragment extends Fragment {
MyFragmentListener listener;
void myFunction() {
FloatingActionButton fab = listener.getFab();
...
}
}
interface MyFragmentListener {
FloatingActionButton getFab();
}
class MyActivity extends AppCompatActivity implements MyFragmentListener {
FloationActionButton fab;
@Override
FloationActionButton getFab() {
return fab;
}
@Override
void onAttachFragment(Fragment fragment) {
super.onAttachFragment(fragment);
if(fragment instanceof MyFragment) {
((MyFragment) fragment).listener = this;
}
}
}
Second, Call Fragment's function when fab is clicked
//In Activity
fab.setOnClickListener(new OnClickListener() {
for(fragment : getSupportFragmentManager().getFragments()) {
if(fragment instanceof MyFragment) {
((MyFragment) fragment).someFunction();
}
}
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With