• 组合控件——顶部导航栏——标签布局TabLayout


    ==========================================================================================

    布局:

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. xmlns:app="http://schemas.android.com/apk/res-auto"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:orientation="vertical">
    6. <androidx.appcompat.widget.Toolbar
    7. android:id="@+id/tl_head"
    8. android:layout_width="match_parent"
    9. android:layout_height="50dp"
    10. app:navigationIcon="@drawable/ic_back">
    11. <!-- 注意TabLayout节点需要使用完整路径 -->
    12. <com.google.android.material.tabs.TabLayout
    13. android:id="@+id/tab_title"
    14. android:layout_width="wrap_content"
    15. android:layout_height="match_parent"
    16. android:layout_centerInParent="true"
    17. app:tabIndicatorColor="@color/red"
    18. app:tabIndicatorHeight="2dp"
    19. app:tabSelectedTextColor="@color/red"
    20. app:tabTextColor="@color/grey"
    21. app:tabTextAppearance="@style/TabText" />
    22. </androidx.appcompat.widget.Toolbar>
    23. <View
    24. android:layout_width="match_parent"
    25. android:layout_height="1dp"
    26. android:background="@color/grey" />
    27. <androidx.viewpager.widget.ViewPager
    28. android:id="@+id/vp_content"
    29. android:layout_width="match_parent"
    30. android:layout_height="match_parent" />
    31. </LinearLayout>

    1. <resources>
    2. <!-- Base application theme. -->
    3. <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    4. <!-- Customize your theme here. -->
    5. <item name="colorPrimary">@color/colorPrimary</item>
    6. <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    7. <item name="colorAccent">@color/colorAccent</item>
    8. </style>
    9. <!-- <style name="AppCompatTheme" parent="Theme.AppCompat.Light.NoActionBar">-->
    10. <!-- </style>-->
    11. <style name="TabButton">
    12. <item name="android:layout_width">0dp</item>
    13. <item name="android:layout_height">match_parent</item>
    14. <item name="android:layout_weight">1</item>
    15. <item name="android:padding">5dp</item>
    16. <item name="android:gravity">center</item>
    17. <item name="android:background">@drawable/tab_bg_selector</item>
    18. <item name="android:textSize">12sp</item>
    19. <item name="android:textColor">@drawable/tab_text_selector</item>
    20. <item name="android:button">@null</item>
    21. </style>
    22. <style name="TabText">
    23. <item name="android:layout_width">match_parent</item>
    24. <item name="android:layout_height">match_parent</item>
    25. <item name="android:gravity">center</item>
    26. <item name="android:textSize">17sp</item>
    27. <item name="android:textColor">@drawable/toolbar_text_selector</item>
    28. </style>
    29. </resources>

    1. <selector xmlns:android="http://schemas.android.com/apk/res/android">
    2. <item android:state_selected="true" android:color="@color/red" />
    3. <item android:color="@color/grey" />
    4. </selector>

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <resources>
    3. <color name="colorPrimary">#008577</color>
    4. <color name="colorPrimaryDark">#00574B</color>
    5. <color name="colorAccent">#D81B60</color>
    6. <color name="black">#000000</color>
    7. <color name="white">#ffffff</color>
    8. <color name="purple_200">#FFBB86FC</color>
    9. <color name="purple_500">#FF6200EE</color>
    10. <color name="purple_700">#FF3700B3</color>
    11. <color name="teal_200">#FF03DAC5</color>
    12. <color name="teal_700">#FF018786</color>
    13. <color name="tab_text_selected">#0084e8</color>
    14. <color name="tab_text_normal">#7597b3</color>
    15. <color name="blue_light">#aaaaff</color>
    16. <color name="grey">#888888</color>
    17. <color name="red">#ff0000</color>
    18. </resources>

    1. <resources>
    2. <string name="app_name">My Application</string>
    3. <string name="title_activity_main2">MainActivity2</string>
    4. <string name="title_home">Home</string>
    5. <string name="title_dashboard">Dashboard</string>
    6. <string name="title_notifications">Notifications</string>
    7. <string name="title_activity_main3">MainActivity3</string>
    8. <string name="title_activity_main4">MainActivity4</string>
    9. <string name="title_activity_main5">MainActivity5</string>
    10. <string name="menu_first">首页</string>
    11. <string name="menu_second">分类</string>
    12. <string name="menu_third">购物车</string>
    13. <string name="book_name">Android Studio开发实战\n从零基础到App上线</string>
    14. </resources>

    1. package com.example.myapplication.fragment;
    2. import android.content.Context;
    3. import android.os.Bundle;
    4. import android.view.LayoutInflater;
    5. import android.view.View;
    6. import android.view.ViewGroup;
    7. import androidx.fragment.app.Fragment;
    8. import com.example.myapplication.R;
    9. public class BookDetailFragment extends Fragment
    10. {
    11. protected View mView; // 声明一个视图对象
    12. protected Context mContext; // 声明一个上下文对象
    13. @Override
    14. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    15. {
    16. mContext = getActivity(); // 获取活动页面的上下文
    17. // 根据布局文件fragment_book_detail.xml生成视图对象
    18. mView = inflater.inflate(R.layout.fragment_book_detail, container, false);
    19. return mView;
    20. }
    21. }

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. android:layout_width="match_parent"
    3. android:layout_height="match_parent"
    4. android:orientation="vertical">
    5. <ImageView
    6. android:id="@+id/iv_book_detail"
    7. android:layout_width="match_parent"
    8. android:layout_height="360dp"
    9. android:layout_marginTop="5dp"
    10. android:scaleType="fitCenter"
    11. android:src="@drawable/book_detail" />
    12. <TextView
    13. android:id="@+id/tv_book_detail"
    14. android:layout_width="match_parent"
    15. android:layout_height="wrap_content"
    16. android:layout_marginTop="0dp"
    17. android:gravity="center"
    18. android:text="@string/book_name"
    19. android:textColor="@color/black"
    20. android:textSize="20sp" />
    21. </LinearLayout>

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. android:layout_width="match_parent"
    3. android:layout_height="match_parent"
    4. android:orientation="vertical">
    5. <ImageView
    6. android:id="@+id/iv_book_cover"
    7. android:layout_width="match_parent"
    8. android:layout_height="360dp"
    9. android:layout_marginTop="5dp"
    10. android:scaleType="fitCenter"
    11. android:src="@drawable/book_cover" />
    12. <TextView
    13. android:id="@+id/tv_book_cover"
    14. android:layout_width="match_parent"
    15. android:layout_height="wrap_content"
    16. android:layout_marginTop="0dp"
    17. android:gravity="center"
    18. android:text="@string/book_name"
    19. android:textColor="@color/black"
    20. android:textSize="20sp" />
    21. </LinearLayout>

    1. package com.example.myapplication.fragment;
    2. import android.content.Context;
    3. import android.os.Bundle;
    4. import android.view.LayoutInflater;
    5. import android.view.View;
    6. import android.view.ViewGroup;
    7. import androidx.fragment.app.Fragment;
    8. import com.example.myapplication.R;
    9. public class BookCoverFragment extends Fragment
    10. {
    11. protected View mView; // 声明一个视图对象
    12. protected Context mContext; // 声明一个上下文对象
    13. @Override
    14. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    15. {
    16. mContext = getActivity(); // 获取活动页面的上下文
    17. // 根据布局文件fragment_book_cover.xml生成视图对象
    18. mView = inflater.inflate(R.layout.fragment_book_cover, container, false);
    19. return mView;
    20. }
    21. }

    1. package com.example.myapplication.adapter;
    2. import androidx.fragment.app.Fragment;
    3. import androidx.fragment.app.FragmentManager;
    4. import androidx.fragment.app.FragmentPagerAdapter;
    5. import com.example.myapplication.fragment.BookCoverFragment;
    6. import com.example.myapplication.fragment.BookDetailFragment;
    7. public class GoodsPagerAdapter extends FragmentPagerAdapter {
    8. private String[] mTitleArray; // 声明一个标题文字数组
    9. // 碎片页适配器的构造方法,传入碎片管理器与标题列表
    10. public GoodsPagerAdapter(FragmentManager fm, String[] titleArray) {
    11. super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
    12. mTitleArray = titleArray;
    13. }
    14. // 获取指定位置的碎片Fragment
    15. public Fragment getItem(int position) {
    16. if (position == 0) { // 第一页展示书籍封面
    17. return new BookCoverFragment();
    18. } else if (position == 1) { // 第二页展示书籍详情
    19. return new BookDetailFragment();
    20. }
    21. return new BookCoverFragment();
    22. }
    23. // 获取碎片Fragment的个数
    24. public int getCount() {
    25. return mTitleArray.length;
    26. }
    27. // 获得指定碎片页的标题文本
    28. public CharSequence getPageTitle(int position) {
    29. return mTitleArray[position];
    30. }
    31. }

    1. <menu xmlns:android="http://schemas.android.com/apk/res/android"
    2. xmlns:app="http://schemas.android.com/apk/res-auto" >
    3. <item
    4. android:id="@+id/menu_refresh"
    5. android:icon="@drawable/ic_refresh"
    6. app:showAsAction="ifRoom"
    7. android:title="刷新"/>
    8. <item
    9. android:id="@+id/menu_about"
    10. android:icon="@drawable/ic_about"
    11. app:showAsAction="never"
    12. android:title="关于"/>
    13. <item
    14. android:id="@+id/menu_quit"
    15. android:icon="@drawable/ic_quit"
    16. app:showAsAction="never"
    17. android:title="退出"/>
    18. </menu>

    1. package com.example.myapplication;
    2. import android.annotation.SuppressLint;
    3. import android.os.Bundle;
    4. import android.view.Menu;
    5. import android.view.MenuItem;
    6. import android.widget.Toast;
    7. import androidx.appcompat.app.AppCompatActivity;
    8. import androidx.appcompat.widget.Toolbar;
    9. import androidx.viewpager.widget.ViewPager;
    10. import com.example.myapplication.adapter.GoodsPagerAdapter;
    11. import com.example.myapplication.widget.DateUtil;
    12. import com.google.android.material.tabs.TabLayout;
    13. @SuppressLint("SetTextI18n")
    14. public class MainActivity extends AppCompatActivity implements TabLayout.OnTabSelectedListener
    15. {
    16. private final static String TAG = "TabLayoutActivity";
    17. private ViewPager vp_content; // 声明一个翻页视图对象
    18. private TabLayout tab_title; // 声明一个标签布局对象
    19. private String[] mTitleArray = {"商品", "详情"}; // 标题文字数组
    20. @Override
    21. protected void onCreate(Bundle savedInstanceState)
    22. {
    23. super.onCreate(savedInstanceState);
    24. setContentView(R.layout.activity_main);
    25. Toolbar tl_head = findViewById(R.id.tl_head); // 从布局文件中获取名叫tl_head的工具栏
    26. tl_head.setTitle(""); // 设置工具栏的标题文本
    27. tab_title = findViewById(R.id.tab_title); // 从布局文件中获取名叫tab_title的标签布局
    28. vp_content = findViewById(R.id.vp_content); // 从布局文件中获取名叫vp_content的翻页视图
    29. initTabLayout(); // 初始化标签布局
    30. initTabViewPager(); // 初始化标签翻页
    31. }
    32. // 初始化标签布局
    33. private void initTabLayout() {
    34. // 给标签布局添加一个文字标签
    35. tab_title.addTab(tab_title.newTab().setText(mTitleArray[0]));
    36. // 给标签布局添加一个文字标签
    37. tab_title.addTab(tab_title.newTab().setText(mTitleArray[1]));
    38. tab_title.addOnTabSelectedListener(this); // 给标签布局添加标签选中监听器
    39. // 监听器ViewPagerOnTabSelectedListener允许直接关联某个翻页视图
    40. //tab_title.addOnTabSelectedListener(new ViewPagerOnTabSelectedListener(vp_content));
    41. }
    42. // 初始化标签翻页
    43. private void initTabViewPager() {
    44. // 构建一个商品信息的翻页适配器
    45. GoodsPagerAdapter adapter = new GoodsPagerAdapter(
    46. getSupportFragmentManager(), mTitleArray);
    47. vp_content.setAdapter(adapter); // 设置翻页视图的适配器
    48. // 给vp_content添加页面变更监听器
    49. vp_content.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
    50. @Override
    51. public void onPageSelected(int position) {
    52. tab_title.getTabAt(position).select(); // 选中指定位置的标签
    53. }
    54. });
    55. }
    56. // 在标签被重复选中时触发
    57. public void onTabReselected(TabLayout.Tab tab) {}
    58. // 在标签选中时触发
    59. public void onTabSelected(TabLayout.Tab tab) {
    60. vp_content.setCurrentItem(tab.getPosition()); // 设置翻页视图显示第几页
    61. }
    62. // 在标签取消选中时触发
    63. public void onTabUnselected(TabLayout.Tab tab) {}
    64. @Override
    65. public boolean onCreateOptionsMenu(Menu menu) {
    66. // 从menu_overflow.xml中构建菜单界面布局
    67. getMenuInflater().inflate(R.menu.menu_overflow, menu);
    68. return true;
    69. }
    70. @Override
    71. public boolean onOptionsItemSelected(MenuItem item) {
    72. int id = item.getItemId();
    73. if (id == android.R.id.home) { // 点击了工具栏左边的返回箭头
    74. finish(); // 结束当前页面
    75. } else if (id == R.id.menu_refresh) { // 点击了刷新图标
    76. Toast.makeText(this, "当前刷新时间: " + DateUtil.getNowDateTime("yyyy-MM-dd HH:mm:ss")
    77. , Toast.LENGTH_LONG).show();
    78. return true;
    79. } else if (id == R.id.menu_about) { // 点击了关于菜单项
    80. Toast.makeText(this, "这个是标签布局的演示demo", Toast.LENGTH_LONG).show();
    81. return true;
    82. } else if (id == R.id.menu_quit) { // 点击了退出菜单项
    83. finish(); // 结束当前页面
    84. }
    85. return super.onOptionsItemSelected(item);
    86. }
    87. }

     

     

     

     

     

  • 相关阅读:
    代码随想录算法训练营第十一天| 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值
    SVN服务数据迁移(windows)
    最常见的Java面试题【杭州多测师_王sir】【杭州多测师】
    《Java》图书管理系统
    多头注意力机制的计算流、代码解析
    突发!OpenAI停止不支持国家API,7月9日开始执行
    centos7安装配置以及Linux常用命令
    231.2的幂
    第二课:使用C++实现视频去水印
    批量自动付款(京东)
  • 原文地址:https://blog.csdn.net/m0_61442607/article/details/126693674