【问题标题】:When I left swipe sliding tabs the left navigation drawer opens up当我离开滑动滑动标签时,左侧导航抽屉打开
【发布时间】:2017-09-25 13:51:00
【问题描述】:

我正在使用材料设计滑动标签(smartTabLayout),这里:https://github.com/ogaclejapan/SmartTabLayout

还有,Material Design 侧边导航抽屉(android 驻留菜单),这里:https://github.com/SpecialCyCi/AndroidResideMenu

我面临的问题是:当我从任何选项卡向左滑动时,导航抽屉会打开,但当我向右滑动时很好。

代码如下:

MainActivity.java:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "MainActivity";

    private SectionsPageAdapter sectionsPageAdapter;
    private ViewPager viewPager;
    Toolbar toolbar;
    ResideMenu resideMenu;
    SmartTabLayout smartTabLayout;
    private MainActivity mContext;
    private ResideMenuItem equalizer;
    private ResideMenuItem ringtonemaker;
    private ResideMenuItem identifysong;
    private ResideMenuItem themes;
    private ResideMenuItem rateus;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mContext = MainActivity.this;
        setUpMenu();


        toolbar = (Toolbar)findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        sectionsPageAdapter = new SectionsPageAdapter(getSupportFragmentManager());

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        smartTabLayout = (SmartTabLayout) findViewById(R.id.viewpagertab);
        smartTabLayout.setViewPager(viewPager);



    }


    private void setupViewPager(ViewPager viewPager) {

        SectionsPageAdapter adapter = new SectionsPageAdapter(getSupportFragmentManager());
        adapter.addFragment(new Albums(), "Albums");
        adapter.addFragment(new Artists(), "Artists");
        adapter.addFragment(new Songs(), "Songs");
        adapter.addFragment(new Playlists(), "Playlists");
        adapter.addFragment(new Genres(), "Genres");
        adapter.addFragment(new My_Files(), "My Files");
        viewPager.setAdapter(adapter);
        viewPager.setPageTransformer(true, new CubeInTransformer());

    }

        private void setUpMenu() {

        // attach to current activity;
        resideMenu = new ResideMenu(this);
        resideMenu.setBackground(R.drawable.city);
        resideMenu.attachToActivity(this);
        //valid scale factor is between 0.0f and 1.0f. leftmenu'width is 150dip.
        resideMenu.setScaleValue(0.6f);

        // create menu items;
        equalizer = new ResideMenuItem(this, R.drawable.city, "Equalizer");
        ringtonemaker = new ResideMenuItem(this, R.drawable.city, "Ringtone Maker");
        identifysong = new ResideMenuItem(this, R.drawable.city, "Identify Song");
        themes = new ResideMenuItem(this, R.drawable.city, "Theme");
        rateus = new ResideMenuItem(this, R.drawable.city, "Rate us");

        equalizer.setOnClickListener(this);
        ringtonemaker.setOnClickListener(this);
        identifysong.setOnClickListener(this);
        themes.setOnClickListener(this);
        rateus.setOnClickListener(this);

        resideMenu.addMenuItem(equalizer, ResideMenu.DIRECTION_LEFT);
        resideMenu.addMenuItem(ringtonemaker, ResideMenu.DIRECTION_LEFT);
        resideMenu.addMenuItem(identifysong, ResideMenu.DIRECTION_LEFT);
        resideMenu.addMenuItem(themes, ResideMenu.DIRECTION_LEFT);
        resideMenu.addMenuItem(rateus, ResideMenu.DIRECTION_LEFT);

        // You can disable a direction by setting ->
        resideMenu.setSwipeDirectionDisable(ResideMenu.DIRECTION_RIGHT);

    }



    @Override
    public void onClick(View view) {

    }
}

滑动标签的适配器:

class SectionsPageAdapter extends FragmentPagerAdapter {

    private final List<Fragment> FragmentList = new ArrayList<>();
    private final List<String> FragmentTitleList = new ArrayList<>();

    public void addFragment(Fragment fragment, String Title){

        FragmentList.add(fragment);
        FragmentTitleList.add(Title);
    }


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

    @Override
    public CharSequence getPageTitle(int position) {
        return FragmentTitleList.get(position);
    }

    @Override
    public Fragment getItem(int position) {
       return FragmentList.get(position);
    }

    @Override
    public int getCount() {
        return FragmentList.size();
    }
}

activity_main.xml:

<RelativeLayout 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="@drawable/city"

tools:context="com.musicplayer.musicana.MainActivity">

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="30dp"
    android:title="Musicana"
    app:titleTextColor="#ffffff">

</android.support.v7.widget.Toolbar>

<com.ogaclejapan.smarttablayout.SmartTabLayout
    android:id="@+id/viewpagertab"
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:layout_below="@+id/toolbar"
    app:stl_indicatorAlwaysInCenter="false"
    app:stl_indicatorWithoutPadding="false"
    app:stl_indicatorInFront="false"
    app:stl_indicatorInterpolation="smart"
    app:stl_indicatorGravity="center"
    app:stl_indicatorColor="#40C4FF"
    app:stl_indicatorThickness="30dp"
    app:stl_indicatorWidth="110dp"
    app:stl_indicatorCornerRadius="10dp"
    app:stl_overlineColor="#4D000000"
    app:stl_overlineThickness="0dp"
    app:stl_underlineColor="#ffffff"
    app:stl_underlineThickness="0dp"
    app:stl_dividerColor="#ffffff"
    app:stl_dividerThickness="0dp"
    app:stl_defaultTabBackground="?attr/selectableItemBackground"
    app:stl_defaultTabTextAllCaps="false"
    app:stl_defaultTabTextColor="#ffffff"
    app:stl_defaultTabTextSize="16sp"
    app:stl_defaultTabTextHorizontalPadding="30dp"
    app:stl_defaultTabTextMinWidth="0dp"
    app:stl_distributeEvenly="false"
    app:stl_clickable="true"
    app:stl_titleOffset="24dp"
    app:stl_drawDecorationAfterTab="false"
    />

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/viewpagertab"
    />
</RelativeLayout>

【问题讨论】:

  • 这就是您要找的东西吗? resideMenu.addIgnoredView(viewPager);
  • 不,我试过了。这只会阻止整个 viewpager 访问侧导航抽屉。当我向左滑动第一个标签时,我想打开侧导航抽屉。无论如何,感谢您的帮助:)
  • 你可以尝试类似的方法,当你到达 viewpager 上的第一个片段时,然后删除被忽略的视图,当你在其他页面上时,将 Viewpager 添加到被忽略的视图中。
  • 是的,我会试试的。谢谢你:)

标签: android android-fragments tabs navigation navigation-drawer


【解决方案1】:

正如我所见here 方法dispatchTouchEvent 无法设置拖动区域以避免ViewPager 触摸拦截。因此,您可以分叉此存储库并添加该功能。或者你可以覆盖活动的dispatchTouchEvent:

boolean menuDragging = false;  

public boolean isInsideMenuDragArea(MotionEvent ev) {
    return ev.getX() < 200; // THIS IS PIXELS, NOT DP!
}

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (menuDragged) return resideMenu.dispatchTouchEvent(ev);
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
         if (!isInsideMenuDragArea(ev)) {
              return super.dispatchTouchEvent(ev);
         } else {
              menuDragging = true;
         }    
    } else if (ev.getAction() ==  MotionEvent.ACTION_UP) {
         menuDragging = false;
    }
    return resideMenu.dispatchTouchEvent(ev);

}

我认为这足以理解我的意思

编辑:

如果您想在向左滑动第一个标签时打开侧导航抽屉

viewPager.setOnPageChangeListener(new OnPageChangeListener() {
    public void onPageScrollStateChanged(int state) {}
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

    public void onPageSelected(int position) {
        if (position == 0) resideMenu.removeIgnoredView(viewPager);
        else resideMenu.addIgnoredView(viewPager);
    }
});

EDIT2: 将此添加到您的活动中

boolean resideMenuEnabled = true;

public void setResideMenuEnabled(boolean enabled) {
     if (resideMenuEnabled != enabled) {
          if (enabled) resideMenu.removeIgnoredView(viewPager);
          else resideMenu.addIgnoredView(viewPager);
          resideMenuEnabled = enabled;
     }
}

并像这样使用它

viewPager.setOnPageChangeListener(new OnPageChangeListener() {
    public void onPageScrollStateChanged(int state) {}
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

    public void onPageSelected(int position) {
        if (position == 0) setResideMenuEnabled(true);
        else setResideMenuEnabled(false);
    }
});

【讨论】:

  • 我已经在我的活动中覆盖了 dispatchTouchEvent 但仍然没有运气:(
  • 这似乎适用于前两个选项卡。但是当我得到最右边的标签并回到第一个标签并向左滑动时,什么也没有发生。好吧,谢谢你的时间:)
  • 当我滑动到“艺术家”选项卡并返回时它工作正常,但是当我滑动到“歌曲”选项卡和前面的其他选项卡然后返回时,左滑动不起作用。我什至尝试实现手势,但没有任何帮助。请帮我! :(
  • @SebinPaul EDIT2
  • 谢谢!像魅力一样工作!你是专业人士!你能告诉我这背后的逻辑吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
相关资源
最近更新 更多