Android用tabhost实现 界面切换,每个界面为一个独立的activity操作

我就废话不多说了,大家还是直接看代码吧~

// 要extends TabActivity
public class Main_activity extends TabActivity {
  private TabHost tabHost;// 建立Tabhost控件

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    tabHost = getTabHost();
    addTab("act1", "界面1", blue_tooth_Activity.class);//添加
    addTab("act2", "界面2", map_Activity.class);
    addTab("act3", "界面3", plane_parameter_activity.class);

    setContentView(tabHost);// 显示

  }
  /**
   * 添加Activity标签
   * @param tag  标识
   * @param title 标签标题
   * @param clazz 激活的界面
   */
  private void addTab(String tag, String title, Class clazz) {
    TabHost.TabSpec tabSpec = tabHost.newTabSpec(tag);
    tabSpec.setIndicator(title);

    Intent intent = new Intent(getApplicationContext(),clazz);
    tabSpec.setContent(intent);
    tabHost.addTab(tabSpec);
  }

  @Override
  protected void onStop() {
    super.onStop();
  }
}

补充知识:Android BLE中传输数据的最大长度怎么破

好多小伙伴们都被一个事儿困扰过:

想在gatt client上(一般是手机上)传输长一点的数据给gatt server(一般是一个Bluetooth smart设备,即只有BLE功能的设备),但通过

writeCharacteristic(BluetoothGattCharacteristic)

来写的时候发现最多只能写入20个byte的数据。

这篇文章会回答下面几个问题:

1)为什么会是20?

2)如何突破20?

3)如何更优雅的来实现?

第一个问题,为什么为限制成20个字节?

core spec里面定义了ATT的默认MTU为23个bytes,除去ATT的opcode一个字节以及ATT的handle2个字节之后,剩下的20个字节便是留给GATT的了。

考虑到有些Bluetooth smart设备功能弱小,不敢太奢侈的使用内存空间,因此core spec规定每一个设备都必须支持MTU为23。

在两个设备连接初期,大家都像新交的朋友一样,不知对方底细,因此严格的按照套路来走,即最多一次发20个字节,是最保险的。

由于ATT的最大长度为512byte,

因此一般认为MTU的最大长度为512个byte就够了,再大也没什么意义,你不可能发一个超过512的ATT的数据,就像是孙猴子跑不过五行山一样。

所以ATT的MTU的最大长度可视为512个bytes。

第二个问题,如何突破20?

很简单嘛,改变传输的ATT的MTU就行了,大家经过友好的协商,得到双方都想要的结果,是最好的。在Android上(API 21),改变ATT MTU的接口为:

public boolean requestMtu (int mtu) Added in API level 21 Request an MTU size used for a given connection. When performing a write request operation (write without response), the data sent is truncated to the MTU size. This function may be used to request a larger MTU size to be able to send more data at once. A onMtuChanged(BluetoothGatt, int, int) callback will indicate whether this operation was successful. Requires BLUETOOTH permission. Returns true, if the new MTU value has been requested successfully

大声的说出来你想要一下子传多少,调用上面的接口就可以了,然后在下面的函数中看最终结果(当然了,如果你的peripheral申请改变MTU并且成功的话,那这个回调也会被调用):

@Override
public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
  super.onMtuChanged(gatt, mtu, status);

  if (status == BluetoothGatt.GATT_SUCCESS) {
    this.supportedMTU = mtu;//local var to record MTU size
  }
}

之后你就可以快乐的发送supportedMTU-3的长度的数据了。

第三个问题,如何优雅的来实现?

俗话说得好,郎有情就怕妾无意。万一对方设备不同意你的请求怎么办?

对于app来说,一般是知道自己要最大发送多少数据的,例如一次要发100个bytes,那么就首先试试申请一下103,失败的话,则申请一下53,即二分法,剩下的只能自己分段拆着发了。

一般来讲,app的开发者和对端设备的开发者都是同一伙儿人,这是好事儿,他们可以根据自己设备的硬件情况,来商量MTU应该是多少。

总之,把事儿摆到桌面上,提前做好,会使得你的程序更加professional。

以上这篇Android用tabhost实现 界面切换,每个界面为一个独立的activity操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Android开发之微信底部菜单栏实现的几种方法汇总

     实现方式 实现的方式有很多种 这里总结最常见的几种方式,以后再添加其他的. viewPager + RadioGroup viewPager + FragmentTabHost viewpager +TabLayout viewPager+RadioGroup 感觉这是最简单的一个了,我也就不贴代码 说说我理解的思路吧 通过给pager 和RadioGroup 添加监听,监听两个控件的变化 实现联动 当viewPager的显示pager改变就会触发监听 ,在监听中选中对应的RadioButto

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

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

  • Android用tabhost实现 界面切换,每个界面为一个独立的activity操作

    我就废话不多说了,大家还是直接看代码吧~ // 要extends TabActivity public class Main_activity extends TabActivity { private TabHost tabHost;// 建立Tabhost控件 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); tabHost = getTabHost(); addT

  • Android实现Activity界面切换添加动画特效的方法

    本文以实例形式展示了Android实现Activity界面切换添加动画特效的方法,对于Android程序设计人员来说有很好的参考借鉴价值.具体方法如下: 了解Android程序设计的人应该知道,在Android 2.0之后有了overridePendingTransition(),其中里面两个参数,一个是前一个activity的退出,另一个activity的进入. 现看看下面这段示例代码: @Override public void onCreate(Bundle savedInstanceSt

  • Android应用中使用ViewPager实现类似QQ的界面切换效果

    这几天在研究ViewPager,简单的写一下如何使用ViewPager实现类似于QQ的"最近联系人.好友.群组"的界面切换(不知道他们是不是用这个方法实现的). ViewPager已经在android-sdk中加入了,具体的位置在%android_sdk_home%\android-compatibility\v4,%android_sdk_home%是你的android-sdk-windows目录. 好,下面放一张效果图: 步骤一:新建一个工程,我的是Viewpager 步骤二:导入

  • Android组件TabHost实现页面中多个选项卡切换效果

    TabHost组件可以在界面中存放多个选项卡, 很多软件都使用了改组件进行设计. 一.基础知识 TabWidget : 该组件就是TabHost标签页中上部 或者 下部的按钮, 可以点击按钮切换选项卡; TabSpec : 代表了选项卡界面, 添加一个TabSpec即可添加到TabHost中; -- 创建选项卡 : newTabSpec(String tag), 创建一个选项卡; -- 添加选项卡 : addTab(tabSpec); 二.实例讲解 TabHost的基本使用,主要是layout的

  • Activity取消界面切换的默认动画方法(推荐)

    一般启动一个新的Activity都默认有切换的动画效果,比如界面从右至左的移动. 但是有些时候我们不需要这个动画,怎么办? 操作方法比较麻烦,这里我推荐其中一种.我这里是要做启动页splash到首页Home无缝展示,即启动页的图片背景和首页最上层的悬浮背景图是一模一样,用户会以为还在启动页,我这里会做些动画,然后进行开门效果.(首页会多出2个按钮,此时就不是启动页了) 主要实现思路: 1.需要设置无动画效果的主题,应用到对应的界面. 2.在启动页面界面结束时,需要增加一个方法 overrideP

  • Android用ActionBar高仿微信主界面的实例代码

    经过前面两篇文章的学习,我想大家对ActionBar都已经有一个相对较为深刻的理解了.唯一欠缺的是,前面我们都只是学习了理论知识而已,虽然知识点已经掌握了,但是真正投入到项目实战当中时会不会掉链子还很难说.那么不用担心,本篇文章我就将带领大家一起进入ActionBar的应用实战,将理论和实践完美结合到一起. 如果你还没有看过我的前两篇文章,建议先去阅读一下 Android ActionBar完全解析使用官方推荐的最佳导航栏(上)和 Android ActionBar完全解析使用官方推荐的最佳导航

  • fragment实现隐藏及界面切换效果

    在前文中的效果中(Android如何创建自定义ActionBar),点击屏幕下方的 TextView 以此来实现 5 种 fragment 界面的切换. 由于网络数据的加载存在于不同的界面之中,当快速的切换界面时,就会出现程序的出错.因为快速的切换时,当前界面的数据还在读取,就切换到下一个界面,下一个界面也开始加载数据,每次界面的切换都会加载数据.这样就会出错(在本文中,fragment 是使用 replace() 方法来加载界面的,).所以可以使每个 fragment 只加载一次来减少数据的加

  • Android Studio实现仿微信APP门户界面详解及源码

    目录 前言 界面分析 界面动态实现代码 静态界面实现 总结 前言 你好! 本文章主要介绍如何用Android Studio制作简易的门户界面,主要说明框架的各部分功能与实现过程,结尾处附有源码. 界面分析 注:按钮图标是从阿里矢量图标库获取,保存在drawable文件中调用. 首先根据我们的大致规划布局,我们可以先建立三个核心XML文件: top.xml: <?xml version="1.0" encoding="utf-8"?> <Linear

  • Android实现网易云推荐歌单界面

    目录 前言 一.实现 1.自定义一个圆角图片控件(也可直接使用第三方框架) 2.进行布局摆设 3.图片切换动画效果 二.实现效果展示 三.总结 先来看看网易云APP的效果: 前言 关于网易云音乐推荐歌单界面的实现 一.实现 1.自定义一个圆角图片控件(也可直接使用第三方框架) 由于是一些简单的绘制,就不一一介绍了,直接上代码. public class MellowImageView extends ImageView { private Paint paint; public MellowIm

  • Unity iOS混合开发界面切换思路解析

    思路 之前一篇文章里面只谈到了Unity和iOS工程的融合,并没有谈到iOS和Unity界面的切换,这里谈谈思路,Unity导出的iOS工程里面的结构大致是这样的,有一个Window,Window上有一个UnityView,但是并没有控制器,也没有根控制器,虽然在导出的iOS工程中Classes文件夹下的UnityAppController中有rootController的属性,但是上面也标注为空~ 所以,思路就只有一种,,既然Unity导出的iOS工程有一个Window并没有控制器,那好,混合

随机推荐