下面是一个实现三个底部菜单,每个菜单一个页面,可以横向滑动的示例的代码实现,包括XML页面文件、Java Activity代码以及目录大致结构,废话不多说,直接上代码:
目录结构:
```
- MainActivity.java
- MainPagerAdapter.java
- activity_main.xml
- fragment_one.xml
- fragment_two.xml
- fragment_three.xml
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/bottom_navigation_bar" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:menu="@menu/bottom_nav_menu"/>
</RelativeLayout>
fragment_two.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_two"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Fragment Two"/>
</LinearLayout>
fragment_three.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_three"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Fragment Three"/>
</LinearLayout>
MainActivity.java:
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ViewPager viewPager;
private BottomNavigationView bottomNavigationView;
private MainPagerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = findViewById(R.id.view_pager);
bottomNavigationView = findViewById(R.id.bottom_navigation_bar);
// 初始化ViewPager
initViewPager();
// 初始化BottomNavigationView
initBottomNavigationView();
}
/**
* 初始化ViewPager
*/
private void initViewPager() {
List<Fragment> fragments = new ArrayList<>();
fragments.add(new FragmentOne());
fragments.add(new FragmentTwo());
fragments.add(new FragmentThree());
adapter = new MainPagerAdapter(getSupportFragmentManager(), fragments);
viewPager.setAdapter(adapter);
}
/**
* 初始化BottomNavigationView
*/
private void initBottomNavigationView() {
bottomNavigationView.setOnNavigationItemSelectedListener(item -> {
switch (item.getItemId()) {
case R.id.menu_item_one:
viewPager.setCurrentItem(0, true);
break;
case R.id.menu_item_two:
viewPager.setCurrentItem(1, true);
break;
case R.id.menu_item_three:
viewPager.setCurrentItem(2, true);
break;
default:
break;
}
return true;
});
}
}
MainPagerAdapter.java:
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import java.util.List;
public class MainPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
public MainPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
}
这样就完成了一个实现三个底部菜单,每个菜单一个页面,可以横向滑动的Android页面的代码实现。
当然,如果你的每个页面不是普通的Activity,而是Fragment的话,你可能需要使用下面的代码:
首先需要绑定布局页面:
为了在 `FragmentTwo` 中绑定对应的布局页面,你需要重写 `onCreateView` 方法。该方法会在 Fragment 创建视图时被调用,可以在其中加载布局文件并返回对应的 `View` 对象。
public class FragmentTwo extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// 加载布局文件
View view = inflater.inflate(R.layout.fragment_two, container, false);
return view;
}
}
在上述代码中,我们通过 `inflater.inflate` 方法将布局文件 `fragment_two.xml` 加载为一个 `View` 对象,并将其返回作为该 Fragment 的视图。这样,该 Fragment 就会显示对应的布局页面了。
当然,如果需要在该布局页面中的控件中添加事件或者操作,可以在 `onCreateView` 方法中获取对应的控件对象并设置相应的事件监听器和数据。例如:
public class FragmentTwo extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// 加载布局文件
View view = inflater.inflate(R.layout.fragment_two, container, false);
// 找到 TextView 控件
TextView textView = view.findViewById(R.id.text_view);
// 设置文本内容
textView.setText("This is Fragment Two");
// 设置点击事件监听器
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// do something
}
});
return view;
}
}
如果你想实现:当滑动到某一个页面的同时,选中对应的底部菜单选项卡,需要在 `ViewPager` 中添加一个 `addOnPageChangeListener` 的监听器,并在监听器中设置选中相应的底部菜单项。具体步骤如下:
1. 首先在 `onCreate` 方法中获取 `ViewPager` 和 `BottomNavigationView` 控件,并设置 ViewPager 的适配器:
// 获取 ViewPager 和 BottomNavigationView 控件
ViewPager viewPager = findViewById(R.id.view_pager);
BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
// 设置 ViewPager 的适配器
PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(pagerAdapter);
2. 在 `ViewPager` 中添加一个 `addOnPageChangeListener` 监听器,实现在滑动页面时选中底部对应的菜单栏:
// 添加 ViewPager 的滑动监听器
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// do nothing
}
@Override
public void onPageSelected(int position) {
// 根据当前选中项设置对应的底部菜单栏项为选中状态
bottomNavigationView.getMenu().getItem(position).setChecked(true);
}
@Override
public void onPageScrollStateChanged(int state) {
// do nothing
}
});
在上述代码中,我们使用 `addOnPageChangeListener` 监听器来监听 `ViewPager` 页面的滑动事件。在 `onPageSelected` 方法中,我们根据当前选中的页面位置,选中对应的底部菜单栏项。这里需要注意的是,我们在 `PagerAdapter` 类中重写了 `getCount` 方法,返回了3所有页面的数量,因此菜单栏的项数也应该与之匹配。
3. 为底部菜单栏设置点击事件监听器,在点击时切换到相应的页面:
// 设置 BottomNavigationView 的菜单项选中事件监听器
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.navigation_home:
viewPager.setCurrentItem(0);
return true;
case R.id.navigation_dashboard:
viewPager.setCurrentItem(1);
return true;
case R.id.navigation_notifications:
viewPager.setCurrentItem(2);
return true;
}
return false;
}
});
在上述代码中,我们为 `BottomNavigationView` 设置了一个 `setOnNavigationItemSelectedListener` 的监听器,在监听器中根据菜单项的 ID 切换到相应的页面。这里需要注意的是,当你将当前选中的页面更改为另一个页面时,ViewPager 的 `addOnPageChangeListener` 监听器会自动调用并将底部菜单栏项选中。