Android导航栏与侧边栏实现(TabLayout+Viewpager2+DrawerLayout) ...

打印 上一主题 下一主题

主题 858|帖子 858|积分 2574

想要做的效果


目前效果,图标巨细还不太匹配,后续会再更改一下


拆解分析
1导航栏 tablayout+viewpgaer+fragment
下面参考中已写得非常好,不再赘述。
参考
https://blog.csdn.net/W41ted/article/details/123571731
2侧边栏 drawerLayout+toolbar
参考
https://github.com/Li-Xiang-Lan/AndroidSidebar-master
https://blog.csdn.net/cdhahaha/article/details/70208860
图标均来自阿里,可自行查找 https://www.iconfont.cn/
下面是具体实现
1 activity_main xml

主结构为DrawerLayout,用两个FrameLayout分别装载主页内容(导航栏)和侧边栏内容
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.drawerlayout.widget.DrawerLayout
  3.     xmlns:android="http://schemas.android.com/apk/res/android"
  4.     android:id="@+id/drawer_layout"
  5.     android:fitsSystemWindows="true"
  6.     android:layout_width="match_parent"
  7.     android:layout_height="match_parent">
  8.     <!--主页内容-->
  9.     <FrameLayout
  10.         android:id="@+id/content_frame"
  11.         android:layout_width="match_parent"
  12.         android:layout_height="match_parent">
  13.         <include layout="@layout/activity_content"/>
  14.     </FrameLayout>
  15.     <!--侧边栏内容-->
  16.     <FrameLayout
  17.         android:id="@+id/menu_frame"
  18.         android:layout_width="match_parent"
  19.         android:layout_height="match_parent"
  20.         android:layout_gravity="start">
  21.         <include layout="@layout/left_menu"/>
  22.     </FrameLayout>
  23. </androidx.drawerlayout.widget.DrawerLayout>
复制代码
2 activity_content xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout
  3.     xmlns:android="http://schemas.android.com/apk/res/android"
  4.     xmlns:app="http://schemas.android.com/apk/res-auto"
  5.     xmlns:tools="http://schemas.android.com/tools"
  6.     android:layout_width="match_parent"
  7.     android:layout_height="match_parent"
  8.     android:orientation="vertical">
  9.     <!--模拟状态栏占位-->
  10.     <View
  11.         android:id="@+id/view_statusbar"
  12.         android:layout_width="match_parent"
  13.         android:layout_height="1dp"
  14.         android:orientation="horizontal"
  15.         app:layout_constraintTop_toTopOf="parent"/>
  16.     <LinearLayout
  17.         android:layout_width="match_parent"
  18.         android:layout_height="match_parent"
  19.         android:orientation="vertical">
  20.     <LinearLayout
  21.         android:layout_width="match_parent"
  22.         android:layout_height="wrap_content"
  23.         android:background="@color/white"
  24.         android:weightSum="8"
  25.         android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
  26.         tools:ignore="MissingConstraints">
  27.     <!--与drawerlayout配合实现更换图标等功能-->
  28.     <androidx.appcompat.widget.Toolbar
  29.         android:layout_weight="1"
  30.         android:id="@+id/toolbar"
  31.         android:layout_width="0dp"
  32.         android:layout_height="?actionBarSize"
  33.         app:layout_constraintTop_toBottomOf="@+id/view_statusbar"
  34.         app:subtitleTextColor="@android:color/white"
  35.         app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
  36.         app:title=" "
  37.         app:titleTextColor="@android:color/white">
  38.     </androidx.appcompat.widget.Toolbar>
  39.         <com.google.android.material.tabs.TabLayout
  40.             android:layout_weight="6"
  41.             android:id="@+id/tab_layout"
  42.             android:layout_width="0dp"
  43.             android:layout_height="wrap_content"
  44.             app:tabIndicatorHeight="0dp"
  45.             app:tabBackground="@color/transparent"
  46.             app:tabRippleColor="@color/transparent"
  47.             app:tabMode="fixed"
  48.             app:tabGravity="fill">
  49.             <com.google.android.material.tabs.TabItem
  50.                 android:id="@+id/item_music"
  51.                 android:layout_width="wrap_content"
  52.                 android:layout_height="wrap_content">
  53.             </com.google.android.material.tabs.TabItem>
  54.             <com.google.android.material.tabs.TabItem
  55.                 android:layout_width="wrap_content"
  56.                 android:layout_height="wrap_content">
  57.             </com.google.android.material.tabs.TabItem>
  58.             <com.google.android.material.tabs.TabItem
  59.                 android:layout_width="wrap_content"
  60.                 android:layout_height="wrap_content">
  61.             </com.google.android.material.tabs.TabItem>
  62.         </com.google.android.material.tabs.TabLayout>
  63.         <ImageView
  64.             android:layout_weight="1"
  65.             android:layout_width="0dp"
  66.             android:layout_height="wrap_content"
  67.             android:layout_gravity="center"
  68.             android:src="@drawable/search"></ImageView>
  69.     </LinearLayout>
  70.     <TextView
  71.         android:layout_width="wrap_content"
  72.         android:layout_height="wrap_content"
  73.         android:text="主页内容"
  74.         app:layout_constraintBottom_toBottomOf="parent"
  75.         app:layout_constraintLeft_toLeftOf="parent"
  76.         app:layout_constraintRight_toRightOf="parent"
  77.         app:layout_constraintTop_toTopOf="parent"/>
  78.     <androidx.viewpager2.widget.ViewPager2
  79.         android:id="@+id/viewpager2"
  80.         android:layout_width="match_parent"
  81.         android:layout_height="match_parent">
  82.     </androidx.viewpager2.widget.ViewPager2>
  83.     </LinearLayout>
  84. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
3 left_menu xml 侧边栏内容

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout
  3.     xmlns:android="http://schemas.android.com/apk/res/android"
  4.     xmlns:app="http://schemas.android.com/apk/res-auto"
  5.     xmlns:tools="http://schemas.android.com/tools"
  6.     android:layout_width="match_parent"
  7.     android:layout_height="match_parent"
  8.     android:background="@android:color/white">
  9.     <androidx.constraintlayout.widget.ConstraintLayout
  10.         android:id="@+id/cl_head_view"
  11.         android:layout_width="match_parent"
  12.         android:layout_height="150dp"
  13.         tools:ignore="MissingConstraints">
  14.         <androidx.appcompat.widget.AppCompatImageView
  15.             android:id="@+id/iv_head"
  16.             android:layout_width="60dp"
  17.             android:layout_height="60dp"
  18.             android:src="@drawable/test1"
  19.             app:layout_constraintBottom_toBottomOf="parent"
  20.             app:layout_constraintLeft_toLeftOf="parent"
  21.             app:layout_constraintRight_toRightOf="parent"
  22.             app:layout_constraintTop_toTopOf="parent"/>
  23.         <TextView
  24.             android:layout_width="wrap_content"
  25.             android:layout_height="wrap_content"
  26.             android:layout_marginBottom="10dp"
  27.             android:text="@string/User"
  28.             android:textColor="@android:color/black"
  29.             app:layout_constraintBottom_toBottomOf="parent"
  30.             app:layout_constraintLeft_toLeftOf="parent"
  31.             app:layout_constraintRight_toRightOf="parent"
  32.             app:layout_constraintTop_toBottomOf="@+id/iv_head"/>
  33.     </androidx.constraintlayout.widget.ConstraintLayout>
  34.     <LinearLayout
  35.         android:id="@+id/ll_android"
  36.         android:layout_width="match_parent"
  37.         android:layout_height="wrap_content"
  38.         android:gravity="center_vertical"
  39.         android:orientation="horizontal"
  40.         android:padding="10dp"
  41.         app:layout_constraintTop_toBottomOf="@+id/cl_head_view">
  42.         <TextView
  43.             android:layout_width="wrap_content"
  44.             android:layout_height="wrap_content"
  45.             android:drawablePadding="10dp"
  46.             android:gravity="center"
  47.             android:text="随机内容1"/>
  48.     </LinearLayout>
  49.     <LinearLayout
  50.         android:id="@+id/ll_apple"
  51.         android:layout_width="match_parent"
  52.         android:layout_height="wrap_content"
  53.         android:layout_marginTop="10dp"
  54.         android:orientation="horizontal"
  55.         android:padding="10dp"
  56.         app:layout_constraintTop_toBottomOf="@+id/ll_android">
  57.         <TextView
  58.             android:layout_width="wrap_content"
  59.             android:layout_height="wrap_content"
  60.             android:drawablePadding="10dp"
  61.             android:gravity="center"
  62.             android:text="随机内容2"/>
  63.     </LinearLayout>
  64.     <LinearLayout
  65.         android:layout_width="match_parent"
  66.         android:layout_height="wrap_content"
  67.         android:layout_marginTop="10dp"
  68.         android:orientation="horizontal"
  69.         android:padding="10dp"
  70.         app:layout_constraintTop_toBottomOf="@+id/ll_apple">
  71.         <TextView
  72.             android:layout_width="wrap_content"
  73.             android:layout_height="wrap_content"
  74.             android:drawablePadding="10dp"
  75.             android:gravity="center"
  76.             android:text="随机内容3"/>
  77.     </LinearLayout>
  78. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
4 MainActivity java

  1. import androidx.annotation.NonNull;
  2. import androidx.appcompat.app.ActionBarDrawerToggle;
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import androidx.appcompat.widget.Toolbar;
  5. import androidx.constraintlayout.widget.ConstraintLayout;
  6. import androidx.core.view.GravityCompat;
  7. import androidx.drawerlayout.widget.DrawerLayout;
  8. import androidx.viewpager2.widget.ViewPager2;
  9. import android.os.Bundle;
  10. import android.view.View;
  11. import com.blueshark.bsplayer.R;
  12. import com.blueshark.bsplayer.util.ScreenInfoUtils;
  13. import com.google.android.material.tabs.TabLayout;
  14. import com.google.android.material.tabs.TabLayoutMediator;
  15. import com.nineoldandroids.view.ViewHelper;
  16. public class MainActivity extends AppCompatActivity {
  17.     private TabLayout tabLayout;
  18.     private ViewPager2 viewPager2;
  19.     @Override
  20.     protected void onCreate(Bundle savedInstanceState) {
  21.         super.onCreate(savedInstanceState);
  22.         //初始化布局
  23.         setContentView(R.layout.activity_main);
  24.         //初始化侧边栏
  25.         initsidebar();
  26.         //初始化主页内容
  27.         initcontent();
  28.     }
  29.     private void initsidebar() {
  30.         //隐藏状态栏时,获取状态栏高度
  31.         int statusBarHeight = ScreenInfoUtils.getStatusBarHeight(this);
  32.         //隐藏状态栏
  33.         ScreenInfoUtils.fullScreen(this);
  34.         //初始化状态栏的高度
  35.         View statusbar = (View) findViewById(R.id.view_statusbar);
  36.         ConstraintLayout.LayoutParams params = new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.MATCH_PARENT, statusBarHeight);
  37.         statusbar.setLayoutParams(params);
  38.         Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  39.         final DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
  40.         setSupportActionBar(toolbar);//将toolbar与ActionBar关联
  41.         ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
  42.                 this, drawerLayout, toolbar, 0, 0);
  43.         //设置侧边栏图标
  44.         toggle.setDrawerIndicatorEnabled(false);
  45.         toolbar.setNavigationIcon(R.drawable.user);
  46.         //设置图标后点击事件会消失,重新设置点击事件
  47.         toolbar.setNavigationOnClickListener(new View.OnClickListener() {
  48.             @Override
  49.             public void onClick(View view) {
  50.                 drawerLayout.openDrawer(GravityCompat.START);
  51.             }
  52.         });
  53.         drawerLayout.addDrawerListener(toggle);//初始化状态
  54.         toggle.syncState();
  55.         //蒙层颜色
  56.         drawerLayout.setScrimColor(getResources().getColor(R.color.slidegray));
  57.         drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
  58.             @Override
  59.             public void onDrawerStateChanged(int newState) {
  60.             }
  61.             @Override
  62.             public void onDrawerSlide(@NonNull View drawerView, float slideOffset) {
  63.                 View mContent = drawerLayout.getChildAt(0);
  64.                 View mMenu = drawerView;
  65.                 ViewHelper.setTranslationX(mContent, mMenu.getMeasuredWidth() * slideOffset);
  66.             }
  67.             @Override
  68.             public void onDrawerOpened(@NonNull View drawerView) {
  69.             }
  70.             @Override
  71.             public void onDrawerClosed(@NonNull View drawerView) {
  72.             }
  73.         });
  74.     }
  75.     final String[] titleArray = new String[]{"测试1", "测试2", "测试3"};
  76.     final int[] titleItem = new int[]{R.drawable.ic_test,R.drawable.ic_test,R.drawable.ic_test};
  77.     private void initcontent() {
  78.         tabLayout = findViewById(R.id.tab_layout);
  79.         viewPager2 = findViewById(R.id.viewpager2);
  80.         OuterPagerAdapter outerPagerAdapter = new OuterPagerAdapter(this);
  81.         viewPager2.setAdapter(outerPagerAdapter);
  82.         //TabLayout 和 Viewpager2 关联
  83.         TabLayoutMediator tab = new TabLayoutMediator(tabLayout, viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {
  84.             @Override
  85.             public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
  86.             //若settext会在图标下方出现文字
  87. //                tab.setText(titleArray[position]);
  88.                 tab.setIcon(titleItem[position]);
  89.             }
  90.         });
  91.         tab.attach();
  92.     }
  93. }
复制代码
OuterPagerAdapter 和 DynamicFragment 都写得比较简朴,可以根据需求自行扩充
5 OuterPagerAdapter java

  1. import androidx.annotation.NonNull;
  2. import androidx.fragment.app.Fragment;
  3. import androidx.fragment.app.FragmentActivity;
  4. import androidx.viewpager2.adapter.FragmentStateAdapter;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. public class OuterPagerAdapter extends FragmentStateAdapter {
  8.     private final List<Fragment> fragments = new ArrayList<>();
  9.     public OuterPagerAdapter(@NonNull FragmentActivity fragmentActivity) {
  10.         super(fragmentActivity);
  11.         fragments.add(new DynamicFragment());
  12.         fragments.add(new DynamicFragment());
  13.         fragments.add(new DynamicFragment());
  14.     }
  15.     @NonNull
  16.     @Override
  17.     public Fragment createFragment(int position) {
  18.         return fragments.get(position);
  19.     }
  20.     @Override
  21.     public int getItemCount() {
  22.         return fragments.size();
  23.     }
  24. }
复制代码
6 DynamicFragment java

xml只有一个textview,就不再贴了
  1. import android.os.Bundle;
  2. import android.os.Handler;
  3. import android.view.LayoutInflater;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. import androidx.annotation.NonNull;
  7. import androidx.annotation.Nullable;
  8. import androidx.fragment.app.Fragment;
  9. public class DynamicFragment extends Fragment {
  10.     public static DynamicFragment newInstance(String title) {
  11.         DynamicFragment fragment = new DynamicFragment();
  12.         return fragment;
  13.     }
  14.     @Nullable
  15.     @Override
  16.     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  17.         View view = inflater.inflate(R.layout.fragment_dynamic, container, false);
  18.         return view;
  19.     }
  20. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表