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

最近想弄一个双导航功能,查看了许多资料,总算是实现了功能,这边就算是给自己几个笔记吧!

先来看看效果

那么就开始实现了!

底部导航栏我选择用FragmentTabHost+Fragment来实现,这个方法我觉得挺好用的,代码量也不多

首先是开始的activity_main.xml

<RelativeLayout 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"
 tools:context="${relativePackage}.${activityClass}" >

 <FrameLayout
 android:id="@+id/main_view"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:layout_above="@+id/main_tab"
 android:layout_alignParentLeft="true"
 android:layout_alignParentTop="true" >

 </FrameLayout>

 <view
 android:id="@+id/main_tab"
 android:layout_width="match_parent"
 android:layout_height="50dp"
 android:layout_alignParentBottom="true"
 android:layout_alignParentLeft="true"
 class="android.support.v4.app.FragmentTabHost" />

</RelativeLayout>

其中我是直接拉的view所以是形成的FragmentTabHost

也可以直接在xml文件里面写
 <android.support.v4.view.FragmentTabHost > 
</android.support.v4.view.FragmentTabHost> 
这xml文件就一个view加一个tab  view用来显示碎片,tab用来放置底部按钮的数量

再来是tab_foot.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="#F6F6F6"
 android:gravity="center"
 android:orientation="vertical" >

 <ImageView
 android:id="@+id/foot_iv"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:src="@drawable/home1" />

 <TextView
 android:id="@+id/foot_tv"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_marginTop="3dp"
 android:text="首页"
 android:textColor="@color/tab_color" />

</LinearLayout>

这是每个底部按钮的布局设置的xml文件

显示效果。

再来是MainActivity的代码

package com.gjn.mynavigation;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTabHost;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;
import android.widget.TabWidget;
import android.widget.TextView;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabHost.TabSpec;

public class MainActivity extends FragmentActivity implements OnTabChangeListener {

 private FragmentTabHost mTabHost;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 requestWindowFeature(Window.FEATURE_NO_TITLE);
 setContentView(R.layout.activity_main);

 //初始化FragmentTabHost
 initHost();
 //初始化底部导航栏
 initTab();
 //默认选中
 mTabHost.onTabChanged(TabDb.getTabsTxt()[0]);
 }

 private void initTab() {
 String[] tabs = TabDb.getTabsTxt();
 for (int i = 0; i < tabs.length; i++) {
 //新建TabSpec
 TabSpec tabSpec = mTabHost.newTabSpec(TabDb.getTabsTxt()[i]);
 //设置view
 View view = LayoutInflater.from(this).inflate(R.layout.tabs_foot, null);
 ((TextView) view.findViewById(R.id.foot_tv)).setText(TabDb.getTabsTxt()[i]);
 ((ImageView) view.findViewById(R.id.foot_iv)).setImageResource(TabDb.getTabsImg()[i]);
 tabSpec.setIndicator(view);
 //加入TabSpec
 mTabHost.addTab(tabSpec,TabDb.getFramgent()[i],null);
 }
 }
 /***
 * 初始化Host
 */
 private void initHost() {
 mTabHost = (FragmentTabHost) findViewById(R.id.main_tab);
 //调用setup方法 设置view
 mTabHost.setup(this, getSupportFragmentManager(),R.id.main_view);
 //去除分割线
 mTabHost.getTabWidget().setDividerDrawable(null);
 //监听事件
 mTabHost.setOnTabChangedListener(this);
 }

 @Override
 public void onTabChanged(String arg0) {
 //从分割线中获得多少个切换界面
 TabWidget tabw = mTabHost.getTabWidget();
 for (int i = 0; i < tabw.getChildCount(); i++) {
 View v = tabw.getChildAt(i);
 TextView tv = (TextView) v.findViewById(R.id.foot_tv);
 ImageView iv = (ImageView) v.findViewById(R.id.foot_iv);
 //修改当前的界面按钮颜色图片
 if (i == mTabHost.getCurrentTab()) {
 tv.setTextColor(getResources().getColor(R.color.tab_light_color));
 iv.setImageResource(TabDb.getTabsImgLight()[i]);
 }else{
 tv.setTextColor(getResources().getColor(R.color.tab_color));
 iv.setImageResource(TabDb.getTabsImg()[i]);
 }
 }
 }
}

其中TabDb类是用来设置导航栏的数据和图片切换时候的资源
 以下是TabDb类

package com.gjn.mynavigation;

public class TabDb {
 /***
 * 获得底部所有项
 */
 public static String[] getTabsTxt() {
 String[] tabs = {"首页","交易","地点","我的"};
 return tabs;
 }
 /***
 * 获得所有碎片
 */
 public static Class[] getFramgent(){
 Class[] cls = {OneFm.class,TwoFm.class,ThreeFm.class,FourFm.class};
 return cls ;
 }
 /***
 * 获得所有点击前的图片
 */
 public static int[] getTabsImg(){
 int[] img = {R.drawable.home1,R.drawable.glod1,R.drawable.xc1,R.drawable.user1};
 return img ;
 }
 /***
 * 获得所有点击后的图片
 */
 public static int[] getTabsImgLight(){
 int[] img = {R.drawable.home2,R.drawable.glod2,R.drawable.xc2,R.drawable.user2};
 return img ;
 }
}

到此,底部导航栏就算是完全实现了。

--------------------------------------------------------------------------------------------------------------------------

现在来实现顶部导航栏,看了许多最后使用了RadioGroup+ViewPager来实现

首先是为第一个碎片设计一个xml布局

fm_one.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical" >

 <HorizontalScrollView
 android:id="@+id/one_hv"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:scrollbars="none" >

 <RadioGroup
  android:id="@+id/one_rg"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="horizontal" >
 </RadioGroup>
 </HorizontalScrollView>

 <view
 android:id="@+id/one_view"
 android:layout_width="match_parent"
 android:layout_height="0dp"
 android:layout_weight="1"
 class="android.support.v4.view.ViewPager" />

</LinearLayout>

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

tab_rb.xml

<?xml version="1.0" encoding="utf-8"?>
<RadioButton xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:background="@drawable/tab_rb_selector"
 android:button="@null"
 android:paddingBottom="10dp"
 android:paddingLeft="15dp"
 android:paddingRight="15dp"
 android:paddingTop="10dp"
 android:text="今日" >
</RadioButton>

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

tab_rb_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
 <!-- 点击 -->
 <item android:state_checked="true">
 <layer-list >
  <item >
  <shape android:shape="rectangle">
   <stroke android:width="5dp" android:color="@color/tab_light_color"/>
  </shape>
  </item>
  <item android:bottom="5dp">
  <shape android:shape="rectangle">
   <solid android:color="#fff"/>
  </shape>
  </item>
 </layer-list>
 </item>
 <!-- 默认 -->
 <item >
 <shape >
  <solid android:color="#fafafa"/>
 </shape>
 </item>
</selector>

设置了点击和默认的时候的显示状态
 最后来实现OneFm类

package com.gjn.mynavigation;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.HorizontalScrollView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.LayoutParams;
import android.widget.RadioGroup.OnCheckedChangeListener;

public class OneFm extends Fragment implements OnPageChangeListener {

 private View view;
 private RadioGroup rg_;
 private ViewPager vp_;
 private HorizontalScrollView hv_;
 private List<Fragment> newsList = new ArrayList<Fragment>();
 private OneFmAdapter adapter;

 @Override
 public View onCreateView(LayoutInflater inflater,
 @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 if (view == null) {
 //初始化view
 view = inflater.inflate(R.layout.fm_one, container,false);
 rg_ = (RadioGroup) view.findViewById(R.id.one_rg);
 vp_ = (ViewPager) view.findViewById(R.id.one_view);
 hv_ = (HorizontalScrollView) view.findViewById(R.id.one_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) view.getParent();
 if (parent != null) {
 parent.removeView(view);
 }
 return view;
 }
 /***
 * 初始化viewpager
 */
 private void initView() {
 List<HTab> hTabs = HTabDb.getSelected();
 for (int i = 0; i < hTabs.size(); i++) {
 OneFm1 fm1 = new OneFm1();
 Bundle bundle = new Bundle();
 bundle.putString("name", hTabs.get(i).getName());
 fm1.setArguments(bundle);
 newsList.add(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<HTab> hTabs = HTabDb.getSelected();
 for (int i = 0; i < hTabs.size(); i++) {
 //设置头部项布局初始化数据
 RadioButton rbButton = (RadioButton) inflater.inflate(R.layout.tab_rb, null);
 rbButton.setId(i);
 rbButton.setText(hTabs.get(i).getName());
 LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
 LayoutParams.WRAP_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);
 //设置标题被点击
 rbButton.setChecked(true);
 //偏移设置
 int left = rbButton.getLeft();
 int width = rbButton.getMeasuredWidth();
 DisplayMetrics metrics = new DisplayMetrics();
 getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
 int screenWidth = metrics.widthPixels;
 //移动距离= 左边的位置 + button宽度的一半 - 屏幕宽度的一半
 int len = left + width / 2 - screenWidth / 2;
 //移动
 hv_.smoothScrollTo(len, 0);
 }
}

其中有两个数据类和一个碎片类

数据类

HTab.java

package com.gjn.mynavigation;

/***
 * 头部Tab属性
 *
 */
public class HTab {
 private String name;

 public HTab(String name) {
 super();
 this.setName(name);
 }

 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }

}

HTabDb.java

package com.gjn.mynavigation;

import java.util.ArrayList;
import java.util.List;

public class HTabDb {
 private static final List<HTab> Selected = new ArrayList<HTab>();
 static{
 Selected.add(new HTab("今日"));
 Selected.add(new HTab("头条"));
 Selected.add(new HTab("娱乐"));
 Selected.add(new HTab("财经"));
 Selected.add(new HTab("军事"));
 Selected.add(new HTab("科技"));
 Selected.add(new HTab("时尚"));
 Selected.add(new HTab("体育"));
 }
 /***
 * 获得头部tab的所有项
 */
 public static List<HTab> getSelected() {
 return Selected;
 }

}

碎片类
 OneFm1.java

 package com.gjn.mynavigation;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class OneFm1 extends Fragment {

 private String name;

 @Override
 public void setArguments(Bundle args) {
 name = args.getString("name");
 }

 @Override
 public View onCreateView(LayoutInflater inflater,
 @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 View view = inflater.inflate(R.layout.fragment, container,false);
 ((TextView) view.findViewById(R.id.fm_text)).setText(name);
 return view;
 }

}

这样就把顶部的导航栏加入到了第一个fragment里面并且实现了切换功能

最后把fragment.xml贴下,就是每个碎片最默认的显示页面罢了

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:gravity="center"
 android:orientation="vertical" >

 <TextView
 android:id="@+id/fm_text"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="Large Text"
 android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

 总结:

算是一个笔记记录吧!一段时间没更新了,由于刚毕业断了一个时间,走走停停留下一些自己的记录,就怕自己以后要写忘了。

下载地址:点击打开链接

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android程序开发之Fragment实现底部导航栏实例代码

    流行的应用的导航一般分为两种,一种是底部导航,一种是侧边栏. 说明 IDE:AS,Android studio; 模拟器:genymotion; 实现的效果,见下图. 具体实现 为了讲明白这个实现过程,我们贴出来的代码多一写,这样更方便理解 [最后还会放出完整的代码实现] .看上图的界面做的比较粗糙,但实现过程的骨架都具有了,想要更完美的设计,之后自行完善吧 ^0^. 布局 通过观察上述效果图,发现任意一个选项页面都有三部分组成: 顶部去除ActionBar后的标题栏: 中间一个Fragment

  • Android实现底部导航栏功能(选项卡)

    现在很多android的应用都采用底部导航栏的功能,这样可以使得用户在使用过程中随意切换不同的页面,现在我采用TabHost组件来自定义一个底部的导航栏的功能. 我们先看下该demo实例的框架图: 其中各个类的作用以及资源文件就不详细解释了,还有资源图片(在该Demo中借用了其它应用程序的资源图片)也不提供了,大家可以自行更换自己需要的资源图片.直接上各个布局文件或各个类的代码: 1. res/layout目录下的 maintabs.xml 源码: <?xml version="1.0&q

  • Android 底部导航控件实例代码

    一.先给大家展示下最终效果 通过以上可以看到,图一是简单的使用,图二.图三中为结合ViewPager共同使用,而且都可以随ViewPager的滑动渐变色,不同点是图二为选中非选中两张图片,图三的选中非选中是一张图片只是做了颜色变化. 二. 需求 我们希望做可以做成这样的,可以在xml布局中引入控件并绑定数据,在代码中设置监听回调,并且配置使用要非常简单! 三.需求分析 根据我们多年做不明确需求项目的经验,以上需求还算明确.那么我们可以采用在LinearLayout添加子View控件,这个子Vie

  • Android仿网易客户端顶部导航栏效果

    最近刚写了一个网易客户端首页导航条的动画效果,现在分享出来给大家学习学习.我说一下这个效果的核心原理.下面是效果图: 首先是布局,这个布局是我从网易客户端反编译后弄来的.大家看后应该明白,布局文件如下: <FrameLayout android:id="@id/column_navi" android:layout_width="fill_parent" android:layout_height="wrap_content" androi

  • Android 开发之BottomBar+ViewPager+Fragment实现炫酷的底部导航效果

    BottomBar BottomBar是Github上的一个开源框架,因为从1.3.3开始不支持fragments了,要自己配置,弄了很久,不管是app的fragment还是V4 的程序总是总是闪退.于是就用这种方式实现了,效果还不错.github有详细说明,多余的就不说了. 这个roughike是这个项目的所有者(大神致敬). 我用的是Android studio开发,fragment全部导的V4的包(以为最开始就支持的是v4的,后面也支持了app.fragment). 首先是dependen

  • Android实现顶部导航菜单左右滑动效果

    本文给大家介绍在Android中如何实现顶部导航菜单左右滑动效果,具体内容如下 第一种解决方案: 实现原理是使用android-support-v4.jar包中ViewPager控件,在ViewPager控件中设置流布局,再在流布局中设置几项TextView,给每一个TextView设置相关参数,事件等.关于ViewPager控件可以设置全屏幕滑动效果,当然也可以实现局部滑动效果,下面介绍导航菜单. 关于导航菜单,相信大家对它并不陌生,比如在新闻客户端中就经常使用左右滑动菜单来显示不同类别的新闻

  • Android项目实战之仿网易顶部导航栏效果

    随着时间的推移现在的软件要求显示的内容越来越多,所以要在小的屏幕上能够更好的显示更多的内容,首先我们会想到底部菜单栏,但是有时候想网易新闻要显示的内容太多,而且又想在主页面全部显示出来,所以有加了顶部导航栏,但是Android这样的移动设备内存是受限的,那么多界面缓存到内存中,很容易导致内存溢出,这个是比较致命的,所以不得不考虑.虽然我在之前也做过网易的顶部导航栏但是方式并不好,就像使用viewpager做一些复杂的界面由于图片占用内存过多,很容易导致内存溢出,学习了今天的内容大家做一下对比相信

  • Android BottomNavigationBar底部导航控制器使用方法详解

    最近Google在自己推出的Material design中增加了Bottom Navigation导航控制.Android一直没有官方的导航控制器,自己实现确实是五花八门,有了这个规定之后,就类似苹果的底部Toolbar,以后我们的APP就会有一致的风格,先看一张效果: 这是官方在Material design中给出一张图,确实很不错. 1.BottomNavigationBar的下载地址 https://github.com/Ashok-Varma/BottomNavigation 2.使用

  • Android实现仿网易新闻的顶部导航指示器

    我们知道,页面导航器(Navigator)在几乎所有的项目中都会用到,平时大多数时候为了节省时间,都会直接在github上面拿别人的开源项目来用,最近自己在复习自定义View,就尝试封装了一下,源码参考项目PagerSlidingTabStrip 大家先来看一下效果图 基于文字的页面导航器 基于图片的页面导航器 使用方法 主要步骤分为三步 1)在xml文件里面 <com.xujun.viewpagertabindicator.TabPagerIndicator android:id="@+

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

    最近想弄一个双导航功能,查看了许多资料,总算是实现了功能,这边就算是给自己几个笔记吧! 先来看看效果 那么就开始实现了! 底部导航栏我选择用FragmentTabHost+Fragment来实现,这个方法我觉得挺好用的,代码量也不多 首先是开始的activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://s

  • 微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解

    本文实例讲述了微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能.分享给大家供大家参考,具体如下: 微信小程序开发中选项卡.在android中选项卡一般用fragment,到了小程序这里瞬间懵逼了. 总算做出来了.分享出来看看. 先看效果: 再上代码: 1.index.wxml <!--index.wxml--> <view class="swiper-tab"> <view class="swiper-tab-list {{c

  • Android 仿微信图像拍摄和选择界面功能(代码分享)

    插件运行后的画面如下: 下面这张图对图像进行筛选,根据照片产生的源头分(QQ和微信和相机) 点击某文件夹后,可以查看该文件夹下包含的所有的图片 图片选择界面 选中后就跳到已经选择界面的窗口,并且可以对该吃图片上传进行简要的描述 首先我想说明的是这个插件默认是不进行图片筛选的,打开app后会有几十个文件夹,但是个人认为开发中常用的图片基本都来自于QQ中拍摄的照片,微信中拍摄的照片,以及相机直接拍摄的照片,因此我对这个插件进行过滤以及文件夹名称的更改,具体做法,主要是对AlbumHelper类bui

  • android 仿微信demo——微信通讯录界面功能实现(移动端,服务端)

    目录 移动端微信通讯录界面功能实现 服务端微信通讯录界面功能实现 测试 总结 前面我们实现了微信消息界面的实现,这篇继续完善微信功能,实现微信通讯录界面 移动端微信通讯录界面功能实现 微信通讯录,头部是四个标签(不进行分组),下面是好友信息且根据呢称首字母进行排序分组,底部还统计了好友个数,右边是一组英文字母导航,可滑动并且还可以点击跳转到相应的分组 微信好友和顶部的四个标签,可以用ListViw实现并指定一个item布局,分组效果只需要在代码段进行判断即可 右边的字母操作行可以自定义一个组件继

  • Android仿iOS侧滑退出当前界面功能

    我们都知道在ios手机上面,有一个侧滑退出当前界面的功能,但是在安卓手机上系统没有给我们提供这样的功能,但是这依然阻挡不了强大的安卓的定制功能,我们完全可以自己定制一套这样的功能. 首先看下效果图: 分析: (1)要想模仿ios的这种效果,因为我们通过手指的滑动,所以这里肯定跟我们的滑动事件有关系(onInterceptTouchEvent,onTouchEvent这两个方法的关系,如果不清楚,请直接查阅事件传递机制原理) (2)我们要想直接拦截我们的所有触摸事件,我们可以在上层父级布局中进行拦

  • 超简单的几行代码搞定Android底部导航栏功能

    超简单,几行代码搞定Android底部导航栏-–应项目需求以及小伙伴的留言,新加了两个方法: 设置底部导航栏背景图片 添加底部导航栏选项卡切换监听事件 底部导航栏的实现也不难,就是下边是几个Tab切换,上边一般是一个FrameLayout,然后FrameLayout中切换fragment. 网上有不少关于Android底部导航栏的文章,不过好像都只是关于下边Tab切的,没有实现Tab与fragment的联动,用的时候还要自己手写这部分代码,对我这个比较懒(据说,懒是程序员的一种美德_#)得程序员

  • Android实现底部导航栏功能

    本文实例为大家分享了Android实现底部导航栏功能的具体代码,供大家参考,具体内容如下 实验效果: (1)在drawable文件夹下新建tab_menu_bg.xml文件,具体代码如下: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item

  • Android仿微信底部菜单栏功能显示未读消息数量

    底部菜单栏很重要,我看了一下很多应用软件都是用了底部菜单栏,这里使用了tabhost做了一种通用的(就是可以像微信那样显示未读消息数量的,虽然之前也做过但是layout下的xml写的太臃肿,这里去掉了很多不必要的层,个人看起来还是不错的,所以贴出来方便以后使用). 先看一下做出来之后的效果: 以后使用的时候就可以换成自己项目的图片和字体了,主框架不用变哈哈, 首先是要布局layout下xml文件 main.xml: <?xml version="1.0" encoding=&qu

  • Android实现淘宝底部图标导航栏

    在上一篇中,简单的使用透明主题的Activity实现了仿微信右侧顶部的对话框,上午又花了两个小时研究了一下淘宝底部的导航栏实现,网上的做法也有很多,今天我就使用一种通过基本控件加上布局的方式,没有任何的自定义风格,控件等来实现,还是老样子,先看一下效果图: 下面就来具体看一看如何实现的,还是按照步骤来吧: 绘制主界面 activity_layout.xml代码如下: <?xml version="1.0" encoding="utf-8"?> <R

随机推荐