Search code examples
androidandroid-layoutandroid-fragmentsimageviewandroid-appbarlayout

OnOffsetChanged is not working


Trying to make the avatar pic get smaller until disappear by using OnOffsetChanged but it is not working in the fragment. I tried the same way with an activity it worked.

<android.support.design.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:fitsSystemWindows="true">

<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">


<android.support.design.widget.CollapsingToolbarLayout
    android:id="@+id/collapsing_toolbar"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    app:contentScrim="?attr/colorPrimary"
    app:expandedTitleTextAppearance="@style/TextAppearance.AppCompat.Title"
    app:layout_scrollFlags="scroll|exitUntilCollapsed"
    app:titleEnabled="false">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="220dp"
        android:fitsSystemWindows="true"
        android:scaleType="centerCrop"
        android:src="@drawable/bg_polygon"
        app:layout_collapseMode="parallax" />

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:contentInsetStartWithNavigation="0dp"
        app:layout_collapseMode="pin"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

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

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

<android.support.v4.widget.NestedScrollView>
**some code** 
</android.support.v4.widget.NestedScrollView>

<com.mikhaellopez.circularimageview.CircularImageView
   android:id="@+id/profileImage"
   android:layout_width="100dp"
   android:layout_height="100dp"
   android:src="@drawable/photo_female_6"
   app:civ_border="true"
   app:civ_border_width="2dp"
   app:layout_anchor="@id/app_bar_layout"
   app:layout_anchorGravity="bottom|center" />

I tried to use OnOffsetChangedListener using two ways non of them worked the first is calling the (AppBarLayout) v.findViewById(R.id.app_bar_layout)).addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener()) to override the method and the second is by implementing the appbarlayout in the fragmet class

public class ProfileFragment extends Fragment implements 

    AppBarLayout.OnOffsetChangedListener  {

    public ProfileFragment() {
        // Required empty public constructor
    }

    public static ProfileFragment newInstance() {
        ProfileFragment fragment = new ProfileFragment();
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AppBarLayout appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.app_bar_layout);
    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_profile, container, false);
        return inflater.inflate(R.layout.fragment_profile, container, false);
    }


private void initComponent(View v) {

    final CircularImageView image = v.findViewById(R.id.profileImage);

    final CollapsingToolbarLayout collapsing_toolbar = v.findViewById(R.id.collapsing_toolbar);


    ((AppBarLayout) v.findViewById(R.id.app_bar_layout)).addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
        @Override
        public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
            int min_height = ViewCompat.getMinimumHeight(collapsing_toolbar) * 2;
            float scale = (float) (min_height + verticalOffset) / min_height;
            image.setScaleX(scale >= 0 ? scale : 0);
            image.setScaleY(scale >= 0 ? scale : 0);
        }
    });
}

@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
    final CircularImageView image;
    image = (CircularImageView) getActivity().findViewById(R.id.profileImage);
    final CollapsingToolbarLayout collapsing_toolbar = (CollapsingToolbarLayout) getActivity().findViewById(R.id.collapsing_toolbar);

    int min_height = ViewCompat.getMinimumHeight(collapsing_toolbar) * 2;
    float scale = (float) (min_height + verticalOffset) / min_height;
    image.setScaleX(scale >= 0 ? scale : 0);
    image.setScaleY(scale >= 0 ? scale : 0);
}
}

and when I debugged the code I found that the method was never called even when I used the CollapsingToolbarLayout.


Solution

  • i solved this problem by adding an "onactivitycreated" method so when i try to get the view i will exist

    public void onActivityCreated(Bundle savedInstanceState) {
                super.onActivityCreated(savedInstanceState);
    
        AppBarLayout mAppBarLayout = getView().findViewById(R.id.app_bar_layout);
            final CollapsingToolbarLayout collapsing_toolbar = getView().findViewById(R.id.collapsing_toolbar);
            final CircularImageView image = getView().findViewById(R.id.profileImage);
    
            mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
                @Override
                public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                    int min_height = ViewCompat.getMinimumHeight(collapsing_toolbar) * 2;
                    float scale = (float) (min_height + verticalOffset) / min_height;
                    image.setScaleX(scale >= 0 ? scale : 0);
                    image.setScaleY(scale >= 0 ? scale : 0);
                }
            });
        }