Android - Fragment 控件Activity里的控件并的显示与隐藏

来源:互联网 发布:个体户 域名备案 编辑:程序博客网 时间:2024/06/11 14:29

问题 : 

     在Fragment里监听RecycerView 滑动事件,来判断向上滑动和向下滑动, 并控制 FolatingActionButton 的隐藏和显示.

基本结构: 

      FloatingActionButton 在 BaseActivity 中, 后在子Activity 中控制 显示与隐藏, 需要判断 子Activity 中的 ViewPager中的Fragment的滑动监听事件,从而来判断向上还是向下滑动, 然后实现显示隐藏FloatingActionButton;

     解决: 通过 接口回调实现判断;

效果演示 :


解决步揍:

   1. FloatingActionButton 在 BaseActivity 中

      (1).开源地址 : https://github.com/futuresimple/android-floating-action-button

      (2).重写FloatingActionButton , 控制其显示与隐藏

package labelnet.cn.ledou.ui;import android.content.Context;import android.util.AttributeSet;import android.view.ViewGroup;import com.getbase.floatingactionbutton.FloatingActionsMenu;/** * FoaltingActionMenu * 浮动菜单 , 显示和隐藏 * 应用在LebaseActivity 通过代码控制其隐藏和显示 * 显现:mFloatingActionsMenu.show(true); * 隐藏:mFloatingActionsMenu.show(false); */public class FloatingActionsMenuHidable extends FloatingActionsMenu {    private boolean isShown = true;    private int ANIM_DURATION = 200;    private boolean mVisible = false;    public FloatingActionsMenuHidable(Context context) {        super(context);    }    public FloatingActionsMenuHidable(Context context, AttributeSet attrs) {        super(context, attrs);    }    public FloatingActionsMenuHidable(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);    }    public void show(boolean isVisible) {        mVisible = isVisible;        int translationX = isVisible ? 0 : (getWidth()/2) + getMarginRight();        this.animate().translationX(translationX).setDuration(ANIM_DURATION).start();    }    public boolean isShown() {        return isShown;    }    private int getMarginRight() {        int marginBottom = 0;        final ViewGroup.LayoutParams layoutParams = getLayoutParams();        if (layoutParams instanceof ViewGroup.MarginLayoutParams) {            marginBottom = ((MarginLayoutParams) layoutParams).rightMargin;        }        return marginBottom;    }    public boolean getVisible(){        return mVisible;    }}

    

      (3). 一个方法实现 ,返回FloatingActionButton 对象 :

FloatingActionsMenuHidable   multiple_actions_up = (FloatingActionsMenuHidable) findViewById(R.id.multiple_actions_up);    public  FloatingActionsMenuHidable getFloatingActionsMenu() {        return multiple_actions_up;    }


     

   2.回调实现

      (1) 在Fragment中实现 回调:

 public interface TestScrollState {        //滑动的状态 true 为 向上滑动,false 向下滑动        public void upAndDownState(boolean b);    }


     (2) 实现 RecyclerView ScrollListener 监听事件

          经过测试 , 只需要实现 OnScroll 事件就行了, 当dy 为 负值的时候,向下滑动,为正值的时候 ,向上滑动;

      不需要实现OnScrollStateChanged , 这里实现测试用的;

 /**     * RecyclerView滑动事件     */    private class ScrollListListener extends RecyclerView.OnScrollListener {        @Override        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {            switch (newState) {                case RecyclerView.SCROLL_STATE_SETTLING:                    //到顶端或低端,不能滑动                    Log.i("Ledou", "11111111111111111111");                    break;                case RecyclerView.SCROLL_STATE_DRAGGING:                    //正在滑动                    Log.i("Ledou", "22222222222222222222");                    break;                case RecyclerView.SCROLL_STATE_IDLE:                    //停止滑动                    Log.i("Ledou", "3333333333333333");                    break;            }        }        @Override        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {            /**             * 向下滑动 dy为负数 false             * 向上滑动 dy为正数 true             */            if (dy > 0) {                TScrollState.upAndDownState(true);            }else{                TScrollState.upAndDownState(false);            }        }    }

   (3)整个 Fragment的 代码 : 

package labelnet.cn.ledou.fragment;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import com.github.florent37.materialviewpager.MaterialViewPagerHelper;import com.github.florent37.materialviewpager.adapter.RecyclerViewMaterialAdapter;import java.util.ArrayList;import java.util.List;import labelnet.cn.ledou.R;import labelnet.cn.ledou.adpater.WeiRecyclerViewAdapter;/** * 内容页实现 * 集成自开源项目 : MaterialViewPager */public class RecyclerViewFragment extends Fragment {    private RecyclerView mRecyclerView;    private RecyclerView.Adapter mAdapter;    private static final int ITEM_COUNT = 100;    private List<Object> mContentItems = new ArrayList<>();    TestScrollState TScrollState;    public RecyclerViewFragment(TestScrollState TScrollState) {        this.TScrollState = TScrollState;    }//    public static RecyclerViewFragment newInstance() {//        return new RecyclerViewFragment(TScrollState);//    }    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        return inflater.inflate(R.layout.fragment_wei_recyclerview, container, false);    }    @Override    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {        super.onViewCreated(view, savedInstanceState);        mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());        mRecyclerView.setLayoutManager(layoutManager);        mRecyclerView.setHasFixedSize(true);        mAdapter = new RecyclerViewMaterialAdapter(new WeiRecyclerViewAdapter(mContentItems));        mRecyclerView.setAdapter(mAdapter);        {            for (int i = 0; i < ITEM_COUNT; ++i)                mContentItems.add(new Object());            mAdapter.notifyDataSetChanged();        }        mRecyclerView.addOnScrollListener(new ScrollListListener());        MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, null);    }    /**     * RecyclerView滑动事件     */    private class ScrollListListener extends RecyclerView.OnScrollListener {        @Override        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {            switch (newState) {                case RecyclerView.SCROLL_STATE_SETTLING:                    //到顶端或低端,不能滑动                    Log.i("Ledou", "11111111111111111111");                    break;                case RecyclerView.SCROLL_STATE_DRAGGING:                    //正在滑动                    Log.i("Ledou", "22222222222222222222");                    break;                case RecyclerView.SCROLL_STATE_IDLE:                    //停止滑动                    Log.i("Ledou", "3333333333333333");                    break;            }        }        @Override        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {            /**             * 向下滑动 dy为负数 false             * 向上滑动 dy为正数 true             */            if (dy > 0) {                TScrollState.upAndDownState(true);            }else{                TScrollState.upAndDownState(false);            }        }    }    public interface TestScrollState {        //滑动的状态 true 为 向上滑动,false 向下滑动        public void upAndDownState(boolean b);    }}


3.在Adapter中作为参数传递

   private RecyclerViewFragment.TestScrollState testScrollState;    public WeiViewPagerAdapter(FragmentManager fm,RecyclerViewFragment.TestScrollState testScrollState) {        super(fm);        this.testScrollState=testScrollState;    }


4.在子 Activity 中实现 接口

      Activity 继承自 TestScrollState接口 , 实现对应的方法 ;

    @Override    public void upAndDownState(boolean b) {//        getFloatingActionsMenu().show();        Log.i("Ledou", "State :" + b);        Log.i("Ledou","Btn_State :"+getFloatingActionsMenu().getVisible());        if(b==false){            hideFloatingButton();        }else{            showFloatingButton();        }    }


    显示和隐藏的两个方法 :

    public void hideFloatingButton(){        if(getFloatingActionsMenu().getVisible()==false) {            getFloatingActionsMenu().show(true);        }    }    public void showFloatingButton(){        if(getFloatingActionsMenu().getVisible()==true) {            getFloatingActionsMenu().show(false);        }    }


0 0