最近项目中使用fragment时遇到了一些问题:

1、fragment的刷新问题。

解决:我的情况是有多个fragment时,只需要刷新其中几个界面。之前我在网上看到的一些方法。如下:

首先在Adapter的getItemPosition()方法根据要刷新的界面,返回POSITION_NONE(一个标志)。就如我要刷新的fragment的类名叫NewsMainFragment,于是添加判断,当fragment的类名是NewsMainFragment时,就刷新这个界面。

@Override
public int getItemPosition(Object object) {
// TODO Auto-generated method stub
if (object.getClass().getName()
.equals(NewsMainFragment.class.getName())) {
return POSITION_NONE;
}
return super.getItemPosition(object);
}

  接着,在管理fragment的Activity中执行adapter的notifyDataSetChanged()方法(一般是在onResume()方法中执行)。

  就在我以为找到了人生希望时,蛋疼的事情发生了,这个方法好像没什么卵用呀,界面并没有更新,我也不鸡道为什么。

于是我使用了第二种方法

在Fragment中当使用startActivityForResult(Intent intent,int requestcode) 方法调用外部的activity。Activity执行完毕之后,返回执行结果。

Intent intent_channel = new Intent(getActivity(),
ChannelActivity.class);
startActivityForResult(intent_channel, CHANNELREQUEST);
Intent intent = new Intent(this, MainActivity.class);
setResult(, intent);

一般大多数人都会使用onActivityforResult来接受返回值。但是直接在该Fragment中是无法直接接收到返回值的。
 
处理方法就是在在与其绑定的FragmentActivity中重写onActivityResult方法就可以接收到返回值。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
/* 在这里,我们通过碎片管理器中的Tag,resultCode是每个碎片的名称,来获取对应的fragment */
Fragment f = adapter.getItem();
/* 然后在碎片中调用重写的onActivityResult方法 */
f.onActivityResult(requestCode, resultCode, data);
}

让Activity去掉用fragment的onActivityResult()方法。接着需要在fragment重写onActivityResult()方法。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case CHANNELREQUEST:
if (resultCode == CHANNELRESULT) {
setChangelView();
}
break;
default:
break;
}
super.onActivityResult(requestCode, resultCode, data);
}

setChangelView()是我写的方法,用来重新绘制界面。

然而,还是不行,哥我受到了深深了打击,花了3天时间也没有找出为什么,就在哥快要悬梁自尽的时候,在网上看到有人说,管理fragment用getSupportFragmentManager()取得管理器,fragment管理子fragment要用getChildFragmentManager()方法取得管理器。当时哥差点吐血,就一个单词的区别,哥花了3天的时间。。。

mAdapetr = new NewsFragmentAdapter(getChildFragmentManager(), count,
userChannelList);
public NewsFragmentAdapter(FragmentManager fm, int count,ArrayList<ChannelItem> userChannelList) { …… }

2、获取控件宽度高度问题。

解决:在onCreate方法不能直接获取到控件的宽度和高度,应该在Activity渲染完成后,即回调onWindowFocusChanged()时可以获取到这些值。

3、Fragment(XXFragment) not attached to Activity 异常。

解决:出现该异常,是因为Fragment的还没有Attach到Activity时,调用了如getResource()等,需要上下文Content的函数。解决方法,就是等将调用的代码写在OnStart()中。

4、碎片还原闪退问题:运行时有时会出现闪退,提示没有空的构造器。

Fragment - InstantiationException: no empty Constructor

解决:确保碎片类存在默认的构造函数。即加入一个空的构造器。

private Entity mEntity;
public YourFragment() {}
public static YourFragment getInstance(Entity mEntity) {
YourFragment fragment = new YourFragment();
fragment.mEntity = mEntity;
return fragment;
}

5、有关碎片的一些概念:

Android碎片

1,Fragment,①:重用,②:可用性

2,碎片可以视为子活动,没有活动就无法使用碎片。(类似于多个活动在同一个屏幕),使用碎片,后退按钮可以在一个碎片栈中逐步后退,同时任处于活动中。

3,活动是Context子类,碎片是从android.app中的Object扩展而来,可以扩展Fragment来改写它的行为。

4,碎片还原:①,确保碎片类存在默认的构造函数,②:在创建新碎片后立即添加一参数包,使后续方法可正确设置碎片,也使系统可在比较时正确还原碎片。

5,后退栈由活动附带的碎片管理器来管理,管理后退按钮行为的方式。

6,碎片有一个标识和一个ID。

7,碎片可以在重新创建时将状态保存到一个包对象中,这个包对象会被回送到该碎片的onCreate,onInflate,onCreateView,onActivityCreated等回调。

8,碎片生命周期。 setRetainInstance()回调可以指定是否重新创建碎片

9,使用FragmentTransaction来管理多个碎片统一回滚。setTransition为碎片添加过渡和动画,必须在replace()之前执行。

10,FragmentManager组件负责管理属于一个活动的碎片。

11,碎片间的通信方式:①直接通信,callCustomMethod(xxx,xxx)②使用startActivityForResult(),③ 使用setTargetFragment();

12,ObjectAnimator自定义动画(适用于view),FragmentTransaction类指定自定义动画的唯一方法是setCustomAnimations(),接收两个资源id参数,一进入,二退出

我的第一个博客——Fragment遇到的问题的更多相关文章

  1. 第一篇博客:Hello World

    2016年10月10日,双十,好日子,决定开始写第一篇博客,标题想了会,就叫Hello World 吧,哈哈^_^. 首先感谢博客园的管理们能批准我的申请,记得在14年的时候申请过一次,竟然没申请通过 ...

  2. 我的第一篇博客 ——【ToDoList】小程序开发

    我是一只即将大四的大三狗,这是我的第一篇博客,说来惭愧.今年1月份,学校放寒假的时候开始自学的IOS,放假的时候比较起劲,看了一堆Object-C的视频,然后照着中英文对照的IOS基础开发教程,做了两 ...

  3. Hello World -- 第一篇博客

    今年注定是不寻常的一年,因为技术,接触了许多大牛.通过一篇篇博文,看到了大牛们勤奋好学.孜孜不倦的精神,于是决定也开个博客,向大牛学习. 博客开了,写点什么呢?奈何肚子里墨水不多,吐出来也多是白沫,不 ...

  4. Ginger的第一篇博客

    怀着无感的心情,没有技术的身体,写下第一篇博客作为标记. 目前应该会搞清楚数据结构上相关的操作.算法,然后用c语言实现后记录在博客. 我是有目标的咸鱼! 2019/4/19

  5. “Hello, my first blog”------第一篇博客的仪式感

    本人在校大学生一枚,开通博客,主要是想记录自己的学习过程,分享自己的学习经历.记得大一的时候,很多不懂的操作和知识,都是在博客上找到了相应的解决办法.但比较讽刺的是,很多时候,曾经解决了的问题,当再次 ...

  6. 我的第一篇博客。(JavaScript的声明和数据类型的一些笔记)

    这是我的第一篇博客,务必请大家多多关照. 下面是前端js的变量和数据类型的一些笔记,不是很全请多多包涵. 1.变量 变量的声明 var 变量名 变量这个容器中放的是数据 变量的赋值 变量名 = 数据 ...

  7. 我的第一篇博客:不用sizeof求int的bit数

    我的第一篇博客..  还不会什么高端的东西就来点基础的. 不用sizeof求int的bit数 //不用sizeof求int的bit数 #include<stdio.h> int main( ...

  8. 第一篇博客 安装open live writer

    第一篇博客安装open live writer http://openlivewriter.org/ 有的人可能会打不开,所以我准备了一个百度云的链接地址 链接:https://pan.baidu.c ...

  9. C博客作业00—我的第一篇博客

    C博客作业00-我的第一篇博客 1. 你对网络专业或者计算机专业了解是怎样? 泛泛了解 - 原先只知道网络工程隶属于计算机工程学院,与院中其他专业一样,同样都需要学习大量的计算机基础知识,然后再分支学 ...

随机推荐

  1. 利用目录函数(opendir,readdir,closedir)查找文件个数

    如何知道一个目录下的所有文件个数呢?或许可以用tree来学(zhuang)习(bi)的同时知道文件个数.Linux系统io函数为我们提供了目录操作函数,其中有一个比较重要(实际上有三个,因为它们经常配 ...

  2. MOBA项目问题记录

    1,动态变化的文本,使用较多时,耗时大,原因:只要字符串发生改变就会重绘,原理:每个字符的宽度不一样 项目中使用了网上写的一个文本控件,大概类型UGUI的东西,实现了字符缓存,绘制过的字符就不会再重建 ...

  3. Nexus3忘记admin密码时的解决办法

    其实具体步骤官网上也已经说的挺清楚了-- https://support.sonatype.com/hc/en-us/articles/213467158-How-to-reset-a-forgott ...

  4. $event Object angularjs

    You can pass the $event object as an argument when calling the function. The $event object contains ...

  5. 【380】python 获取列表排序后的索引列表

    参考:Equivalent of Numpy.argsort() in basic python? - Stack Overflow 通过 enumerate 实现 [i for i,v in sor ...

  6. 删除oracle数据库用户

    手工删除ORACLE数据库用户时常会出现会话进程仍在使用导致删除失败的情况.需要查询会话并将会话删除才能成功将数据库用户删除,比较不方便. 适用场景 自动删除oracle数据库用户 基本知识 orac ...

  7. OPENWRT路由3G拔号实验

    以下摘自:http://www.right.com.cn/forum/thread-155168-1-1.html 首先下载 Barrier Breaker 14.07 固件 配置好网络,可以访问到i ...

  8. 记Dagger2使用过程中的一个BUG--compileGoogleDebugJavaWithJavac

    项目编译可以通过,不过没有生成Dagger2的类,导致无法运行项目.. 错误提示 Error:(14, 41) 错误: 找不到符号 符号: 类 DaggerAppComponent 位置: 程序包 c ...

  9. python模拟线性回归的点

    构造符合线性回归的数据点 import numpy as np import tensorflow as tf import matplotlib.pyplot as plt # 随机生成1000个点 ...

  10. Dubbo启动过程(Spring方式)详解

    一.使用Spring xml配置方式的启动过程 1. 解析XML,注册Bean 2. 监听Spring事件 3. 启动或关闭dubbo 二.详细过程 1. 解析XML,注册Bean 利用Spring提 ...