需要全部源码请点赞关注收藏后评论区留言~~~
一、工具栏Toolbar
主流App除了底部有一排标签栏之外,通常顶部还有一排导航栏,它之前用的是ActionBar这个控件,但是它不太灵活,于是又推出了Toolbar工具栏,用于取代它
为了兼容之前的系统版本,ActionBar依然保留,所以使用Toolbar的时候要先关闭ActionBar才可以
Toolbar之所以比ActionBar灵活,是因为它提供了多个属性
运行效果如下
代码如下
Java类
package com.example.chapter12; import android.graphics.Color; import android.os.Bundle; import android.view.View; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; public class ToolbarActivity extends AppCompatActivity { private final static String TAG = "ToolbarActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_toolbar); Toolbar tl_head = findViewById(R.id.tl_head); // 从布局文件中获取名叫tl_head的工具栏 tl_head.setTitle("工具栏页面"); // 设置工具栏的标题文本 setSupportActionBar(tl_head); // 使用tl_head替换系统自带的ActionBar tl_head.setTitleTextColor(Color.RED); // 设置工具栏的标题文字颜色 tl_head.setLogo(R.drawable.ic_app); // 设置工具栏的标志图片 tl_head.setSubtitle("Toolbar"); // 设置工具栏的副标题文本 tl_head.setSubtitleTextColor(Color.YELLOW); // 设置工具栏的副标题文字颜色 tl_head.setBackgroundResource(R.color.blue_light); // 设置工具栏的背景 tl_head.setNavigationIcon(R.drawable.ic_back); // 设置工具栏左边的导航图标 // 给tl_head设置导航图标的点击监听器 // setNavigationOnClickListener必须放到setSupportActionBar之后,不然不起作用 tl_head.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { finish(); // 结束当前页面 } }); } }
XML文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <androidx.appcompat.widget.Toolbar android:id="@+id/tl_head" android:layout_width="match_parent" android:layout_height="wrap_content" /> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="vertical" android:padding="5dp"> <TextView android:id="@+id/tv_desc" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/black" android:textSize="17sp" android:text="该页面演示工具栏功能" /> </LinearLayout> </LinearLayout>
二、溢出菜单OverflowMenu
导航栏右边往往有个3点图标,点击后会在界面右上角弹出菜单。意思是导航栏不够放,溢出来了不过溢出菜单多了个app:showAsAction属性 展示位置属性如下
1:always 总是在导航栏上显示菜单图标
2:ifRoom 如果导航栏右边有控件,该项就显示在导航栏上 不再放入溢出菜单
3:never 从不在导航栏上直接显示 总是放在溢出菜单列表里面
4:withText 如果能在导航栏上显示 除了显示图标 还要显示该菜单项的文字说明
效果如下
代码如下
Java类
package com.example.chapter12; import android.annotation.SuppressLint; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import com.example.chapter12.util.DateUtil; @SuppressLint("SetTextI18n") public class OverflowMenuActivity extends AppCompatActivity { private TextView tv_desc; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_overflow_menu); Toolbar tl_head = findViewById(R.id.tl_head); // 从布局文件中获取名叫tl_head的工具栏 tl_head.setTitle("溢出菜单页面"); // 设置工具栏的标题文字 setSupportActionBar(tl_head); // 使用tl_head替换系统自带的ActionBar tv_desc = findViewById(R.id.tv_desc); } @Override public boolean onCreateOptionsMenu(Menu menu) { // 从menu_overflow.xml中构建菜单界面布局 getMenuInflater().inflate(R.menu.menu_overflow, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); // 获取菜单项的编号 if (id == android.R.id.home) { // 点击了工具栏左边的返回箭头 finish(); // 结束当前页面 } else if (id == R.id.menu_refresh) { // 点击了刷新图标 tv_desc.setText("当前刷新时间: " + DateUtil.getNowTime()); } else if (id == R.id.menu_about) { // 点击了关于菜单项 Toast.makeText(this, "这个是工具栏的演示demo", Toast.LENGTH_LONG).show(); } else if (id == R.id.menu_quit) { // 点击了退出菜单项 finish(); // 结束当前页面 } return super.onOptionsItemSelected(item); } }
XML文件
<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.appcompat.widget.Toolbar android:id="@+id/tl_head" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/blue_light" app:navigationIcon="@drawable/ic_back" /> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="vertical" android:padding="5dp"> <TextView android:id="@+id/tv_desc" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/black" android:textSize="17sp" android:text="该页面演示溢出菜单功能" /> </LinearLayout> </LinearLayout>
三、标签布局TabLayout
TabLayout的展现形式类似于PagerTabStrip,同样是文字标签带下划线,不同的前者可以允许定制更丰富的样式 它新增的样式主要有以下六种
1:tabBackground 指定背景
2:tabIndicatorColor 指定颜色
3:tabIndicatorHeight 指定高度
4:tabTextColor 指定文字颜色
5:tabTextAppearance 指定文字风格
6:tabSelectedTextColor 指定选中文字颜色
效果如下
实现了京东App的标签导航栏,点击详情可以切换到商品的详情页面
代码如下
Java类
package com.example.chapter12; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.viewpager.widget.ViewPager; import androidx.viewpager.widget.ViewPager.SimpleOnPageChangeListener; import com.example.chapter12.adapter.GoodsPagerAdapter; import com.example.chapter12.util.DateUtil; import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayout.OnTabSelectedListener; import com.google.android.material.tabs.TabLayout.Tab; import com.google.android.material.tabs.TabLayout.ViewPagerOnTabSelectedListener; public class TabLayoutActivity extends AppCompatActivity implements OnTabSelectedListener { private final static String TAG = "TabLayoutActivity"; private ViewPager vp_content; // 声明一个翻页视图对象 private TabLayout tab_title; // 声明一个标签布局对象 private String[] mTitleArray = {"商品", "详情"}; // 标题文字数组 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_tab_layout); Toolbar tl_head = findViewById(R.id.tl_head); // 从布局文件中获取名叫tl_head的工具栏 tl_head.setTitle(""); // 设置工具栏的标题文本 setSupportActionBar(tl_head); // 使用tl_head替换系统自带的ActionBar tab_title = findViewById(R.id.tab_title); // 从布局文件中获取名叫tab_title的标签布局 vp_content = findViewById(R.id.vp_content); // 从布局文件中获取名叫vp_content的翻页视图 initTabLayout(); // 初始化标签布局 initTabViewPager(); // 初始化标签翻页 } // 初始化标签布局 private void initTabLayout() { // 给标签布局添加一个文字标签 tab_title.addTab(tab_title.newTab().setText(mTitleArray[0])); // 给标签布局添加一个文字标签 tab_title.addTab(tab_title.newTab().setText(mTitleArray[1])); tab_title.addOnTabSelectedListener(this); // 给标签布局添加标签选中监听器 // 监听器ViewPagerOnTabSelectedListener允许直接关联某个翻页视图 //tab_title.addOnTabSelectedListener(new ViewPagerOnTabSelectedListener(vp_content)); } // 初始化标签翻页 private void initTabViewPager() { // 构建一个商品信息的翻页适配器 GoodsPagerAdapter adapter = new GoodsPagerAdapter( getSupportFragmentManager(), mTitleArray); vp_content.setAdapter(adapter); // 设置翻页视图的适配器 // 给vp_content添加页面变更监听器 vp_content.addOnPageChangeListener(new SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { tab_title.getTabAt(position).select(); // 选中指定位置的标签 } }); } // 在标签被重复选中时触发 public void onTabReselected(Tab tab) {} // 在标签选中时触发 public void onTabSelected(Tab tab) { vp_content.setCurrentItem(tab.getPosition()); // 设置翻页视图显示第几页 } // 在标签取消选中时触发 public void onTabUnselected(Tab tab) {} @Override public boolean onCreateOptionsMenu(Menu menu) { // 从menu_overflow.xml中构建菜单界面布局 getMenuInflater().inflate(R.menu.menu_overflow, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { // 点击了工具栏左边的返回箭头 finish(); // 结束当前页面 } else if (id == R.id.menu_refresh) { // 点击了刷新图标 Toast.makeText(this, "当前刷新时间: " + DateUtil.getNowDateTime("yyyy-MM-dd HH:mm:ss") , Toast.LENGTH_LONG).show(); return true; } else if (id == R.id.menu_about) { // 点击了关于菜单项 Toast.makeText(this, "这个是标签布局的演示demo", Toast.LENGTH_LONG).show(); return true; } else if (id == R.id.menu_quit) { // 点击了退出菜单项 finish(); // 结束当前页面 } return super.onOptionsItemSelected(item); } }
XML文件
<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.appcompat.widget.Toolbar android:id="@+id/tl_head" android:layout_width="match_parent" android:layout_height="50dp" app:navigationIcon="@drawable/ic_back"> <!-- 注意TabLayout节点需要使用完整路径 --> <com.google.android.material.tabs.TabLayout android:id="@+id/tab_title" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_centerInParent="true" app:tabIndicatorColor="@color/red" app:tabIndicatorHeight="2dp" app:tabSelectedTextColor="@color/red" app:tabTextColor="@color/grey" app:tabTextAppearance="@style/TabText" /> </androidx.appcompat.widget.Toolbar> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/grey" /> <androidx.viewpager.widget.ViewPager android:id="@+id/vp_content" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
创作不易 觉得有帮助请点赞关注收藏~~~