Android实现底部状态栏切换的两种方式

Android开发过程中,特别是新开的项目,底部状态栏的切换使用的频率非常的高,主要的实现方式有:

(1)、TabLayout + Fragment
    (2)、FragmentTabHost + Fragment
    (3)、BottomNavigationView + Fragment
    (4)、RidioGroup + Fragment

这里我先介绍前面两种实现方式,后面两种后期再贴出实现方式。

一、使用TabLayout + Fragment + ViewPager实现

1、实现步骤:

(1)、布局文件中定义TabLayout控件
    (2)、定义切换的每个Fragment布局文件
    (3)、定义切换的每个Fragment的Java类
    (4)、定义TabLayoutMainActivity类
    (5)、效果图演示

2、实现过程:

(1)、布局文件中定义TabLayout控件(activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context="com.showly.bottomnavigationbardemo.TabLayoutMainActivity">
 <android.support.v4.view.ViewPager
  android:id="@+id/viewpager_content_view"
  android:layout_width="match_parent"
  android:layout_height="0dp"
  android:layout_weight="1"
  android:scrollbars="none" />
 <android.support.design.widget.TabLayout
  android:id="@+id/tab_layout_view"
  android:layout_width="match_parent"
  android:layout_height="50dp"
  app:tabGravity="fill"
  app:tabIndicatorHeight="0dp"
  app:tabMode="fixed"
  app:tabSelectedTextColor="#FB8081"
  app:tabTextColor="#A0A0A0" />
</LinearLayout>

(2)、定义切换的每个Fragment布局文件(fragment_frist.xml)

这里有四个Tab类别(首页、娱乐、游戏、我的),布局都类似,这里只贴出其中一个

<?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="#fff"
 android:orientation="vertical">
 <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerInParent="true"
  android:text="首页"
  android:textColor="#000"/>
</RelativeLayout>

(3)、定义切换的每个Fragment的Java类(FristFragment.class)

这里的Java 类实现方式也相似,贴出其中一个

package com.showly.bottomnavigationbardemo.fragment;
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 com.showly.bottomnavigationbardemo.R;
public class FristFragment extends Fragment {
 @Nullable
 @Override
 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
  View view = inflater.inflate(R.layout.fragment_frist, null);
  return view;
 }
}

(4)、定义TabLayoutMainActivity类(TabLayoutMainActivity.class)

package com.showly.bottomnavigationbardemo;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import com.showly.bottomnavigationbardemo.fragment.FourthlyFragment;
import com.showly.bottomnavigationbardemo.fragment.FristFragment;
import com.showly.bottomnavigationbardemo.fragment.SecondFragment;
import com.showly.bottomnavigationbardemo.fragment.ThirtlyFragment;
public class TabLayoutMainActivity extends AppCompatActivity {
 //未选中的Tab图片
 private int[] unSelectTabRes = new int[]{R.drawable.i8live_menu_home_normal
   , R.drawable.i8live_menu_information_normal, R.drawable.i8live_menu_game_normal, R.drawable.i8live_menu_personl_normal};
 //选中的Tab图片
 private int[] selectTabRes = new int[]{R.drawable.i8live_menu_home_press, R.drawable.i8live_menu_information_press
   , R.drawable.i8live_menu_game_press, R.drawable.i8live_menu_personl_press};
 //Tab标题
 private String[] title = new String[]{"首页", "娱乐", "游戏", "我的"};
 private ViewPager viewPager;
 private TabLayout tabLayout;
 private TabLayout.Tab tabAtOne;
 private TabLayout.Tab tabAttwo;
 private TabLayout.Tab tabAtthree;
 private TabLayout.Tab tabAtfour;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  getSupportActionBar().hide();//隐藏掉整个ActionBar
  setContentView(R.layout.activity_main);
  initView();
  initData();
  initListener();
 }
 private void initView() {
  viewPager = (ViewPager) findViewById(R.id.viewpager_content_view);
  tabLayout = (TabLayout) findViewById(R.id.tab_layout_view);
  //使用适配器将ViewPager与Fragment绑定在一起
  viewPager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager()));
  //将TabLayout与ViewPager绑定
  tabLayout.setupWithViewPager(viewPager);
  /* //设置方式一:
  //获取底部的单个Tab
  tabAtOne = tabLayout.getTabAt(0);
  tabAttwo = tabLayout.getTabAt(1);
  tabAtthree = tabLayout.getTabAt(2);
  tabAtfour = tabLayout.getTabAt(3);
  //设置Tab图片
  tabAtOne.setIcon(R.drawable.i8live_menu_home_press);
  tabAttwo.setIcon(R.drawable.i8live_menu_information_normal);
  tabAtthree.setIcon(R.drawable.i8live_menu_game_normal);
  tabAtfour.setIcon(R.drawable.i8live_menu_personl_normal);*/
  //设置方式二:
  for (int i = 0; i < title.length; i++) {
   if (i == 0) {
    tabLayout.getTabAt(0).setIcon(selectTabRes[0]);
   } else {
    tabLayout.getTabAt(i).setIcon(unSelectTabRes[i]);
   }
  }
 }
 private void initData() {
 }
 private void initListener() {
  //TabLayout切换时导航栏图片处理
  tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
   @Override
   public void onTabSelected(TabLayout.Tab tab) {//选中图片操作
    for (int i = 0; i < title.length; i++) {
     if (tab == tabLayout.getTabAt(i)) {
      tabLayout.getTabAt(i).setIcon(selectTabRes[i]);
      viewPager.setCurrentItem(i);
     }
    }
   }
   @Override
   public void onTabUnselected(TabLayout.Tab tab) {//未选中图片操作
    for (int i = 0; i < title.length; i++) {
     if (tab == tabLayout.getTabAt(i)) {
      tabLayout.getTabAt(i).setIcon(unSelectTabRes[i]);
     }
    }
   }
   @Override
   public void onTabReselected(TabLayout.Tab tab) {
   }
  });
 }
 //自定义适配器
 public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
  public MyFragmentPagerAdapter(FragmentManager fm) {
   super(fm);
  }
  @Override
  public Fragment getItem(int position) {
   if (position == 1) {
    return new SecondFragment();//娱乐
   } else if (position == 2) {
    return new ThirtlyFragment();//游戏
   } else if (position == 3) {
    return new FourthlyFragment();//我的
   }
   return new FristFragment();//首页
  }
  @Override
  public int getCount() {
   return title.length;
  }
  @Override
  public CharSequence getPageTitle(int position) {
   return title[position];
  }
 }
}

(5)、效果图演示

二、使用FragmentTabHost+ Fragment + ViewPager实现

1、实现步骤:

(1)、布局文件中定义FragmentTabHost控件
    (2)、定义底部菜单栏布局
    (3)、定义切换的每个Fragment布局文件
    (4)、定义切换的每个Fragment的Java类
    (5)、切换按钮的图片
    (6)、定义FragmentTabHostMainActivity类
    (7)、效果图演示

2、实现过程:

(1)、布局文件中定义FragmentTabHost控件(fragment_tabhost_activity.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="#fff"
 android:orientation="vertical">
 <android.support.v4.view.ViewPager
  android:id="@+id/vp_pager"
  android:layout_width="match_parent"
  android:layout_height="0dp"
  android:layout_weight="1"
  android:scrollbars="none" />
 <android.support.v4.app.FragmentTabHost
  android:id="@android:id/tabhost"
  android:layout_width="match_parent"
  android:background="#3000"
  android:layout_height="65dp">
  <FrameLayout
   android:id="@android:id/tabcontent"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content" />
 </android.support.v4.app.FragmentTabHost>
</LinearLayout>

(2)、定义底部菜单栏布局(tab_content.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:padding="2dp"
 android:orientation="vertical">

 <ImageView
  android:id="@+id/iv_imageview"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal"
  android:background="@drawable/i8live_menu_home_normal" />

 <TextView
  android:id="@+id/tv_item"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal"
  android:layout_marginTop="5dp"
  android:text="首页" />
</LinearLayout>

(3)、定义切换的每个Fragment布局文件(fragment_frist.xml)

这里有四个Tab类别(首页、娱乐、游戏、我的),布局都类似,这里只贴出其中一个

<?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="#fff"
 android:orientation="vertical">
 <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerInParent="true"
  android:text="首页"
  android:textColor="#000"/>
</RelativeLayout>

(4)、定义切换的每个Fragment的Java类(FristFragment.class)

这里的Java 类实现方式也相似,贴出其中一个

package com.showly.bottomnavigationbardemo.fragment;
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 com.showly.bottomnavigationbardemo.R;
public class FristFragment extends Fragment {
 @Nullable
 @Override
 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
  View view = inflater.inflate(R.layout.fragment_frist, null);
  return view;
 }
}

(5)、切换按钮的图片(tab_main.xml)

这里有四个是相似的,只贴出其中一个

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <!-- 切换选中之后的图片-->
 <item android:drawable="@drawable/i8live_menu_home_press" android:state_selected="true"/>
 <!-- 未选中的图片-->
 <item android:drawable="@drawable/i8live_menu_home_normal"/>
</selector>

(6)、定义FragmentTabHostMainActivity类(FragmentTabHostMainActivity.class)

package com.showly.bottomnavigationbardemo;
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTabHost;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TabHost;
import android.widget.TabWidget;
import android.widget.TextView;
import com.showly.bottomnavigationbardemo.fragment.FourthlyFragment;
import com.showly.bottomnavigationbardemo.fragment.FristFragment;
import com.showly.bottomnavigationbardemo.fragment.SecondFragment;
import com.showly.bottomnavigationbardemo.fragment.ThirtlyFragment;
import java.util.ArrayList;
import java.util.List;
public class FragmentTabHostMainActivity extends FragmentActivity implements ViewPager.OnPageChangeListener, TabHost.OnTabChangeListener {
 private int[] selectTabRes = new int[]{R.drawable.tab_main, R.drawable.tab_infomation
   , R.drawable.tab_game, R.drawable.tab_personal};
 //Tab标题
 private String[] title = new String[]{"首页", "娱乐", "游戏", "我的"};
 private Class fragmentArry[] = {FristFragment.class, SecondFragment.class, ThirtlyFragment.class, FourthlyFragment.class};
 private List<Fragment> fragmentList = new ArrayList();
 private ViewPager viewPager;
 private FragmentTabHost tabHost;
 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.fragment_tabhost_activity);
  initView();
  initData();
  initListener();
 }
 /**
  * 初始化Fragment并给ViewPager添加适配器
  */
 private void initVaper() {
  FristFragment fristFragment = new FristFragment();
  SecondFragment secondFragment = new SecondFragment();
  ThirtlyFragment thirtlyFragment = new ThirtlyFragment();
  FourthlyFragment fourthlyFragment = new FourthlyFragment();
  fragmentList.add(fristFragment);
  fragmentList.add(secondFragment);
  fragmentList.add(thirtlyFragment);
  fragmentList.add(fourthlyFragment);
  //ViewPager添加适配器
  viewPager.setAdapter(new MyFragmentAdapter(getSupportFragmentManager(), fragmentList));
  tabHost.getTabWidget().setDividerDrawable(null);
 }
 private void initView() {
  viewPager = (ViewPager) findViewById(R.id.vp_pager);
  tabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);//绑定tabhost
  tabHost.setup(this, getSupportFragmentManager(), R.id.vp_pager);//TabHost绑定viewpager
  //获取item的个数
  int count = title.length;
  for (int i = 0; i < count; i++) {
   //设置每个TabHost布局
   TabHost.TabSpec tabSpec = tabHost.newTabSpec(title[i])
     .setIndicator(getTabItemView(i));
   //item与fragment关联
   tabHost.addTab(tabSpec, fragmentArry[i], null);
   tabHost.setTag(i);
  }
  //初始化TabHost文字颜色
  upDateTab(tabHost);
  //给ViewPager设置适配器
  initVaper();
 }
 /**
  * 更新文字颜色。
  *
  * @param mTabHost
  */
 private void upDateTab(FragmentTabHost mTabHost) {
  for (int i = 0; i < mTabHost.getTabWidget().getChildCount(); i++) {
   TextView tv = (TextView) mTabHost.getTabWidget().getChildAt(i).findViewById(R.id.tv_item);
   if (mTabHost.getCurrentTab() == i) {//选中
    tv.setTextColor(Color.parseColor("#FF5959"));
   } else {//不选中
    tv.setTextColor(Color.parseColor("#777777"));
   }
  }
 }
 /**
  * 设置每个Item布局
  */
 private View getTabItemView(int i) {
  View view = LayoutInflater.from(this).inflate(R.layout.tab_content, null);
  ImageView itemImg = (ImageView) view.findViewById(R.id.iv_imageview);
  TextView itemText = (TextView) view.findViewById(R.id.tv_item);
  itemImg.setBackgroundResource(selectTabRes[i]);
  itemText.setText(title[i]);
  return view;
 }
 private void initData() {
 }
 private void initListener() {
  viewPager.addOnPageChangeListener(this);
  tabHost.setOnTabChangedListener(this);
 }
 @Override
 public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
 }
 @Override
 public void onPageSelected(int position) {
  TabWidget widget = tabHost.getTabWidget();
  int oldFocusability = widget.getDescendantFocusability();
  widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);//设置View覆盖子类控件而直接获得焦点
  tabHost.setCurrentTab(position);//根据位置Postion设置当前的Tab
  widget.setDescendantFocusability(oldFocusability);//设置取消分割线
 }
 @Override
 public void onPageScrollStateChanged(int state) {
 }
 @Override
 public void onTabChanged(String tabId) {
  int position = tabHost.getCurrentTab();
  viewPager.setCurrentItem(position);//把选中的Tab的位置赋给适配器,让它控制页面切换
  upDateTab(tabHost);//设置TabHost文字颜色
 }
 /**
  * 适配器
  * */
 public class MyFragmentAdapter extends FragmentPagerAdapter {
  List<Fragment> list;
  public MyFragmentAdapter(FragmentManager fm, List<Fragment> list) {
   super(fm);
   this.list = list;
  }
  @Override
  public Fragment getItem(int position) {
   return list.get(position);
  }
  @Override
  public int getCount() {
   return list.size();
  }
 }

(7)、效果图演示

三、总结

以上所述是小编给大家介绍的Android实现底部状态栏切换的两种方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • Android Studio实现标题栏和状态栏的隐藏

    Android Studio在实现隐藏标题栏和状态栏上和Eclipse是完全不一样的. 在Eclipse上隐藏标题栏和状态栏的代码如下: 方法一: requestWindowFeature(Window.FEATURE_NO_TITLE); 方法二:getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 今天在做闪屏页开发时,想把标题

  • Android 实现背景图和状态栏融合方法

    我们先看一下代码: public class MainActivity extends AppCompatActivity { ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (Build.VERSION.SDK_INT >= 21){ View decorView = getWindow().getDecorView(); deco

  • Android编程中沉浸式状态栏的三种实现方式详解

    本文实例讲述了Android编程中沉浸式状态栏的三种实现方式.分享给大家供大家参考,具体如下: 沉浸式状态栏 Google从android kitkat(Android 4.4)开始,给我们开发者提供了一套能透明的系统ui样式给状态栏和导航栏,这样的话就不用向以前那样每天面对着黑乎乎的上下两条黑栏了,还可以调成跟Activity一样的样式,形成一个完整的主题,和IOS7.0以上系统一样了. 首先看下效果 首先看下第一种方式 系统的方式沉浸式状态栏实现 步奏一 //当系统版本为4.4或者4.4以上

  • Android使用Notification在状态栏上显示通知

    在使用手机时,当有未接来电或者是新短消息时,手机会给出相应的提示信息,这些提示信息通常会显示到手机屏幕的状态栏上.Android也提供了用于处理此类信息的类,他们是Notification和NotificationManager.其中,Notification代表的是具有全局效果的通知:而NotificationManager则是用于发送Notification通知的系统服务. 使用Notification和NotificationManager类发送和显示通知也比较简单,大致可分为以下4个步骤

  • android开发修改状态栏背景色和图标颜色的示例

    本文介绍了android开发修改状态栏背景色和图标颜色的示例,分享给大家,具体如下: 修改状态栏背景色和图标颜色 默认是黑底白字的,现在要改为白底黑字的 先看下效果图: 1.状态栏背景是白色: 在style中设置 <item name="colorPrimaryDark">@color/white</item> 2.写修改状态栏图标的颜色(暂时只知道黑色和白色) public class StatusBarUtil { /** * 修改状态栏为全透明 * @pa

  • Android编程实现播放视频时切换全屏并隐藏状态栏的方法

    本文实例讲述了Android编程实现播放视频时切换全屏并隐藏状态栏的方法.分享给大家供大家参考,具体如下: 1. Demo示例: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (this.getResources().getConfiguration().ori

  • Android沉浸式状态栏 + actionBar渐变 + scrollView顶部伸缩效果

    闲话不多说,直接上图. 给大家讲讲我的编程思想吧. 第一部分:沉浸式状态栏(API-Level 19, Android4.4 KitKat 之后加入的东西),而且在Api-Level 21版本中新增了一个属性(下面会说到).所以,style文件应该声明三份. values <style name="TranslucentTheme" parent="@style/AppTheme"> </style> values-19 <style

  • Android实现底部状态栏切换的两种方式

    Android开发过程中,特别是新开的项目,底部状态栏的切换使用的频率非常的高,主要的实现方式有: (1).TabLayout + Fragment     (2).FragmentTabHost + Fragment     (3).BottomNavigationView + Fragment     (4).RidioGroup + Fragment 这里我先介绍前面两种实现方式,后面两种后期再贴出实现方式. 一.使用TabLayout + Fragment + ViewPager实现 1

  • Android 隐藏底部虚拟键的两种方法

    方法一  滑动屏幕 可重新显示出来 protected void hideBottomUIMenu() { //隐藏虚拟按键,并且全屏 if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api View v = this.getWindow().getDecorView(); v.setSystemUiVisibility(View.GONE); } else if (Build.V

  • JS实现Tab栏切换的两种方式案例详解

    面向过程的写法 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=devic

  • Android解析JSON格式数据的两种方式(JSONObject和Gson)

    目录 Json数据 JSONObject GSON 添加依赖 实际操作 实体类 总结 Json数据 接下来主要学习在Android中使用两种解析方式:JSONObject和Gson. JSONObject 比如我们有如下格式的Json数据: [{"id":"1","verison":"1.0","name":"shufu"}, {"id":"2",

  • Vue路由切换的两种方式示例详解

    目录 Vue路由切换的两种方式 1. 标签切换 1.1 <a>标签切换 1.2 路径切换 1.3 path切换 1.4 name切换(推荐) 2. js切换 Vue路由切换的两种方式 1. 标签切换 1.1 <a>标签切换 语法:<a href=“# + 路由路径”>标签内容</a> 例子: 路由规则为: const router = new VueRouter({ //路由对象数组 routes: [{ path: '/login', component:

  • Android 启动 Service(startservice和bindservice) 两种方式的区别

    Android Service 生命周期可以促使移动设备的创新,让用户体验到最优越的移动服务,只有broadcast receivers执行此方法的时候才是激活的,当 onReceive()返回的时候,它就是非激活状态. 如果没有程序停止它或者它自己停止,service将一直运行.在这种模式下,service开始于调用Context.startService() ,停止于Context.stopService(). service可以通过调用Android Service 生命周期() 或 Se

  • 详解Android提交数据到服务器的两种方式四种方法

    Android应用开发中,会经常要提交数据到服务器和从服务器得到数据,本文主要是给出了利用http协议采用HttpClient方式向服务器提交数据的方法. 代码比较简单,这里不去过多的阐述,直接看代码. /** * @author Dylan * 本类封装了Android中向web服务器提交数据的两种方式四种方法 */ public class SubmitDataByHttpClientAndOrdinaryWay { /** * 使用get请求以普通方式提交数据 * @param map 传

  • 详解android与服务端交互的两种方式

    做Android开发的程序员必须知道android客户端应该如何与服务端进行交互,这里主要介绍的是使用json数据进行交互.服务端从数据库查出数据并以json字符串的格式或者map集合的格式返回到客户端,客户端进行解析并输出到手机屏幕上. 此处介绍两种方式:使用Google原生的Gson解析json数据,使用JSONObject解析json数据 一.使用Google原生的Gson解析json数据: 记得在客户端添加gson.jar. 核心代码: 服务端: package com.mfc.ctrl

  • Android中获取状态栏高度的两种方法分享

    前言 最近在做一个关于FAB的功能的时候需要获取状态栏的高度,在网上查了很多种方法,下面是选出的比较合理的两个方法.主要参考stackoverflow的这篇问答:http://stackoverflow.com/questions/3407256/height-of-status-bar-in-android 方法一: private double getStatusBarHeight(Context context){ double statusBarHeight = Math.ceil(25

  • Android中Handler实现倒计时的两种方式

    背景: 最近项目中,正好做到登录/注册这个功能块.它需要通过发送验证码,在规定的时间内用验证码来完成登录/注册.之前的项目中也有这个功能,但是觉得太复杂了,只好自己重新实现一遍.用Handler来做,觉得代码简介,逻辑也清楚. 代码一: //在向服务端发送获取验证码成功的回调函数中,开始发消息: mHandler.obtainMessage(); mHandler.sendEmptyMessage(MSG_CODE); //消息的处理: private static final int MSG_

随机推荐