BottomNavigationView ViewPager Fragment组合设计底部导航框架(禁止长按弹出)

734 阅读2分钟
  1. 首先在app module中添加

implementation 'com.google.android.material:material:1.2.0' 这个版本添加角标,包括数字,类似QQ和微信的未读消息

  1. 主界面布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical">

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/vp_view_container"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_nav_view"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_60"
        android:layout_gravity="bottom"
        android:layout_marginStart="0dp"
        android:layout_marginEnd="0dp"
        android:background="@drawable/main_bottom_bg"
        app:itemIconTint="@color/tab_text_color_selector"
        app:itemTextColor="@color/tab_text_color_selector"
        app:menu="@menu/main_bottom_nav_menu" />
</LinearLayout>

  1. MainPagerAdapter (Fragment适配器)
public class MainPagerAdapter extends FragmentStateAdapter {
    private List<Fragment> mFragments;

    public MainPagerAdapter(@NonNull FragmentActivity fragmentActivity, List<Fragment> fragments) {
        super(fragmentActivity);
        mFragments = fragments;
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return mFragments.get(position);
    }

    @Override
    public int getItemCount() {
        return mFragments.size();
    }
}
  1. Activity代码设置
public class MainActivity extends BaseActivity implements ILaunchCallback {
    @BindView(R.id.vp_view_container)
    ViewPager2 mViewPager2;

    @BindView(R.id.bottom_nav_view)
    BottomNavigationView mBottomNavView;

    private MainPagerAdapter mMainPagerAdapter;
    private final List<Fragment> mListFragment = new ArrayList<>();

    String[] PERMS = {
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
    };

    private ActivityResultLauncher<Intent> mSettingsLauncher = registerForActivityResult(new StartActivityForResult(), result -> {
        doPermission();
    });
    private ActivityResultLauncher mMultiRequestPermission = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() {
        @Override
        public void onActivityResult(Map<String, Boolean> result) {
            for (Map.Entry<String, Boolean> entry : result.entrySet()) {
                boolean value = entry.getValue();
                String key = entry.getKey();
                if (!value) {
                    mSingleRequestPermission.launch(key);
                    break;
                }
            }
        }
    });

    private ActivityResultLauncher mSingleRequestPermission = registerForActivityResult(new ActivityResultContracts.RequestPermission(), result -> {
        if (!result) {
            AppUtil.showTipsDialog(MainActivity.this, MainActivity.this);
        }
    });

    private void doPermission() {
        mMultiRequestPermission.launch(PERMS);
    }

    @Override
    protected int setLayoutId() {
        return R.layout.app_bar_main;
    }

    @Override
    public void initData() {
        mListFragment.add(new FragmentSetting());
        mListFragment.add(new FragmentTask());
        mListFragment.add(new FragmentDevice());
        mMainPagerAdapter = new MainPagerAdapter(this, mListFragment);
        mViewPager2.setAdapter(mMainPagerAdapter);
        mViewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageSelected(int position) {
                mBottomNavView.getMenu().getItem(position).setChecked(true);
                disableLongTouch();
            }
        });
        BottomNavigationView.OnNavigationItemSelectedListener onNavigationItemSelectedListener
                = item -> {
            switch (item.getItemId()) {
                case R.id.navigation_first:
                    mViewPager2.setCurrentItem(0, false);
                    return true;
                case R.id.navigation_second:
                    mViewPager2.setCurrentItem(1, false);
                    return true;
                case R.id.navigation_third:
                    mViewPager2.setCurrentItem(2, false);
                    return true;
                default:
                    break;
            }
            return false;
        };
        mBottomNavView.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener);
//        mBottomNavView.getOrCreateBadge(R.id.navigation_first).setNumber(11);
        disableLongTouch();

    }

    @Override
    public void initView() {
        doPermission();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            moveTaskToBack(true);
        } else {
            return false;
        }
        return true;
    }

    @Override
    public void loadData() {

    }

    @Override
    public void launch() {
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setData(Uri.parse("package:" + getPackageName()));
        mSettingsLauncher.launch(intent);
    }

    /**
     * disable bottomView long touch popup
     */
    private void disableLongTouch() {
        mBottomNavView.getChildAt(0).findViewById(R.id.navigation_first).setOnLongClickListener(v -> true);
        mBottomNavView.getChildAt(0).findViewById(R.id.navigation_second).setOnLongClickListener(v -> true);
        mBottomNavView.getChildAt(0).findViewById(R.id.navigation_third).setOnLongClickListener(v -> true);
    }
}
  1. 问题

这个版本长按某一项的话会弹出popup窗口,经搜索和查找源代码,这样做能够去掉它,请搜索上述代码中的下面语句!

disableLongTouch
  1. 总结 在遇到问题的时候,可以快速通过搜索来解决问题,因为大家可能也遇见过这样的问题。如果没有合适的解决方案,可以通过查找代码来分析,实现自己的目标。

如果暂时不能给出解决方案的时候,可以放一放,在自己时间比较充裕的时候去做,这样好多问题就能够迎刃而解!

祝愿大家新年快乐,万事如意,工作顺利,恭喜发财,身体健康!!!

祝愿大家新年快乐,万事如意,工作顺利,恭喜发财,身体健康!!!

祝愿大家新年快乐,万事如意,工作顺利,恭喜发财,身体健康!!!