ViewPager和Tabhost结合,可滑动的tabhost

article/2025/9/9 21:47:14


有朋友反映资源下载下来有问题,我看了下,确实是,已更新下面文章中的代码和资源,现在可以好好的跑起来了,另外还改动了个小地方的逻辑,因为我在使用中出了点小错,需要的可以试下。另外,在使用中,注意下子activity中的上下文context,有可能有错,具体的东西在源码里有。

源码下载:https://github.com/qianjin/TestTabHost (csdn我传不上来,传到git去了)


可滑动的Tabhost,借助了surporrtV13,V4也差不多,一样的。

二者结合,当tabhost的tabbar点击的时候,viewPager滑动,滑动viewPager的时候,tabbar切换。tabbar的样式进行了重新布局,当然,你也可以自己定义自己的,详情看代码吧(下面有源码下载的地址)。

首先你要先在项目下建个libs把surporrtV13的jar包放进去。

效果图:



/*** Program  : ViewPagerActivity.java* Author   : qianj* Create   : 2012-5-31 下午2:02:15*/package cn.learn.tabhosttest;import java.util.ArrayList;
import java.util.List;import android.app.Activity;
import android.app.LocalActivityManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TextView;
/*** * @author qianj* @version 1.0.0* @2012-5-31 下午2:02:15*/
public class ViewPagerActivity extends Activity {List<View> listViews;Context context = null;LocalActivityManager manager = null;TabHost tabHost = null;private ViewPager pager = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.viewpager);context = ViewPagerActivity.this;pager  = (ViewPager) findViewById(R.id.viewpager);//定放一个放view的list,用于存放viewPager用到的viewlistViews = new ArrayList<View>();manager = new LocalActivityManager(this, true);manager.dispatchCreate(savedInstanceState);Intent i1 = new Intent(context, T1Activity.class);listViews.add(getView("A", i1));Intent i2 = new Intent(context, T2Activity.class);listViews.add(getView("B", i2));Intent i3 = new Intent(context, T3Activity.class);listViews.add(getView("C", i3));tabHost = (TabHost) findViewById(R.id.tabhost);tabHost.setup();tabHost.setup(manager);//这儿主要是自定义一下tabhost中的tab的样式RelativeLayout tabIndicator1 = (RelativeLayout) LayoutInflater.from(this).inflate(R.layout.tabwidget, null);  TextView tvTab1 = (TextView)tabIndicator1.findViewById(R.id.tv_title);tvTab1.setText("第一页");RelativeLayout tabIndicator2 = (RelativeLayout) LayoutInflater.from(this).inflate(R.layout.tabwidget,null);  TextView tvTab2 = (TextView)tabIndicator2.findViewById(R.id.tv_title);tvTab2.setText("第二页");RelativeLayout tabIndicator3 = (RelativeLayout) LayoutInflater.from(this).inflate(R.layout.tabwidget,null);  TextView tvTab3 = (TextView)tabIndicator3.findViewById(R.id.tv_title);tvTab3.setText("第三页");Intent intent = new Intent(context,EmptyActivity.class);//注意这儿Intent中的activity不能是自身,所以我弄了个空的acitivitytabHost.addTab(tabHost.newTabSpec("A").setIndicator(tabIndicator1).setContent(intent));tabHost.addTab(tabHost.newTabSpec("B").setIndicator(tabIndicator2).setContent(intent));tabHost.addTab(tabHost.newTabSpec("C").setIndicator(tabIndicator3).setContent(intent));pager .setAdapter(new MyPageAdapter(listViews));pager .setOnPageChangeListener(new OnPageChangeListener() {@Overridepublic void onPageSelected(int position) {//当viewPager发生改变时,同时改变tabhost上面的currentTabtabHost.setCurrentTab(position);}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageScrollStateChanged(int arg0) {}});//点击tabhost中的tab时,要切换下面的viewPagertabHost.setOnTabChangedListener(new OnTabChangeListener() {@Overridepublic void onTabChanged(String tabId) {if ("A".equals(tabId)) {pager.setCurrentItem(0);} if ("B".equals(tabId)) {pager.setCurrentItem(1);} if ("C".equals(tabId)) {pager.setCurrentItem(2);} }});}private View getView(String id, Intent intent) {return manager.startActivity(id, intent).getDecorView();}private class MyPageAdapter extends PagerAdapter {private List<View> list;private MyPageAdapter(List<View> list) {this.list = list;}@Overridepublic void destroyItem(View view, int position, Object arg2) {ViewPager pViewPager = ((ViewPager) view);pViewPager.removeView(list.get(position));}@Overridepublic void finishUpdate(View arg0) {}@Overridepublic int getCount() {return list.size();}@Overridepublic Object instantiateItem(View view, int position) {ViewPager pViewPager = ((ViewPager) view);pViewPager.addView(list.get(position));return list.get(position);}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic void restoreState(Parcelable arg0, ClassLoader arg1) {}@Overridepublic Parcelable saveState() {return null;}@Overridepublic void startUpdate(View arg0) {}}}




http://chatgpt.dhexx.cn/article/FtpJMD6u.shtml

相关文章

TabSpec和TabHost实例

TabSpec与TabHost TabHost相当于浏览器中浏览器分布的集合&#xff0c;而Tabspec则相当于浏览器中的每一个分页面。d在Android中&#xff0c;每一个TabSpec分布可以是一个组件&#xff0c;也可以是一个布局&#xff0c;然后将每一个分页装入TabHost中&#xff0c;TabHost即可将…

Android中的TabHost

介绍 有时&#xff0c;我们想在一个window中显示多个视图&#xff0c;这时就需要用到Tab容器。在Android里它叫TabHost。 使用TabHost有两种方式&#xff1a; 在相同的activity中使用TabHost导航多个视图使用TabHost导航多个Activity(通过intents) Tab应用的结构 TabHost的A…

Android修行手册 - TabHost回忆

往期文章分享 点击跳转>《导航贴》- Unity手册&#xff0c;系统实战学习点击跳转>《导航贴》- Android手册&#xff0c;重温移动开发 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过…

Android TabHost的使用

1. 最简单的TabHost&#xff0c;Tab来自于layout下的元素 &#xff08;只从1个Layout中取数据&#xff09; &#xff08;1&#xff09;效果图 &#xff08;2&#xff09;代码 1&#xff09;tab_demo.xml <?xml version"1.0" encoding"utf-8"?&g…

TabHost详解

前言&#xff1a;今天仔细研究了下TabHost&#xff0c;主要是为了实现微信底部导航栏的功能&#xff0c;最后也给出一个链接&#xff0c;这位老兄用TabHost基本做出来了微信导航栏。 正文 TabHost的实现分为两种&#xff0c;一个是不继承TabActivity&#xff0c;一个是继承自…

Android选项卡TabHost功能和用法

1、选项卡TabHost介绍 TabHost可以方便地在窗口上放置多个标签页&#xff0c;每个标签页相当于获得了一个与外部容器大小相同的组件摆放区域 TabHost是一个简单的容器&#xff0c;提供如下两种方法来创建选项卡 newTabSpec(String tag):创建选项卡 addTab(TabHost.TabSpec tabS…

[Android] 选项卡组件TabHost

Tab选项卡实现多个分页之间的快速切换&#xff0c;每个分页可以显示不同的内容&#xff0c;在Android平台提供了TabHost组件实现Tab选项卡的功能&#xff0c;选项卡组件的主要功能是可以进行应用程序分类管理。 每个选项卡称为一个Tab&#xff0c;而包含这多个选项卡的容器称为…

交叉熵:计算交叉熵损失函数nn.CrossEntropyLoss()

首先要提出的问题是。。。什么是损失函数&#xff1f;干什么的&#xff08;功能&#xff09;&#xff1f;类型有哪些&#xff1f; 1.什么是损失函数&#xff1f; 损失函数&#xff08;loss function&#xff09;或 代价函数&#xff08;cost function&#xff09;是将随机事件或…

softmax函数与交叉熵损失函数

本文主要介绍了当前机器学习模型中广泛应用的交叉熵损失函数与softmax激励函数。 这个损失函数主要应用于多分类问题&#xff0c;用于衡量预测值与实际值之间的相似程度。 交叉熵损失函数定义如下: L C E ( y ^ , y ∗ ) − ∑ i 1 N c l a s s e s y i ∗ l o g ( y i ^ …

【交叉熵损失函数】关于交叉熵损失函数的一些理解

目录 0. 前言1.损失函数&#xff08;Loss Function&#xff09;1.1 损失项1.2 正则化项 2. 交叉熵损失函数2.1 softmax2.2 交叉熵 0. 前言 有段时间没写博客了&#xff0c;前段时间主要是在精读一些计算机视觉的论文&#xff08;比如yolov1&#xff09;&#xff0c;以及学cs23…

CrossEntropy交叉熵损失函数及softmax函数的理解

参考链接1 参考链接2 参考链接3 参考链接4 &#xff08;一&#xff09;什么是Sigmoid函数和softmax函数&#xff1f; 提到二分类问题容易想到逻辑回归算法&#xff0c;而逻辑回归算法最关键的步骤就是将线性模型输出的实数域映射到[0, 1]表示概率分布的有效实数空间&#xff…

【基础篇】交叉熵损失函数(Cross Entropy Loss)

文章目录 1. 理论知识2. 代码 1. 理论知识 我们需要关注那些按常理来说不太可能发生的事情。『信息量』就是用来度量事件的不确定性&#xff0c; 事件包含的信息量应与其发生的概率负相关 。假设 X X X是一个离散型随机变量&#xff0c;它的取值集合为 { x 1 , x 2 , . . . ,…

损失函数-交叉熵的推导和二分类交叉熵

交叉熵 期望&#xff1a; 期望就是所有随机变量的均值。 E(X)X1*P&#xff08;X1&#xff09;X2*P&#xff08;X2&#xff09;X3*P&#xff08;X3&#xff09; 熵&#xff1a; 熵表示所有信息量的期望。 信息量如何计算呢&#xff1f; 概率值取Log&#xff0c;然后加个负…

深度学习中的损失函数(交叉熵)

0、前景介绍 对于线性回归模型适用于输出为连续值的情景&#xff0c;但是在模型输出是一个像图像类别这样的离散值时。对于这样离散值的预测问题&#xff0c;通常使用一些例如sigmoid/softmax的分类模型。 1. 图像分类任务 假设下面两个模型都是通过softmax的方式得到对于每…

图示Softmax及交叉熵损失函数

Softmax函数 Softmax是将神经网络得到的多个值&#xff0c;进行归一化处理&#xff0c;使得到的值在之间&#xff0c;让结果变得可解释。即可以将结果看作是概率&#xff0c;某个类别概率越大&#xff0c;将样本归为该类别的可能性也就越高。Softmax就如下图&#xff08;借鉴李…

最全的交叉熵损失函数(Pytorch)

损失函数 引言BCELossBCEWithLogitsLossNLLLossCrossEntropyLoss总结参考 引言 这里主要讲述pytorch中的几种交叉熵损失类&#xff0c;熵是用来描述一个系统的混乱程度,通过交叉熵我们就能够确定预测数据与真是数据之间的相近程度。交叉熵越小&#xff0c;表示数据越接近真实样…

简单的交叉熵损失函数,你真的懂了吗?

个人网站&#xff1a;红色石头的机器学习之路 CSDN博客&#xff1a;红色石头的专栏 知乎&#xff1a;红色石头 微博&#xff1a;RedstoneWill的微博 GitHub&#xff1a;RedstoneWill的GitHub 微信公众号&#xff1a;AI有道&#xff08;ID&#xff1a;redstonewill&#xf…

交叉熵损失概念

交叉熵是信息论中的一个概念&#xff0c;要想了解交叉熵的本质&#xff0c;需要先从最基本的概念讲起。 1. 信息量 首先是信息量。假设我们听到了两件事&#xff0c;分别如下&#xff1a; 事件A&#xff1a;巴西队进入了2018世界杯决赛圈。 事件B&#xff1a;中国队进入了2…

softmax交叉熵损失函数深入理解(二)

0、前言 前期博文提到经过两步smooth化之后&#xff0c;我们将一个难以收敛的函数逐步改造成了softmax交叉熵损失函数&#xff0c;解决了原始的目标函数难以优化的问题。Softmax 交叉熵损失函数是目前最常用的分类损失函数&#xff0c;本博文继续学习Softmax 交叉熵损失函数的改…

史上最全交叉熵损失函数详解

在我们自学神经网络神经网络的损失函数的时候会发现有一个思路就是交叉熵损失函数&#xff0c;交叉熵的概念源于信息论&#xff0c;一般用来求目标与预测值之间的差距。比如说我们在人脑中有一个模型&#xff0c;在神经网络中还有一个模型&#xff0c;我们需要找到神经网络模型…