博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我的第一个博客——Fragment遇到的问题
阅读量:6802 次
发布时间:2019-06-26

本文共 3779 字,大约阅读时间需要 12 分钟。

最近项目中使用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(10, 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(1);        /* 然后在碎片中调用重写的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
userChannelList) { …… }

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

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

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

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

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

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

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参数,一进入,二退出

转载于:https://www.cnblogs.com/Jackie-zhang/p/5178041.html

你可能感兴趣的文章
Elastix2.3安装与配置
查看>>
数据的载体
查看>>
软件架构--分享软件架构图
查看>>
用电脑自带画图工具加字方法
查看>>
惠普服务器10年中的五大错五大幸
查看>>
linux下openssh完全实施方案(含公钥加密安全访问技术)
查看>>
imagemagick生成缩咯图+水印
查看>>
lpar划分
查看>>
MRv2内存监控强杀Container问题解决
查看>>
内网不能通过外网来访问内网的服务器原因分析(外网可以)
查看>>
我的友情链接
查看>>
haproxy 安装与配置以及遇到的问题
查看>>
SQL Server 事务
查看>>
Python变量、数据类型与运算符
查看>>
我的友情链接
查看>>
利用掌握的路由知识解决现实环境中的问题
查看>>
部署SCDPM 2012R2 2.部署SCDPM 2012R2
查看>>
我的友情链接
查看>>
shell 脚本1
查看>>
20160420作业
查看>>