Android实现顶部底部双导航界面功能

Android实现顶部底部双导航界面功能

2023年7月15日发(作者:)

Android实现顶部底部双导航界⾯功能最近想弄⼀个双导航功能,查看了许多资料,总算是实现了功能,这边就算是给⾃⼰⼏个笔记吧!先来看看效果

那么就开始实现了!底部导航栏我选择⽤FragmentTabHost+Fragment来实现,这个⽅法我觉得挺好⽤的,代码量也不多⾸先是开始的activity_

class="ntTabHost" />其中我是直接拉的view所以是形成的FragmentTabHost也可以直接在xml⽂件⾥⾯写 这xml⽂件就⼀个view加⼀个tab view⽤来显⽰碎⽚,tab⽤来放置底部按钮的数量再来是tab_ 这是每个底部按钮的布局设置的xml⽂件显⽰效果。再来是MainActivity的代码

package gation;import ;import ntActivity;import ntTabHost;import Inflater;import ;import ;import iew;import get;import ew;import hangeListener;import c;public class MainActivity extends FragmentActivity implements OnTabChangeListener { private FragmentTabHost mTabHost; @Override protected void onCreate(Bundle savedInstanceState) { te(savedInstanceState); requestWindowFeature(E_NO_TITLE); setContentView(ty_main);

//初始化FragmentTabHost initHost(); //初始化底部导航栏 initTab(); //默认选中 hanged(sTxt()[0]); } private void initTab() { String[] tabs = sTxt(); for (int i = 0; i < ; i++) { //新建TabSpec TabSpec tabSpec = Spec(sTxt()[i]); //设置view View view = (this).inflate(_foot, null); ((TextView) ewById(_tv)).setText(sTxt()[i]); ((ImageView) ewById(_iv)).setImageResource(sImg()[i]); icator(view); //加⼊TabSpec (tabSpec,mgent()[i],null); } } /*** * 初始化Host */ private void initHost() { mTabHost = (FragmentTabHost) findViewById(_tab); //调⽤setup⽅法 设置view (this, getSupportFragmentManager(),_view); //去除分割线 Widget().setDividerDrawable(null); //监听事件 abChangedListener(this); } @Override public void onTabChanged(String arg0) { //从分割线中获得多少个切换界⾯ TabWidget tabw = Widget(); for (int i = 0; i < ldCount(); i++) { View v = ldAt(i); TextView tv = (TextView) ewById(_tv);

ImageView iv = (ImageView) ewById(_iv); //修改当前的界⾯按钮颜⾊图⽚ if (i == rentTab()) { tColor(getResources().getColor(_light_color)); geResource(sImgLight()[i]); }else{ tColor(getResources().getColor(_color)); geResource(sImg()[i]); } } }} 其中TabDb类是⽤来设置导航栏的数据和图⽚切换时候的资源 以下是TabDb类package gation;public class TabDb { /*** * 获得底部所有项 */ public static String[] getTabsTxt() { String[] tabs = {"⾸页","交易","地点","我的"}; return tabs; } /*** * 获得所有碎⽚ */ public static Class[] getFramgent(){ Class[] cls = {,,,}; return cls ; } /*** * 获得所有点击前的图⽚ */ public static int[] getTabsImg(){ int[] img = {1,1,1,1}; return img ; } /*** * 获得所有点击后的图⽚ */ public static int[] getTabsImgLight(){ int[] img = {2,2,2,2}; return img ; }} 到此,底部导航栏就算是完全实现了。 现在来实现顶部导航栏,看了许多最后使⽤了RadioGroup+ViewPager来实现⾸先是为第⼀个碎⽚设计⼀个xml布局fm_

设置顶部导航栏和显⽰view 之后吧导航栏的每个项的布局tab_

其中设置selector⽂件来控制点击和未点击的状态tab_rb_

设置了点击和默认的时候的显⽰状态 最后来实现OneFm类package gation;import ist;import ;import ;import le;import nt;import ger;import ChangeListener;import yMetrics;import Inflater;import ;import oup;import ntalScrollView;import utton;import roup;import Params;import kedChangeListener;public class OneFm extends Fragment implements OnPageChangeListener { private View view; private RadioGroup rg_; private ViewPager vp_; private HorizontalScrollView hv_; private List newsList = new ArrayList(); private OneFmAdapter adapter; @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if (view == null) { //初始化view view = e(_one, container,false); rg_ = (RadioGroup) ewById(_rg); vp_ = (ViewPager) ewById(_view); hv_ = (HorizontalScrollView) ewById(_hv); //设置RadioGroup点击事件 rg_.setOnCheckedChangeListener(new OnCheckedChangeListener() {

@Override public void onCheckedChanged(RadioGroup group, int id) { vp_.setCurrentItem(id); } }); //初始化顶部导航栏 initTab(inflater); //初始化viewpager initView(); } /* * 底部导航栏切换后 由于没有销毁顶部设置导致如果没有重新设置view * 导致底部切换后切回顶部页⾯数据会消失等bug * 以下设置每次重新创建view即可 */ ViewGroup parent = (ViewGroup) ent(); if (parent != null) { View(view); } return view; } /*** * 初始化viewpager */ private void initView() { List hTabs = ected(); for (int i = 0; i < (); i++) { OneFm1 fm1 = new OneFm1(); Bundle bundle = new Bundle(); ing("name", (i).getName()); uments(bundle); (fm1); } //设置viewpager适配器 adapter = new OneFmAdapter(getActivity().getSupportFragmentManager(),newsList); vp_.setAdapter(adapter); //两个viewpager切换不重新加载 vp_.setOffscreenPageLimit(2); //设置默认 vp_.setCurrentItem(0); //设置viewpager监听事件 vp_.setOnPageChangeListener(this); } /*** * 初始化头部导航栏 * @param inflater */ private void initTab(LayoutInflater inflater) { List hTabs = ected(); for (int i = 0; i < (); i++) { //设置头部项布局初始化数据 RadioButton rbButton = (RadioButton) e(_rb, null); (i); t((i).getName()); LayoutParams params = new LayoutParams(_CONTENT, _CONTENT); //加⼊RadioGroup rg_.addView(rbButton,params); } //默认点击 rg_.check(0); } @Override public void onPageScrollStateChanged(int arg0) {

} @Override public void onPageScrolled(int arg0, float arg1, int arg2) {

} @Override public void onPageSelected(int id) { setTab(id); } /*** * 页⾯跳转切换头部偏移设置 * @param id */ private void setTab(int id) { RadioButton rbButton = (RadioButton) rg_.getChildAt(id); //设置标题被点击 cked(true); //偏移设置 int left = t(); int width = suredWidth(); DisplayMetrics metrics = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); int screenWidth = ixels; //移动距离= 左边的位置 + button宽度的⼀半 - 屏幕宽度的⼀半 int len = left + width / 2 - screenWidth / 2; //移动 hv_.smoothScrollTo(len, 0); }} 其中有两个数据类和⼀个碎⽚类数据类

package gation;/*** * 头部Tab属性 * */public class HTab { private String name; public HTab(String name) { super(); e(name); } public String getName() { return name; } public void setName(String name) { = name; }

}

package gation;import ist;import ;public class HTabDb { private static final List Selected = new ArrayList(); static{ (new HTab("今⽇")); (new HTab("头条")); (new HTab("娱乐")); (new HTab("财经")); (new HTab("军事")); (new HTab("科技")); (new HTab("时尚")); (new HTab("体育")); } /*** * 获得头部tab的所有项 */ public static List getSelected() { return Selected; }} 碎⽚类 package gation;import ;import le;import nt;import Inflater;import ;import oup;import ew;public class OneFm1 extends Fragment { private String name; @Override public void setArguments(Bundle args) { name = ing("name"); } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = e(nt, container,false); ((TextView) ewById(_text)).setText(name); return view; }}这样就把顶部的导航栏加⼊到了第⼀个fragment⾥⾯并且实现了切换功能最后把贴下,就是每个碎⽚最默认的显⽰页⾯罢了 总结:算是⼀个笔记记录吧!⼀段时间没更新了,由于刚毕业断了⼀个时间,⾛⾛停停留下⼀些⾃⼰的记录,就怕⾃⼰以后要写忘了。

下载地址:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689428863a246683.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信