ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android-ObservableScrollView – 意外触摸在使用ViewPagerTabListViewFragment时更改子片段

2019-06-28 16:13:56  阅读:147  来源: 互联网

标签:android android-fragments observablelist


我正在使用Android-ObservableScrollView
在我的项目中.
我面临一个问题,即使我只是触摸viewpager,SlidingTab捕获此事件并且视图寻呼机的当前片段也会发生变化.我粘贴了我项目中的所有代码,但大多数代码与示例项目类似.

我在网上调查了这个问题并发现this issue很有用,但我尝试了这个解决方案,但它对我不起作用.
请帮忙.

THIS IS THE ISSUE

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dash_board);
    mToolBar = (Toolbar) findViewById(R.id.toolbar);
    refreshJobsData = true;
    setUpViewPager();
}

public void setUpViewPager() {
    mHeaderView = findViewById(R.id.header);
    ViewCompat.setElevation(mHeaderView, getResources().getDimension(R.dimen.toolbar_elevation));
    mToolbarView = findViewById(R.id.toolbar);
    mPagerAdapter = new NavigationAdapter(getSupportFragmentManager());
    mPager = (ViewPager) findViewById(R.id.pager);
    mPager.setAdapter(mPagerAdapter);

    SlidingTabLayout slidingTabLayout = (SlidingTabLayout) findViewById(R.id.sliding_tabs);
    slidingTabLayout.setCustomTabView(R.layout.tab_indicator, android.R.id.text1);
    slidingTabLayout.setSelectedIndicatorColors(getResources().getColor(R.color.theme_green_dark));
    slidingTabLayout.setDistributeEvenly(false);
    slidingTabLayout.setViewPager(mPager);

    // When the page is selected, other fragments' scrollY should be adjusted
    // according to the toolbar status(shown/hidden)
    slidingTabLayout.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i2) {
        }

        @Override
        public void onPageSelected(int i) {
            propagateToolbarState(toolbarIsShown());
        }

        @Override
        public void onPageScrollStateChanged(int i) {
        }
    });

    propagateToolbarState(toolbarIsShown());
}

@Override
public void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging) {
    if (dragging) {
        int toolbarHeight = mToolbarView.getHeight();
        float currentHeaderTranslationY = ViewHelper.getTranslationY(mHeaderView);
        if (firstScroll) {
            if (-toolbarHeight < currentHeaderTranslationY) {
                mBaseTranslationY = scrollY;
            }
        }
        float headerTranslationY = ScrollUtils.getFloat(-(scrollY - mBaseTranslationY), -toolbarHeight, 0);
        ViewPropertyAnimator.animate(mHeaderView).cancel();
        ViewHelper.setTranslationY(mHeaderView, headerTranslationY);
    }
}

@Override
public void onDownMotionEvent() {
}

@Override
public void onUpOrCancelMotionEvent(ScrollState scrollState) {
    mBaseTranslationY = 0;

    Fragment fragment = getCurrentFragment();
    if (fragment == null) {
        return;
    }
    View view = fragment.getView();
    if (view == null) {
        return;
    }

    int toolbarHeight = mToolbarView.getHeight();
    final ObservableListView listView = (ObservableListView) view.findViewById(R.id.scroll);
    if (listView == null) {
        return;
    }
    int scrollY = listView.getCurrentScrollY();
    if (scrollState == ScrollState.DOWN) {
        showToolbar();
    } else if (scrollState == ScrollState.UP) {
        if (toolbarHeight <= scrollY) {
            hideToolbar();
        } else {
            showToolbar();
        }
    } else {
        // Even if onScrollChanged occurs without scrollY changing, toolbar should be adjusted
        if (toolbarIsShown() || toolbarIsHidden()) {
            // Toolbar is completely moved, so just keep its state
            // and propagate it to other pages
            propagateToolbarState(toolbarIsShown());
        } else {
            // Toolbar is moving but doesn't know which to move:
            // you can change this to hideToolbar()
            showToolbar();
        }
    }
}

private Fragment getCurrentFragment() {
    return mPagerAdapter.getItemAt(mPager.getCurrentItem());
}

private void propagateToolbarState(boolean isShown) {
    int toolbarHeight = mToolbarView.getHeight();

    // Set scrollY for the fragments that are not created yet
    mPagerAdapter.setScrollY(isShown ? 0 : toolbarHeight);

    // Set scrollY for the active fragments
    for (int i = 0; i < mPagerAdapter.getCount(); i++) {
        // Skip current item
        if (i == mPager.getCurrentItem()) {
            continue;
        }

        // Skip destroyed or not created item
        Fragment f = mPagerAdapter.getItemAt(i);
        if (f == null) {
            continue;
        }

        ObservableListView listView = (ObservableListView) f.getView().findViewById(R.id.scroll);
        if (isShown) {
            // Scroll up
            if (0 < listView.getCurrentScrollY()) {
                listView.setSelection(0);
            }
        } else {
            // Scroll down (to hide padding)
            if (listView.getCurrentScrollY() < toolbarHeight) {
                listView.setSelection(1);
            }
        }
    }
}

private boolean toolbarIsShown() {
    return ViewHelper.getTranslationY(mHeaderView) == 0;
}

private boolean toolbarIsHidden() {
    return ViewHelper.getTranslationY(mHeaderView) == -mToolbarView.getHeight();
}

private void showToolbar() {
    float headerTranslationY = ViewHelper.getTranslationY(mHeaderView);
    if (headerTranslationY != 0) {
        ViewPropertyAnimator.animate(mHeaderView).cancel();
        ViewPropertyAnimator.animate(mHeaderView).translationY(0).setDuration(200).start();
    }
    propagateToolbarState(true);
}

private void hideToolbar() {
    float headerTranslationY = ViewHelper.getTranslationY(mHeaderView);
    int toolbarHeight = mToolbarView.getHeight();
    if (headerTranslationY != -toolbarHeight) {
        ViewPropertyAnimator.animate(mHeaderView).cancel();
        ViewPropertyAnimator.animate(mHeaderView).translationY(-toolbarHeight).setDuration(200).start();
    }
    propagateToolbarState(false);
}

private static class NavigationAdapter extends CacheFragmentStatePagerAdapter {

    private static final String[] TITLES = new String[]{"Applepie", "Butter Cookie", "Cupcake", "Donut", "Eclair", "Froyo", "Gingerbread", "Honeycomb", "Ice Cream Sandwich", "Jelly Bean", "KitKat", "Lollipop"};

    private int mScrollY;

    public NavigationAdapter(FragmentManager fm) {
        super(fm);
    }

    public void setScrollY(int scrollY) {
        mScrollY = scrollY;
    }

    @Override
    protected Fragment createItem(int position) {
        Fragment f = new ViewPagerTabListViewFragment();
        if (0 < mScrollY) {
            Bundle args = new Bundle();
            args.putInt(ViewPagerTabListViewFragment.ARG_INITIAL_POSITION, 1);
            f.setArguments(args);
        }
        return f;
    }

    @Override
    public int getCount() {
        return TITLES.length;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return TITLES[position];
    }
}

ViewPagerTabListViewFragment.java

public class ViewPagerTabListViewFragment extends Fragment {

public static final String ARG_INITIAL_POSITION = "ARG_INITIAL_POSITION";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_listview, container, false);

    Activity parentActivity = getActivity();
    final ObservableListView listView = (ObservableListView) view.findViewById(R.id.scroll);
    setDummyDataWithHeader(listView, inflater.inflate(R.layout.padding, null));

    if (parentActivity instanceof ObservableScrollViewCallbacks) {
        // Scroll to the specified position after layout
        Bundle args = getArguments();
        if (args != null && args.containsKey(ARG_INITIAL_POSITION)) {
            final int initialPosition = args.getInt(ARG_INITIAL_POSITION, 0);
            ScrollUtils.addOnGlobalLayoutListener(listView, new Runnable() {
                @Override
                public void run() {
                    // scrollTo() doesn't work, should use setSelection()
                    listView.setSelection(initialPosition);
                }
            });
        }
        listView.setScrollViewCallbacks((ObservableScrollViewCallbacks) parentActivity);
    }
    return view;
}

protected void setDummyDataWithHeader(ListView listView, View headerView) {
    listView.addHeaderView(headerView);
    final ArrayList<String> list = Utils.getDummyList();
    String[] array = list.toArray(new String[list.size()]);
    ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, array);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Utils.showToast(getActivity(), list.get(position).toUpperCase());
        }
    });
  }
}

MainActivity- Layout.xml

<!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. -->
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!--
Padding for ViewPager must be set outside the ViewPager itself
because with padding, EdgeEffect of ViewPager become strange.
-->
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingTop="48dp">

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

    <LinearLayout
        android:id="@+id/header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/theme_green_dark"
            android:minHeight="?attr/actionBarSize"
            app:popupTheme="@style/Theme.AppCompat.Light.DarkActionBar"
            app:theme="@style/Toolbar"
            android:elevation="4dp">
        </android.support.v7.widget.Toolbar>

        <!--<ImageView-->
            <!--android:layout_width="match_parent"-->
            <!--android:layout_height="@dimen/dimen_160_dp"-->
            <!--android:background="@color/loader_dark_color"/>-->

        <com.callathome.consumer.widgets.SlidingTabLayout
            android:id="@+id/sliding_tabs"
            android:layout_width="match_parent"
            android:layout_height="@dimen/tab_height"
            android:background="@color/white"/>
    </LinearLayout>
</FrameLayout>

<fragment
    android:id="@+id/navigation_drawer"
    android:layout_width="@dimen/navigation_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:name="com.callathome.consumer.fragment.NavigationDrawerFragment"
    tools:layout="@layout/fragment_navigation_drawer"/>

请帮忙!

提前致谢.

解决方法:

看来这是ObservableListView中的一个问题.
要拦截触摸事件,ObservableListView旨在调用其父级的onInterceptTouchEvent()和父级 – 在这种情况下,父级是ViewPager – 意外地处理触摸事件,这会导致此行为.

无论如何,我找到了解决方法.
你能在你的应用程序中尝试这个吗?

>添加类似于根ViewGroup的ID
在您的MainActivity-Layout.xml中,如android:id =“@ id / root”:

<FrameLayout
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!--
    Padding for ViewPager must be set outside the ViewPager itself
    because with padding, EdgeEffect of ViewPager become strange.
    -->

>然后将此FrameLayout设置为TouchInterceptionViewGroup
到ViewPagerTabListViewFragment.java中的ObservableListView.
也许围绕listView.setScrollViewCallbacks()是好的.

listView.setTouchInterceptionViewGroup((ViewGroup) parentActivity.findViewById(R.id.root));
listView.setScrollViewCallbacks((ObservableScrollViewCallbacks) parentActivity);

标签:android,android-fragments,observablelist
来源: https://codeday.me/bug/20190628/1317398.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有