效果图
使用控件介绍
- ViewPager作为容器可以存放View,在使用中通过setAdapter(PagerAdapter)来设置适配器。
- FragmentPagerAdapter继承PagerAdapter,根据名称可知为ViewPager适配Fragment。
- Toolbar用来替代ActionBar
代码讲解
- 在build.gradle(app)添加依赖
implementation 'com.android.support:design:28.0.0'
- 在sytle.xml中替代Actionbar
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
将上面parent替换成
Theme.AppCompat.Light.NoActionBar
- MainActivity的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".MainActivity"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/Theme.AppCompat.Light"/>
<android.support.design.widget.TabLayout
android:id="@+id/tl"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"></android.support.v4.view.ViewPager>
</LinearLayout>
- 自定义FragmentPagerAdapter
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
//页签list
private List<String> titleList;
private List<Fragment> fragmentList;
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
public MyFragmentPagerAdapter(FragmentManager fm, List<String> titleList,List<Fragment>fragmentList) {
super(fm);
this.titleList=titleList;
this.fragmentList=fragmentList;
}
//得到对应的fragment
@Override
public Fragment getItem(int i) {
return fragmentList.get(i);
}
//返回碎片个数
@Override
public int getCount() {
return fragmentList.size();
}
//返回页签内容
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return titleList.get(position);
}
}
- 自定义Fragment
public class MyFragment extends Fragment {
//显示文本内容,来区别不同的fragment
private TextView tv_content;
private String content;
public MyFragment(){
super();
}
//传递内容
public void setTv_content(String content){
this.content=content;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.myframent_layout,null);
tv_content = (TextView) view.findViewById(R.id.tv_content);
tv_content.setText(content);
return view;
}
}
- 菜单布局文件
在res资源目录下新建menu目录,并在menu目录下新建topmenu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/search"
android:icon="@drawable/search"
app:showAsAction="never"
android:title="search"/>
<item android:id="@+id/load"
android:title="load"
android:icon="@drawable/load"
app:showAsAction="never" />
<item android:id="@+id/delete"
android:title="delete"
android:icon="@drawable/delete"
app:showAsAction="never"/>
</menu>
其中showAsAction属性代表显示方式:
always:总是显示
ifRoom:屏幕不够显示在菜单中
never:一致显示在菜单中
- MainActivity代码
public class MainActivity extends AppCompatActivity {
//页签list
private List<String> titleList=new ArrayList<>();
//碎片list
private List<Fragment> fragmentList=new ArrayList<>();
private ViewPager viewPager;
private Toolbar toolbar;
//用来绑定viewpager
private TabLayout tabLayout;
private MyFragmentPagerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
initView();
//初始化数据
initData();
}
private void initView() {
viewPager = (ViewPager) findViewById(R.id.viewpager);
toolbar = (Toolbar) findViewById(R.id.toolbar);
tabLayout=findViewById(R.id.tl);
}
private void initData() {
for (int i=0;i<5;i++){
titleList.add("标题"+i);
MyFragment fragment=new MyFragment();
fragment.setTv_content("内容"+i);
fragmentList.add(fragment);
}
//使用Toolbar来替代了Actionbar
setSupportActionBar(toolbar);
//显示左侧返回箭头
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
adapter=new MyFragmentPagerAdapter(getSupportFragmentManager(),titleList,fragmentList);
viewPager.setAdapter(adapter);
//绑定viewPager
tabLayout.setupWithViewPager(viewPager);
}
//创建menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.topmenu,menu);
return true;
}
//处理按钮点击事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.delete:
Toast.makeText(this,"删除",Toast.LENGTH_SHORT).show();
break;
case R.id.load:
Toast.makeText(this,"加载",Toast.LENGTH_SHORT).show();
break;
case R.id.search:
Toast.makeText(this,"搜索",Toast.LENGTH_SHORT).show();
break;
}
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
//使菜单上图标可见
if (menu != null && menu instanceof MenuBuilder) {
//编sdk版本24的情况 可以直接使用 setOptionalIconsVisible
if (Build.VERSION.SDK_INT > 23) {
MenuBuilder builder = (MenuBuilder) menu;
builder.setOptionalIconsVisible(true);
} else {
//sdk版本24的以下,需要通过反射去执行该方法
try {
MenuBuilder builder = (MenuBuilder) menu;
Method m = builder.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
m.invoke(menu, true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return super.onPrepareOptionsMenu(menu);
}
}
参考文章:
Toolbar 自定义及遇到的那些坑