Android 技术的回顾第二篇《底部菜单》
来源:互联网 发布:电视如何看网络直播 编辑:程序博客网 时间:2024/06/07 12:12
Android 8.0已经正式上市,Design设计规范、AS推出、Kotlin推出,技术的发展从未止步,个人呢?
下面讲一下Design包下使用TabLayout、ViewPager创建高可复用的底部菜单栏。
第一步我们定义继承FragmentStatePagerAdapter的子类TabVpAdapter。(关于FragmentStatePagerAdapter释义自行百度)
package import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentStatePagerAdapter;import java.util.ArrayList;/** * TabLayout 适配 适用所有的 * Created by Zaric on 2015/8/5 11:46. */public class TabVpAdapter extends FragmentStatePagerAdapter { private ArrayList<Fragment> mList = new ArrayList<>(); private ArrayList<String> mTitleList = new ArrayList<>(); public TabVpAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return mList!=null&&mList.size()>0?mList.size():0; } @Override public Fragment getItem(int position) { return mList.get(position); } public void addFragment(Fragment fragment, String title) { mList.add(fragment); mTitleList.add(title); } @Override public CharSequence getPageTitle(int position) { return mTitleList.get(position); }}
第二步创建布局文件
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white"> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/tabLayout"/> <android.support.design.widget.TabLayout android:id="@+id/tabLayout" style="@style/TabLayout" android:layout_width="match_parent" android:layout_height="55dp" android:layout_alignParentBottom="true" /></RelativeLayout>
其中定义TabLayout的风格
<style name="TabLayout" parent="Widget.Design.TabLayout"> <item name="tabIndicatorColor">?attr/colorAccent</item> <item name="tabIndicatorHeight">0dp</item> <item name="android:textSize">@dimen/text_size_min</item></style>
下面就是创建我们可扩展的基础Activity了
packageimport android.support.design.widget.TabLayout;import android.support.v4.content.ContextCompat;import android.support.v4.view.ViewPager;import android.view.View;import android.widget.ImageView;import android.widget.TextView;/** * 主页 * Created by zaric on 2016/4/26 */public abstract class MainActivity extends BaseActivity { private ViewPager mViewPager; private TabLayout mTabLayout; @Override protected int getRootView() { return R.layout.activity_main; } @Override protected void initView() { mViewPager = (ViewPager) findViewById(R.id.viewPager); mTabLayout = (TabLayout) findViewById(R.id.tabLayout); } @Override protected void initData() { TabVpAdapter tabVpAdapter = new TabVpAdapter(getSupportFragmentManager()); initTabVpAdapter(tabVpAdapter); mViewPager.setAdapter(tabVpAdapter); mTabLayout.setupWithViewPager(mViewPager,false); mTabLayout.setTabTextColors(ContextCompat.getColor(this,getUnselectedTextColor()),ContextCompat.getColor(this,getSelectedTextColor())); for (int i = 0,size = mTabLayout.getTabCount(); i < size; i++) { TabLayout.Tab tab = mTabLayout.getTabAt(i); if (tab==null){ return; } tab.setCustomView(R.layout.tablayout); View view = tab.getCustomView(); if (view==null){ return; } ImageView iconView = (ImageView) view.findViewById(R.id.icon); TextView textView = (TextView) view.findViewById(R.id.text1); initTabIcon(tab,i); iconView.setImageDrawable(tab.getIcon()); textView.setText(tab.getText()); textView.setTextColor(mTabLayout.getTabTextColors()); } mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { MainActivity.this.onTabSelected(tab); View view = tab.getCustomView(); if (view==null){ return; } ImageView iconView = (ImageView) view.findViewById(R.id.icon); TextView textView = (TextView) view.findViewById(R.id.text1); iconView.setImageDrawable(tab.getIcon()); textView.setText(tab.getText()); } @Override public void onTabUnselected(TabLayout.Tab tab) { MainActivity.this.onTabUnselected(tab); View view = tab.getCustomView(); if (view==null){ return; } ImageView iconView = (ImageView) view.findViewById(R.id.icon); TextView textView = (TextView) view.findViewById(R.id.text1); iconView.setImageDrawable(tab.getIcon()); textView.setText(tab.getText()); } @Override public void onTabReselected(TabLayout.Tab tab) { } }); mTabLayout.setBackgroundColor(ContextCompat.getColor(this,getTabBackgroundColor())); runMore(); } /** * 执行更多逻辑 */ protected void runMore(){} /** * 初始化Viewpager适配器 */ protected abstract void initTabVpAdapter(TabVpAdapter mTabVpAdapter); /** * 给tab添加图片 */ protected abstract void initTabIcon(TabLayout.Tab tab,int position); /** * 标签选中状态 * @param tab 选中的Tab项 */ protected abstract void onTabSelected(TabLayout.Tab tab); /** * 标签不选中状态 * @param tab 未选中的Tab项 */ protected abstract void onTabUnselected(TabLayout.Tab tab); /** * 得到TabLayout的背景色 */ protected int getTabBackgroundColor(){ return R.color.colorPrimary; } /** * 得到TabLayout的字体未选中时的颜色 */ protected int getUnselectedTextColor(){ return R.color.white; } /** * 得到TabLayout的字体选中时的颜色 */ protected int getSelectedTextColor(){ return R.color.blue_light; } @Override public void onBackPressed() { DialogTool.showExitDialog(this); } @Override public void onNoDoubleClick(View v) { }}
接下来,我们再看一下优化模式的
package com.syy.concise.tab;import android.content.DialogInterface;import android.os.Handler;import android.support.design.widget.TabLayout;import android.support.v4.content.ContextCompat;import android.support.v4.view.ViewPager;import android.support.v7.app.AlertDialog;import android.view.LayoutInflater;import android.view.View;import android.widget.ImageView;import android.widget.TextView;import com.syy.concise.R;import com.syy.concise.base.BaseActivity;import com.syy.concise.base.BaseFragment;import java.util.ArrayList;/** * 主页 Created by zaric on 2016/4/26 */public abstract class MainActivity extends BaseActivity { private ViewPager viewPager; private TabLayout tabLayout; private ArrayList<BaseFragment> list; @Override protected int getRootView() { return R.layout.activity_main; } @Override protected void initView() { viewPager = (ViewPager) findViewById(R.id.viewPager); tabLayout = (TabLayout) findViewById(R.id.tabLayout); } @Override protected void initData() { list = new ArrayList<>(); addFragment(list); TabVpAdapter tabVpAdapter = new TabVpAdapter(this,getSupportFragmentManager(),list); viewPager.setAdapter(tabVpAdapter); tabLayout.setupWithViewPager(viewPager, false); for (int i = 0, size = tabLayout.getTabCount(); i < size; i++) { TabLayout.Tab tab = tabLayout.getTabAt(i); if (tab == null) { return; } View view = LayoutInflater.from(this).inflate(R.layout.layout_tab,null); TextView tabTv = (TextView) view.findViewById(R.id.tabTv); ImageView tabIv = (ImageView) view.findViewById(R.id.tabIv); int resColor = list.get(i).getPageTextColor(i==0); if (resColor!=0){ tabTv.setTextColor(ContextCompat.getColor(this,resColor)); } int resTitle = list.get(i).getPageTitle(); if (resTitle!=0) { tabTv.setText(getResources().getString(resTitle)); } int resIcon = list.get(i).getPageIcon(i==0); if (resIcon!=0) { tabIv.setVisibility(View.VISIBLE); tabIv.setBackgroundResource(resIcon); } tab.setTag(view); tab.setCustomView(view); } tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { int position = tab.getPosition(); View view = tab.getCustomView(); if (view ==null){ return; } TextView tabTv = (TextView) view.findViewById(R.id.tabTv); ImageView tabIv = (ImageView) view.findViewById(R.id.tabIv); int resColor = list.get(position).getPageTextColor(true); if (resColor!=0){ tabTv.setTextColor(ContextCompat.getColor(MainActivity.this,resColor)); } tabTv.setText(list.get(position).getPageTitle()); int resIcon = list.get(position).getPageIcon(true); if (resIcon!=0) { tabIv.setVisibility(View.VISIBLE); tabIv.setBackgroundResource(resIcon); } } @Override public void onTabUnselected(TabLayout.Tab tab) { int position = tab.getPosition(); View view = tab.getCustomView(); if (view==null){ return; } TextView tabTv = (TextView) view.findViewById(R.id.tabTv); ImageView tabIv = (ImageView) view.findViewById(R.id.tabIv); int resColor = list.get(position).getPageTextColor(false); if (resColor!=0){ tabTv.setTextColor(ContextCompat.getColor(MainActivity.this,resColor)); } tabTv.setText(list.get(position).getPageTitle()); int resIcon = list.get(position).getPageIcon(false); if (resIcon!=0) { tabIv.setVisibility(View.VISIBLE); tabIv.setBackgroundResource(resIcon); } } @Override public void onTabReselected(TabLayout.Tab tab) { } }); tabLayout.setBackgroundColor(ContextCompat.getColor(this, getTabBackgroundColor())); } /** * 添加页面 * @param fragments 页面 */ protected abstract void addFragment(ArrayList<BaseFragment> fragments); /** * 得到TabLayout的背景色 */ protected int getTabBackgroundColor() { return R.color.white; } @Override public void onBackPressed() { new AlertDialog.Builder(this) .setTitle(getString(R.string.exit_app)).setPositiveButton(android.R .string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { showLoading(); new Handler().postDelayed(new Runnable() { @Override public void run() { dismissLoading(); finish(); } },2000); } }).setNegativeButton(android.R.string.cancel, null).show(); } @Override public void onClick(View v) { }}
优化模式下,我们看看怎么使用
/** * 首页 Created by Zaric on 2017-08-10 */public class HomeActivity extends MainActivity { @Override protected int getOptionsMenu() { return 0; } @Override protected void addFragment(ArrayList<BaseFragment> fragments) { fragments.add(HomeFragment.newInstance()); fragments.add(FindFragment.newInstance()); fragments.add(RecordFragment.newInstance()); fragments.add(MoreFragment.newInstance()); } @Override public void onClick(View v) { }}
我们再看一下Fragment怎么写的
public class HomeFragment extends BaseFragment { public static HomeFragment newInstance() { Bundle args = new Bundle(); HomeFragment fragment = new HomeFragment(); fragment.setArguments(args); return fragment; } @Override protected int getRootView() { return R.layout.fragment_home; } @Override protected void initView() { } @Override protected void initData() { } @Override public int getPageTitle() { return R.string.home; } @Override public int getPageIcon(boolean isSelect) { if (isSelect){ return R.drawable.ic_home_pressed; } return R.drawable.ic_home; } @Override public int getPageTextColor(boolean isSelect) { if (isSelect){ return R.color.blue_light; } return R.color.ash_light; }}
好了,至此整套代码就结束了。这次就不细讲了,至于BaseActivity与BaseFragment是定义的抽象类,很简单,自己揣摩吧!
阅读全文
0 0
- Android 技术的回顾第二篇《底部菜单》
- Android的底部菜单
- android PopupWindow 的底部菜单
- Android底部菜单的实现
- android底部菜单的按钮
- android从底部浮出的菜单
- Android 底部菜单的实现方法
- Android 底部菜单的实现(TabHost)
- Android底部菜单的封装及重用
- Android底部菜单的封装及重用
- Android 底部菜单配合listview的问题
- Android之底部菜单 BottomNavigationBar的使用
- android底部菜单应用
- Android仿微信底部菜单
- Android仿微信底部菜单
- android底部菜单应用
- android底部菜单应用
- Android仿微信底部菜单
- 生成学习算法和朴素贝叶斯
- 【51nod】1052 最大M子段和 DP
- SAP-MM模块的自动过账(事务说明)
- redis requires Ruby version >= 2.2.2 系统默认 ruby 版本过低,导致 Redis 接口安装失败
- mybatis
- Android 技术的回顾第二篇《底部菜单》
- 马尔科夫场基本概念
- java笔记_2
- openssl在tomcat里面的使用
- Mysql数据库常用分库和分表方式
- [PAT]1021. Deepest Root (25)@Java实现
- Codeforces Round #441 (Div. 2, by Moscow Team Olympiad)
- 线性索引(稠密索引、稀疏索引即分块索引、多重表、倒排表)
- [Leetcode] 411. Minimum Unique Word Abbreviation 解题报告