ViewPager+FragmentTabhost 解决办法

android viewpager+fragmentTabhost:直接将一个FragmentTabhost 加入到viewPager中,滑动viewPager再次返回之前FragmentTabhost

会出现java.lang.NullPointerException, 是在FragmentState.instantiate 出错。

第一次加载viewPager不会出错,第二次就会出现以上情况,解决办法如下代码:

注:TabsInfo是关键,在getItem方法中需要使用Fragment.instantiate得到一个Fragment

经测试ViewPager + fragment 不会出现以上所说情况,可以在构造的时候传递一个

ArrayList<Fragmet> list,再通过getItem 返回即可,有不正确的地方还请指正...

[1].[图片] 0815_16_24_01.png 跳至 [1] [2]

[2].[代码] [Java]代码 跳至 [1] [2]

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

import

java.util.ArrayList;

import

android.content.Context;

import

android.os.Bundle;

import

android.support.v4.app.Fragment;

import

android.support.v4.app.FragmentActivity;

import

android.support.v4.app.FragmentStatePagerAdapter;

//************************自定义pagerAdapter**********************

public

class

MviewPagerAdapter
extends

FragmentStatePagerAdapter{

    

    private

final

ArrayList<TabsInfo> lstTabsInfo;

    private

final

Context mContext;

    public

static

class

TabsInfo {

        private

final

Class<?> clss_;

        private

final

Bundle args_;

        public

TabsInfo(Class<?> clss, Bundle args) {

            this.clss_
= clss;

            this.args_
= args;

        }

    }

    public

MviewPagerAdapter(FragmentActivity activity, ArrayList<TabsInfo> lstTabsInfo) {

        super(activity.getSupportFragmentManager());

        mContext
= activity;

        this.lstTabsInfo
= lstTabsInfo;

    }

    @Override

    public

Fragment getItem(
int

position) {

        //
TODO Auto-generated method stub

        TabsInfo
info = lstTabsInfo.get(position);

        return

Fragment.instantiate(mContext, info.clss_.getName(), info.args_);

    }

    @Override

    public

int

getCount() {

        //
TODO Auto-generated method stub

        return

lstTabsInfo.size();

    }

}

//*******************应用************************

public

class

MainActivity
extends

FragmentActivity
implements

OnPageChangeListener, OnCheckedChangeListener{

    private

RadioGroup mRadioGroup;

    private

ViewPager mViewPager;

    private

ArrayList<Integer> lstCheckIds;

    private

ArrayList<TabsInfo> lstTabsInfos;

    @Override

    protected

void

onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        mRadioGroup
= (RadioGroup)findViewById(R.id.radiogroup);

        mRadioGroup.check(R.id.chengzai);

        lstCheckIds
=
new

ArrayList<Integer>();

        for(int

i=
0;
i<
5;
i++) {

            lstCheckIds.add(R.id.chengzai+i);

        }

        mRadioGroup.setOnCheckedChangeListener(this);

        mViewPager
= (ViewPager)findViewById(R.id.main_viewPager);

        lstTabsInfos
=
new

ArrayList<TabsInfo>();

        //**********此处为关键代码*************

        lstTabsInfos.add(new

TabsInfo(FireDisasterFragment.
class,
null));

        lstTabsInfos.add(new

TabsInfo(SuperviseFragment.
class,
null));

        lstTabsInfos.add(new

TabsInfo(Tab1.
class,
null));

        lstTabsInfos.add(new

TabsInfo(Tab2.
class,
null));

        lstTabsInfos.add(new

TabsInfo(Tab1.
class,
null));

        MviewPagerAdapter
adapter =
new

MviewPagerAdapter(
this,
lstTabsInfos);

        mViewPager.setAdapter(adapter);

        mViewPager.setCurrentItem(0);

        mViewPager.setOnPageChangeListener(this);

    }

    

    @Override

    public

void

onCheckedChanged(RadioGroup group,
int

checkedId) {

        //
TODO Auto-generated method stub

        for(int

i=
0;
i<lstCheckIds.size(); i++) {

            if(lstCheckIds.get(i)
== checkedId) {

                mViewPager.setCurrentItem(i);

                break;

            }

        }

    }

    

    @Override

    public

void

onPageScrollStateChanged(
int

arg0) {

        //
TODO Auto-generated method stub

        

    }

    

    @Override

    public

void

onPageScrolled(
int

arg0,
float

arg1,
int

arg2) {

        //
TODO Auto-generated method stub

        

    }

    

    @Override

    public

void

onPageSelected(
int

position) {

        //
TODO Auto-generated method stub

        mRadioGroup.check(lstCheckIds.get(position));

    }

}

//*********另附上
FireDisasterFragment(FragmentTabhost)关键代码**************

@Override

    public

View onCreateView(LayoutInflater inflater, ViewGroup container,

            Bundle
savedInstanceState) {

        //
TODO Auto-generated method stub

        Log.e("fire_oncreateview",
"oncreateview");

        

        View
view = (View)inflater.inflate(R.layout.firedisaste_layout, container,
false);

        mTabHost
= (FragmentTabHost)view.findViewById(android.R.id.tabhost);

        mTabHost.setup(getActivity(),
getChildFragmentManager(), R.id.realtabcontent);

        View
indicator = (View)inflater.inflate(R.layout.tabwidgets_layout,
null);

        TextView
textView = (TextView)indicator.findViewById(R.id.tabwidget_indicator);

        

        textView.setText("tabwidget1");

        mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator(indicator),
Tab3.
class,
null);

        

        View
indicator1 = (View)inflater.inflate(R.layout.tabwidgets_layout,
null);

        TextView
textView2 = (TextView)indicator1.findViewById(R.id.tabwidget_indicator);

        textView2.setText("tabwidget2");

        mTabHost.addTab(mTabHost.newTabSpec("tab2").setIndicator(indicator1),
Tab4.
class,
null);

        return

view;

    }

//*********************布局代码***************************

<?xml
version=
"1.0"

encoding=
"utf-8"?>

<android.support.v4.app.FragmentTabHost

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@android:id/tabhost"

    android:layout_width="match_parent"

    android:layout_height="match_parent">

    <LinearLayout

        android:orientation="vertical"

        android:layout_width="match_parent"

        android:layout_height="match_parent">

        <TabWidget

            android:id="@android:id/tabs"

            android:orientation="horizontal"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="0"/>

        <FrameLayout

            android:id="@android:id/tabcontent"

            android:layout_width="0dp"

            android:layout_height="0dp"

            android:layout_weight="0"/>

        <FrameLayout

            android:id="@+id/realtabcontent"

            android:layout_width="match_parent"

            android:layout_height="0dp"

            android:layout_weight="1"/>

    </LinearLayout>

</android.support.v4.app.FragmentTabHost>

时间: 2024-11-18 04:53:29

ViewPager+FragmentTabhost 解决办法的相关文章

##解决 ViewPager 调用 notifyDataSetChanged()无刷新:原理、解决办法##

一.原理 转自:http://www.cnblogs.com/maoyu417/p/3740209.html 转载 http://www.67tgb.com/?p=624 最近项目结束,搞了一次代码分享.其中一位同学分享了一下自己在解决问题过程中的一些心得体会,感觉受益匪浅.整理出来,分享给大家. 建议使用自己编译的android os和虚拟机,这样就可以调试android系统中的任何组件.简单说来,深入android源码,去寻找解决问题的答案.这事儿说起来简单,实际做起来还是有些难度的.我也曾

ViewPager不能高度自适应?height=wrap_content 无效解决办法

ViewPager用的很多,主要用啦展示广告条.可是高度却不能自适应内容,总是会占满全屏,即使设置android:height="wrap_content"也是没有用的.. 解决办法其实网上有很多,但是个人感觉不是很好 比如:LinearLayout的时候, 使用weight来自动调整ViewPager的高度. 一般的代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android

android viewpager fragment切换时界面卡顿解决办法

目前开发的程序在切换View时界面卡顿现象比较严重,影响用户体验,当前项目共就四个View,每个View也只是按钮,所以可以同时加载,不让其它view销毁. 只需在Adapter中重载destroyItem类即可 @Override public void destroyItem(ViewGroup container, int position, Object object) { //重载该方法,防止其它视图被销毁,防止加载视图卡顿 //super.destroyItem(container,

Toolbar 和 CollapsingToolbarLayout一起使用时menu item无点击反应解决办法

昨天一直在琢磨为什么Toolbar和CollapsingToolbarLayout一起使用时menu item无点击放应的原因,后来在stackoverflow上一条回答,说可能是Toolbar的背景颜色太深导致点击时的水波纹不明显.这个启发了我,会不会是跟toolbar的背景有关呢?贴上代码: <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res

关于BadgeView遇到的一个奇怪的问题和解决办法

今天继续完成即时通讯界面模块的开发,想模仿微信和QQ弄个消息提醒的小气泡,就是一有消息到来,会在相应的控件上显示消息数目的红色气泡.因为曾经有了解过有个开源项目能实现这种结果,便开始downLoad下来使用了,这个开源项目是--BadgeView,功能实现很简单,调用更为简单,没什么难度.但是在开发中却遇到了一个问题,就是结合Viewpager+Fragment的滑动切换按钮,在按钮处加上badgeView后,却使得原先可以滑动和点击的按钮不在具备此功能,甚至已经被badgeView覆盖,根本看

如何用 Android Studio 导入开源项目以及常见错误的解决办法

声明:这篇文章完全来自这篇文章,感谢大神的相助.这篇文章纯粹是为了备份. 本篇以Github上最热门的MaterialDesign库,MaterialDesignLibrary来介绍怎样使用Android Sudio导入开源项目的,如果你和我一样刚刚从Eclipse转到AS,那本篇文章非常适合你. 如果不引入任何第三方库,不做自动化分渠道打包等操作,那可以在完全不了解Gradle的情况下进行Android项目的开发.但如果要想导入Github上的热门项目,必须首先熟悉Gradle. 1. Gra

phpstudy无法访问主页,提示You don&#39;t have permission to access / on this server解决办法

1.输入localhost提示:You don't have permission to access / on this server. 新版phpStudy为了安全,取消Apache和nginx列出目录内容. phpStudy如何禁止或允许站点目录列表 请使用『其他选项菜单』-『phpStudy设置』-『允许目录列表』,打上对勾表示允许目录列表,去掉对勾表示禁止目录列表. 2.配置多域名的虚拟主机总是失败,提示You don't have permission to access / on

MySQL 警告WARN: Establishing SSL connection without server&#39;s identity verification is not recommended.解决办法

Success loading Mysql Driver!Mon Apr 04 15:43:00 CST 2016 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by d

mp4网页播放代码,有声音无图像的解决办法~

mp4网页播放代码,有声音无图像的解决办法~ 关于网页播放mp4格式的视频,找了一些插件,这里推荐一下video.js 官方网址:http://www.videojs.com/ github :https://github.com/videojs/video.js/ demo:http://www.videojs.com/downloads/video-js-4.12.5.zip 使用方法: ①引入文件:指派flash播放的swf文件 <link href="//example.com/p