有一个店家列表fragment重新加载布局-a,点击某个店家跳到菜单列表fragment重新加载布局-b,布局不一样,如何跳?

Android API Guides 阅读笔记(9)
Fragment在一个Activity中表示一个行为或用户界面的一部分,可以在一个Activity中组合多个Fragment形成一个多页的用户界面或者在多个Activity中重复使用一个Fragment,可以认为Fragment是一个拥有独立生命周期,独立接收输入事件,并且可以在Activity运行时添加或删除的模块化部分(有点像”内嵌的Activity“),Fragment不能单独存在:必须依附于Activity并且其生命周期直接受Activity的生命周期影响,通过阅读这一节的内容,将会了解到:
Fragment的使用场景
将一个Activity分成不同的部分,例如分成导航栏和内容块
同一个界面模块可以重复使用时,可以使用Fragment,这样一个Fragment可以在多个Activity中使用,避免在一个Fragment中直接操作另外一个Fragment
Fragment的常用类型
DialogFragment:显示一个浮动的Dialog,这和使用DialogHelper来显示一个Dialog都是可以的,因为你可以把Fragment对话框包含在Activity管理的回退栈中,允许用户返回到关闭的Fragment中(原文,不太理解)
ListFragment:显示一个有Adapter管理的List,和ListActivity相似
PreferenceFragment:用一个List来显示一组Preference对象,类似PreferenceActivity,在创建一个应用程序的设置界面时可能会用到
创建一个Fragment:(Fragment也有生命周期回调方法,比如onCreate(),onStart(),etc)
一个Fragment至少包含如下三个方法:
onCreate():当Fragment创建时调用,应该初始化一些你想在Fragment暂停或停止时保留的组件
onCreateView():当Fragment第一次绘制UI界面的时候调用,提供一个Layout布局,对布局中的组件的操作就在这里进行(按钮的点击事件等),注意如果Fragment的类型是ListFragment,将会返回一个ListView而不是View
onPause():当用户离开当前Fragment时调用,不一定会被销毁,但仍有必要在这里做一些保存持久化数据的操作
更多关于Fragment中的回调方法写在下面
将Fragment添加到Activity中的两种方法:
在布局文件中申明Fragment:首先创建一个自定义的Fragment类,这个类中的onCreateView()必须要返回一个View,也就是说必须为它创建一个对应的布局文件,然后在其他布局中将这个Fragment作为一个自定义控件来使用即可,注意,如果有多个Fragment,必须为每一个Fragment提供一个唯一的标识符,如id属性,tag属性
在代码中添加Fragment:在Activity运行的任何时候都可以动态的添加Fragment,只需要指定一个放置Fragment的ViewGroup(例如LinearLayout,FrameLayout等),Activity对Fragment的操作包括添加(add),移除(remove),替换(replace)
使用FragmentTransaction接口实现这些功能。(当然,这里说的Fragment也是指已经创建好的Fragment类对象并在其onCreateView()方法中指定了布局)
文档中下一节讲的是没有UI界面的Fragment,我认为暂时不需要用到,所以就不记录,先跳过
管理一些Fragments(通过FragmentManager类):
通过findFragmentById()方法获取一个Activity中的Fragment实例
对Fragment回退栈进行操作,取出或者压入等
注册监听事件来监听回退栈的改变,例如addOnBackStackChangedListener()
需要注意一个关于导包的问题:如果导入的是android.app.Fragment,则使用的是:
FragmentManager fm = getFragmentManager();
而如果导入的是android.support.v4.app.Fragment,则应该使用:
FragmentManager fm = getSupportFragmentManager()
操作一些Fragments(通过FragmentTransaction类,主要有add(),remove(),place()等操作):
通过FragmentManager获取FragmentTransaction的实例,接着就能对一些Fragments进行add(),remove(),或place()操作了,最后再执行commit()以提交事务,在执行commit()之前如果执行了addToBackStack()方法,系统将会将执行的这个事务(transaction)存放在回退找中,如果之前有多个操作,比如remove()了多个Fragment,最后再执行commit(),则在返回时(按下返回键)所有这些Fragment都将返回
也就是说,commit()相当于一个节点,你在这个节点之前的操作为一个集合,执行返回的时候这个集合中的Fragment都将返回
比如一个页面有3个Fragment,还有一个按钮,点击事件是将这三个Fragments移除(remove),然后调用addToBackStack(),将它们添加到回退找,然后提交(commit),这样,在点击按钮的时候,这3个fragments都将消失,但是当我点击物理返回键的时候,这3个Fragments都将重新出现在屏幕上,而如果没有执行addToBackStack()方法,则不会返回之前的Fragment。
调用commit()方法并不会立即执行事务(transaction),而是会等待UI线程的调度,待UI线程有空闲来执行时才会执行。如果想要让它立即执行,需要在UI线程中使用executePendingTransactions()方法来执行commit提交的事务,但一般没必要这样做,除非这个事务是在其他线程中产生的,需要立即执行,注意:只能在用户离开当前Activity之前使用commit()方法来提交事务,也就是说必须在系统调用Activity的onSavaInstanceState()之前提交事务
Fragment与Activity之前的通信
由于Fragment总是依附于Activity的,所以很多时候需要Fragment和Activity之间进行数据传递等通信,下面是一个简单的例子,用以说明Fragment与Activity之前如何通信:
假设一个Activity中有两个Fragment(Fragment_A和Fragment_B),Fragment_A中是一个列表(list),Fragment_B中是列表单个项目的详情页,也就是说,点击Fragment_A中的某个项目,就会跳转到Fragment_B中显示它的详情,这时就需要通过Activity监听用户对Fragment_A的点击事件,获取到用户点击的项目索引,然后再传递给Fragment_B,这样Fragment_B才知道该显示哪个项目的详情,下面是代码:
首先在Fragment_A中定义一个接口 OnItemSelectListener,如下:
public class Fragment_A extends ListFragment {
public interface OnItemSelectListener {
public void onItemSelected(int itemId);
接着在其对应的Activity中实现这个接口并重写其中的回调方法onItemSelected(),在这个回调方法中通知Fragment_B去显示对应项目的详情
public class MainActivity extends AppCompatActivity implements Fragment_A.OnItemSelectListener {
public void onItemSelected(int itemId) {
Fragment fmB = new Fragment_B(itemId);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.fm_b, fmB);
ft.commit();
然后在Fragment_A的onAttach()方法中(onAttach方法为Fragment生命周期中首先被调用的方法,并且需要当前Activity实例作为参数)实例化OnItemSelectListener接口,获取到对应的Activity(因为这个Activity之前实现了OnItemSelectListener接口)
public class Fragment_A extends ListFragment {
public OnItemSelectL
public void onAttach(Activity activity) {
super.onAttach(activity);
listener = (OnItemSelectListener)
public interface OnItemSelectListener {
public void onItemSelected(int id);
public void onListItemClick(ListView l, View v, int position, long id) {
listener.onItemSelected(id);
通过这样的接口实现,在Fragment_A中获取到Activity的实例,然后Fragment_A就可以在合适的时候调用Activity实例的onItemSelected()方法来达到回调的目的,这样,一个简单的通过回调实现的Fragment与Activity之间的通信就实现了
Fragment中处理菜单点击事件
Fragment也可以像Activity那样使用菜单,只需要在Fragment中实现onCreateOptionMenu()方法即可,这个操作和在Activity中是一样的,注意,为了让Fragment接收到菜单的回调,需要在Fragment的onCreate()方法 中调用setHasOptionMenu(),否则Fragment不能接收到菜单的点击回调,也就是点了菜单没反应,
其实,点击菜单选项这个过程,首先接收到回调的是Activity,如果Activity中没有处理选项点击事件的方法,才会移交给Fragment
处理Fragment的生命周期
就像Activity的生命周期一样,Fragment也存在这三种状态:
Resumed(在运行的Activity中可见状态),
Paused(其他Activity没有完全挡住当前Activity,类似点击分享按钮弹出的一个只遮住一部分屏幕的Activity,后面那个Activity就是处于这种状态),
Stopped(当前Fragment不可见了,或者所在的Activity不可见了,或者当前Fragment被移除进入回退栈了,但是一个Stopped状态的Fragment依然是活着的,所有的状态都仍然存在,直到其对应的Activity被销毁)
Fragment也具有状态保存的功能,通过在Fragment的onCreate(),onCreateView()或者onActivityCreated()这三个系统回调方法中执行onSaveInstanceState()
Activity与Fragment的生命周期最主要的区别在于他们的回退栈:
Activity的回退栈由系统管理,当用户点击物理返回键时,当前Activity将由系统默认放置到回退栈中
Fragment的回退栈有其所在的Actiity管理,而且只有当明确执行了addToBackStack()方法后,当前Fragment在移除时才会被放入回退栈,否则就销毁。
Fragment的生命周期与Activity是同步的,也就是说,当一个Activity含有一个Fragment的情况下,当用户退出当前应用,系统会先调用Fragment的onPause(),再调用Activity的onPause(),同理,其他几个生命周期回调方法类似,但是因为Fragment的生命周期比Activity多几个独有的方法:
onAttach():当Fragment关联(依附)到一个Activity时调用,也就是在一个Activity中创建了一个Fragment,并调用了commit()之后
onCreateView():当创建Fragment的布局时调用
onActivityCreateed():当对应的Activity中的onCreate()方法返回时(…这里有点搞不明白了,Activity中的onCreate()怎么返回?)
onDestroyView():当Fragment的布局被移除时调用
onDetach():当Fragment与Activity断开联系时调用
下面两张图来自Android官方文档,左图为Fragment的生命周期图,右图为Activity的状态与Fragment的生命周期对比图
————————
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:58869次
积分:1154
积分:1154
排名:千里之外
原创:54篇
评论:21条
(2)(3)(1)(1)(5)(2)(3)(4)(4)(12)(4)(4)(11)(2)(2)挖坑技巧_Android实战技巧:Fragment的那些坑-疾风资料库
挖坑技巧_Android实战技巧:Fragment的那些坑
发布时间: 19:01&&&&发布人:
Android实战技巧:Fragment的那些坑
Fragment是Android在3.0(Homeycomb)版本时加入的用以更灵活的构建多屏幕界面的可UI组件。[)关于Fragment以基本使用方法可以参考官方的教程和最佳实践,以及选择Activity还是Fragment。 但是Fragment使用起来却远没有教程中说的那样简单,也远比Activity要复杂一些,这里总结了孤在使用Fragment时所遇到的坑。嵌套Fragment时Duplicated id或者Tag之痒这是一个小坑,但是初学者很容易遇到,特别是在Fragment之中套有Fragment时,且又是布局中添加子Fragment时更容易遇到。现象:Fragment中套有另一个Fragment,当第二次进入父Fragment时或者由Fragment创建的界面时会抛异常,大致意思是子Fragment的Id或Tag重复了。如果你在layout中给子fragment加了id或者tag,那么一定会遇到此异常。原因:在添加Fragment时都可以为Fragment指定一个Id或者Tag用以标识这个Fragment。因为每个Activity所附带的Fragment都是放在一个对象池中,在Activity的生命周期里,Fragment仍然在池中,即使是把某一个Fragment从Activity中detach掉(也即用FragmentManager pop掉),这个池是由FragmentManager来管理的。当你再次要以某个id或者Tag添加Fragment时,FragmentManager会在池中检索,如果发现已经存在Fragment对象带有此Id或者Tag时,就会抛此异常并报怨Id重复。这么做的目的就是减少对象的创建,尽可以的复用对象。如何破解:. 在布局中写fragment时,不要添加id或者tag;. 如果非要添加id或者tag,就在代码中添加fragment,如使用Id或者Tag时,先到FragmentManager中查找对象是否存在,不存在时再创建,也即:Fragment target = getFragmentManager().findFragmentByTag("tag");
if (target == null) {
targe = new SomeFragment();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(R.id.content, target, "tag");
ft.commit();replace之痛现象:当有二个相同的整体页面层叠时,想把最后一个布局中的某个用Fragment来replace,会发现,它把前面的replace,后面的没效果。原因:布局的Id在一个窗体(Activity)中是唯一的,Fragment的replace也是使用此唯一的Id来把相应布局替换成Fragment的。当相同的页面层叠时,同一个Id的布局出现了二次,但Id是一样的。所以FragmentTransaction在replace时仅替换了一个。而不会像期待的那样,替换最后一个页面。如何破解:如果相同的页面非要层叠,要么不使用Fragment,要么为布局设置不同的Id。这种情况多出现在布局的复用上面,比如某二个页面长的像,所以复用了同一整体布局。但实际的逻辑上不是相同的页面,完全可以为布局设置不同的Id。可见性之疼现象:当有多个Fragment层叠在一起时,每个Fragment如何能感知其对用户的可见性。比如应用有三个页面,A,B和C,比如A是整体类别列表,B是每个类别的详情,C又是类别的某种更详细的信息,当C显示出来时,A和B怎么能知道它其实对于用户已经不可见了,所以就可以不刷新,不加载数据等等。当C被用户BACK后,B又如何感觉它变成可见了?原因:Fragment的生命周期与Activity是一样的,添加到Activity会把OnCreate类似的回调走一遍,然后,Activity onResume/onPause/onstart/onStop时,其所持有的Fragment也走相应的onResume/onPause/onstart/onPause。但是Fragment与Activity非常不同的是,Activity当有另一个Activity显示时,当前的Activity会走onPause/onStop,而Fragment则完全没有感知。最多只能从FragmentManager那里知道BackStackState改变了,但是是Fragment增加了,还是减少了,并不能知道。如何破解:这个一个非常令人蛋疼的问题,简单的页面还好,但是涉及到数据加载或者要针对某些事件(网络)刷新时就有问题了,对用户不可见的页面没必要刷新。可行的解法就是:. 监听FragmentManager的BackStackState的改变. 定义页面路径深度然后与BackStack深度比较,以感知是否对用户可见 如前面A是一级,其path为1,B是2,C是3。当前Stack深度为3时,C是可见的,A与B不可见,以此类推。空白区域的点击之脓现象:一个Fragment,层叠在另外一个Fragment或者Activity之上,此Fragment中有一些空白区域,也即Widget之外的空白区域,当点击这些空白区域的时候发现这个Fragment下面的Fragment或者Activity中的View收到了事件并且响应了点击事件。原因:Fragment的本质就是一个View布局的管理器,当Fragment attach到Activity时,其实就是把Fragment#onCreateView()返回的View,替换掉(如果是用replace)FragmentTransaction#replace中指定的View,或者添加到(如果是add)FragmentTransaction#add()中指定的ViewGroup里面。当我们以层叠方式显示多个Fragment时,通常的做法就是弄一个FrameLayout,然后每次把Fragment add到此布局。因此,这时Activity的页面布局树实际上就是一个FrameLayout里面包含几个View。所以,当点击上面Fragment的空白区域时,如果事件没被吃掉,就会向下传递。如何破解:在Fragment的根布局加上一个clickable=true,这会让根布局把点击事件吃掉,以防止事件会继续传递下去,造成上面的情况。Activity重新创建之殇现象:这个没有一般性的错误,只会有与项目相关的具体的错误异常,或者页面显示不正确。以及为什么教程中都有这么一句:
@OverrideonCreate(BundlesavedInstance){if(savedIntance==null){// create fragment and add it to Activity.}}原因:Activity除了正常启动走到onCreate,还有另外的入口,比如系统配置信息发生变化时,或者Activity在栈比较深的地方,系统会把Activity杀掉,然后再重新创建它,问题就是在这个重新创建。重新创建与新建一个Activity不同,它是要尽可能的恢复先前所在的状态,因为这对用户来说是透明的,也就是说不能让用户感知到,否则体验会相当差。唯一与常规创建的区别就在于传给onCreate的参数savedInstanceState是不是null.如何破解:为了能在Activity重建时恢复状态,需要:. 对于Activity要在onSaveInstanceState()时,把一些变量保存,然后在onCreate时恢复. 对于Fragment告诉系统,你想恢复状态Fragment#setRetainInstance(true)。然后,也在onSavedInstance()中保存状态,在onCreate时恢复。 这就够了,系统会在重新创建Activity时把其所持有的Fragment也创建出来。所以为什么每个Fragment子类都需要定义一个默认的Constructor。更多的可以参考这篇文章。FragmentTransaction的异步操作之殇FragmentTransaction是异步的,commit()仅是相当于把操作加入到FragmentManager的队列,然后FragmentManager会在某一个时刻来执行,并不是立即执行。所以,真正开始执行commit()时,如果Activity的生命周期发生了变化,比如走到了onPause,或者走到了onStop,或者onDestroy都走完了,那么就会报出IllegalStateException。具体的原因,以及如何避免可以参考大牛的这篇文章。参考
教你杆坑空钩垂钓的技巧
教你杆坑空钩垂钓的技巧。在一次我使用杆坑垂钓钓不上鱼的时候,刚好有一个渔友向我介绍了一种“空钩钓法”。当进一试不得了,效果真的相当的不错。这种钓法要靠技巧,要用到硬竿子,而且还要不断的逗鱼,具体讲就是钩子放到底以后,你就马上抖腕使钩上刺20CM,然后再放下,再抖.频率要平均,鱼就不容易警觉了。下面就来跟大家详细的说明下。一、钓法分类。1、七星漂朝天钩:这个钓组属于比较灵敏的,但是缺点就是钩柄处焊有铅坠,不利于空钩的垂钓;2、七星漂悬坠:该钓组较为灵敏,在铅坠离鱼钩的距离4-6公分处。这很适宜用于空钩垂钓,但是缺点就是抗风性差;3、立漂悬坠:该钓组较灵敏,适宜空钩垂钓。4、矶钓:该钓组较灵敏,适宜用于溜鱼。5、立漂坠触底:该钓组较为迟钝,漂相为体动漂。6、台钓:该钓组较灵敏,漂相为口动漂,但是缺点就是抗风性差。二、钓组配合。我们这里的钓组可以使用12尺以下的手杆,这里的钓竿宜短不宜长,因为调性为超硬调。使用1-3号的大线,0.6-1.2号的子线,这里的钓线宜细不易粗。使用4-5号的袖钩,这里的鱼钩宜小不宜大。这里的鱼钩颜色最好与诱饵颜色匹配为佳,才不会让鱼起疑。使用0-3号的短尾漂,如果你使用的台钓浮漂调灵钓灵,那只要调1-2目钓1-2目就可以了。三、诱饵。诱饵我们可以用天然谷物的小米,它能散发出淡淡的清香,鱼儿很是喜欢吃。我们还可以用小米、大米、玉米糁等用曲酒浸泡,这种诱饵在水中的雾化性能好,能散发着酵香味,诱鱼效果更是不用说。我们在做窝的时候,要在30-50公分的范围内比较好,一次性我们可以做到2-3个窝,在每个窝内撒上2到3把米,当你看到窝中有冒出小鱼星,表明鱼儿已进窝,此时抻杆必有收获。记得在出鱼后要及时的补窝,才能有利于钓下一条鱼。四、适宜范围。使用空钩的垂钓适宜的季节最好就是6—9月份,这是因为随着气温的升高,造成水中的溶氧量降低,鱼儿就会跑到上层来。适合在杆坑水深50—100公分的地方垂钓。用来垂钓老鱼、滑鱼。鲫、鲤、草鱼等,效果真的很不错。五、漂相。1、口动漂:鱼儿摄食吞钩的一霎那,浮漂反映为有力的一顿,此时提杆必有渔获。2、晃动漂:浮漂左右晃动,表明鱼体蹭线,此时提杆多为矛鱼(鱼钩挂在鱼嘴以外的地方,但矛鱼不是咱钓鱼人追求)。3、体动漂:鱼儿摄食吞钩为吃死口或吐钩时挂住鱼嘴,鱼儿游动牵动浮漂。浮漂反应为黑漂(鱼儿吞钩平行游动)和送漂(鱼儿吞钩抬头向上游动)。4、观漂:要求做到手到、眼到、精神到,漂有动静,即刻提杆。这种钓法比较适合在鱼口不佳的时候使用,因为这时的大鱼会比较多,效果常让用饵钓的朋友大跌眼镜,不过这种钓法缺点就是手腕子有一点累。欢迎您转载分享:/a//26571.html
CopyRight&2012- AllRight Reserved随笔分类 - android笔记
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: Android Gradle 插件 DiscardFilePlugin(清空类和方法) An android gradle plugin for discard class or method in compile time. 用于在编译构建时期
天天_byconan 阅读(79) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: [Android]使用RecyclerView替代ListView(四:SeizeRecyclerView) 在RecyclerView的开发过程中,可能会遇到一些窘境,比如,下图是今日头条的视频详情页面: 除去播放器外,其它组件应该是一个Rec
天天_byconan 阅读(262) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: Lottie简介(翻译) 原文: 新的向本地apps的构建动画的开源工具。 作者: "Brandon Withrow" , "Gabridl Peal" , "Leland Richardson" 和 "Salih AbdulKarim" 在以前
天天_byconan 阅读(1927) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: 在Dagger 2中Activities和Subcomponents的多绑定 原文: 几个月前,在 "MCE^3" 会议中,Gregory Kick在他的 "演讲" 中展示了一个提供Subcomponents(比如,为Activity)的新概念。
天天_byconan 阅读(293) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: 使用Dagger 2来构建UserScope 原文: 在Dagger 2中自定义scopes可以在不寻常存活时间(与Application和界面生命周期不同的)的依赖上给我带来更好的控制。但是在Android app中正确地实现它需要记住几个事情
天天_byconan 阅读(169) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: 在Dagger 2中使用RxJava来进行异步注入 原文: 几星期前我写了一篇关于在Dagger 2中使用 Producers 进行异步注入的 "文章" 。在后台线程中执行对象的初始化又一个很好的优势 它负责实时( "每秒60帧" 可以保持界面流
天天_byconan 阅读(336) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: 使用Dagger 2进行依赖注入 Producers 原文: 本文是在Android中使用Dagger 2框架进行依赖注入的系列文章中的一部分。今天我们将探索下Dagger Producers 使用Java实现异步依赖注入的Dagger2的一个扩
天天_byconan 阅读(269) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: [Android]Android端ORM框架——RapidORM(v2.1) "RapidORM" :Android端轻量高性能的ORM框架 GitHub: /wangjiegulu/RapidORM Rapi
天天_byconan 阅读(161) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: 使用MVP解决技术债务 原文: 免责申明:这篇博客并不是讲关于怎么使用MVP的方式(上帝知道关于这些已经太多了)去写Android代码。而仅仅是我的个人经验,关于怎么转换我们的表现层到MVP架构来帮助我们解决一些累积的技术债务,而且在这个过程中也
天天_byconan 阅读(283) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: 异步 layout inflation 原文: 随着最近发布的 "Android Support Library, revision 24" ,Google开发者在v4包中增加了一个用来异步inflate layouts的帮助类。 进入 Asyn
天天_byconan 阅读(306) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: 使用自定义JUnit Rules、annotations和Resources进行单元测试 原文: 简介 Unit Test并不只有断言和测试方法组成。它有一些可以用来提高质量和测试代码可读性的技术。在本文中我们将探索: annotations J
天天_byconan 阅读(250) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: [Android]Android端ORM框架——RapidORM( ) "RapidORM" :Android端轻量高性能的ORM框架 GitHub: /wangjiegulu/RapidORM 1. Rapi
天天_byconan 阅读(490) |
摘要: 最近Google开源了一个项目叫「FlexboxLayout」。 1.什么是 Flexbox 简单来说 Flexbox 是属于web前端领域CSS的一种布局方案,是2009年W3C提出了一种新的布局方案,可以简便、完整、响应式地实现各种页面布局,并且 React Native 也是使用的 Flex
天天_byconan 阅读(460) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: Android MVP&依赖注入&单元测试 注意 :为了区分 中的 与`Android View MVP View Viewer`来表示。 这里暂时先只讨论 和 ,`Model`暂时不去涉及。 1.1 MVP 基础框架 1.1.1 前提 首先需要
天天_byconan 阅读(1410) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: 一个干净的架构 原文: 在过去几年中我们能看到的一系列关于系统架构的思想。它们包括: [Hexagonal Architecture](也称为 ),作者是 Alistair Cockburn,并被 Steve Freeman 和 Nat Pryc
天天_byconan 阅读(1321) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: Dagger2Metrics 测量DI图表初始化的性能 原文: 几个月前我们通过 [Dagger 2 graph creation performance] 经历了一些可能会遇到的问题。多亏 [TraceView] 这个工具我们可以很确切地看到初
天天_byconan 阅读(559) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: 使用Dagger 2依赖注入 图表创建的性能 原文: [ PerfMatters] 最近非常流行标签,尤其在Android世界中。不管怎样,apps只需要正常工作就可以的时代已经过去了。现在所有的一切都应该是令人愉悦的,流畅并且快速。举个例子,I
天天_byconan 阅读(1205) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: 使用Dagger 2依赖注入 自定义Scope 原文: 这章是展示使用Dagger 2在Android端实现依赖注入的系列中的一部分。今天我会花点时间在自定义Scope(作用域)上面 它是很实用,但是对于刚接触依赖注入的人会有一点困难。 Scop
天天_byconan 阅读(5593) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: 使用Dagger 2依赖注入 API 原文: 这章是展示使用Dagger 2在Android端实现依赖注入的系列中的一部分。今天我会探索Dagger 2的基础并且学习这个依赖注入框架的所有的API。 Dagger 2 在我上一章中我提到了DI框架
天天_byconan 阅读(7850) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客: 使用Dagger 2依赖注入 DI介绍 原文: 不久之前,在克拉科夫的 [Tech Space] 的 Google I/O 扩展中,我 [展示] 了一些关于使用Dagger 2来进行依赖注入。在准备期间我认识到有太多相关的东西需要去讲,无法用一打
天天_byconan 阅读(2820) |
摘要: &font color=& ff0000& &strong 以下内容为原创,欢迎转载,转载请注明来自天天博客:&/tiantianbyconan/p/5050768.html &/strong &/font 翻译自 Android Developer 官网...
天天_byconan 阅读(526) |
摘要: &font color=& ff0000& &strong 以下内容为原创,欢迎转载,转载请注明来自天天博客:&/tiantianbyconan/p/5049041.html &/strong &/font 翻译自 Android Developer 官网...
天天_byconan 阅读(177) |
摘要: &font color=& ff0000& &strong 以下内容为原创,欢迎转载,转载请注明来自天天博客:&/tiantianbyconan/p/5048524.html &/strong &/font 翻译自 Android Developer 官网...
天天_byconan 阅读(1107) |
摘要: &font color=& ff0000& &strong 以下内容为原创,欢迎转载,转载请注明来自天天博客:&/tiantianbyconan/p/5036289.html &/strong &/font &br/ 经历过的客户端的架构分为这么几个阶段:...
天天_byconan 阅读(7457) |
摘要: &font color=& ff0000& &strong 以下内容为原创,欢迎转载,转载请注明来自天天博客:&/tiantianbyconan/p/5017056.html &/strong &/font 从Launcher开始启动App流程源码分析 ...
天天_byconan 阅读(6946) |
摘要: &font color=& ff0000& &strong 以下内容为原创,欢迎转载,转载请注明来自天天博客:&/tiantianbyconan/p/5013863.html &/strong &/font Android系统启动流程源码分析首先我们知道...
天天_byconan 阅读(2480) |
摘要: Android系统启动加载流程: &参考图& Linux内核加载完毕 启动 进程 进程fork出 进程 进程在 中进行初始化的时候fork出 进程 进程开启的时候初始化 和`ActivityManagerService PowerManagerService DisplayManagerSe...
天天_byconan 阅读(171) |
摘要: &font color=& ff0000& &strong 以下内容为原创,欢迎转载,转载请注明来自天天博客:&/tiantianbyconan/p/4939080.html &/strong &/font 之前一直在关注Kotlin和Android相关的...
天天_byconan 阅读(473) |
摘要: &font color=& ff0000& &strong 以下内容为原创,欢迎转载,转载请注明来自天天博客:&/tiantianbyconan/p/4829007.html &/strong &/font [TOC] 使用Kotlin+OkHttp+Rx...
天天_byconan 阅读(2245) |
摘要: 三、其他[TOC] 1. 多重声明有时候可以通过给对象插入多个成员函数做区别是很方便的: 多重声明一次创建了多个变量。我们声明了俩个新变量:name age 并且可以独立使用: 也可以在 for 循环中用: map: 2. Ranges函数操作符是 3. 类型检查和转换is !is 表达式:...
天天_byconan 阅读(1180) |
摘要: 三、函数和lambda表达式 1. 函数声明 函数参数是用 Pascal 符号定义的 name:type。参数之间用逗号隔开,每个参数必须指明类型。函数参数可以有默认参数。这样相比其他语言可以减少重载。 2. 命名参数在调用函数时可以参数可以命名。这对于有很多参数或只有一个的函数来说很方便。 ...
天天_byconan 阅读(1139) |
摘要: 二、类和对象: 1. 类定义:类的声明包含类名,类头(指定类型参数,主构造函数等等),以及类主体,用大括号包裹。类头和类体是可选的;如果没有类体可以省略大括号。 2. 构造函数:在 Kotlin 中类可以有一个主构造函数以及多个二级构造函数。主构造函数是类头的一部分:跟在类名后面(可以有可选的参...
天天_byconan 阅读(508) |
摘要: 以下内容为原创,欢迎转载,转载请注明来自天天博客:/tiantianbyconan/p/4800656.htmlKotlin是由JetBrains开发并且开源的静态类型JVM语言。比Java语言语法简洁,支持很多Java中不支持的语法特性,如高阶函数、內联...
天天_byconan 阅读(5882) |
摘要: 以下内容为原创,欢迎转载,转载请注明 来自天天博客:/tiantianbyconan/p/4748077.html Android上主流的ORM框架有很多,常用的有ORMLite、GreenDao等。 ORMLite: -优点:API很友好,使用比较方便简
天天_byconan 阅读(2017) |
摘要: 以下内容为原创,欢迎转载,转载请注明来自天天博客:/tiantianbyconan/p/4578699.htmlGithub:/wangjiegulu/RxAndroidEventsSampleEventBus的作用是发...
天天_byconan 阅读(25605) |
摘要: LearnRxJava http://reactivex.io/documentation/operators.html /ReactiveX/RxJava/wiki/The-RxJava-Android-Module /...
天天_byconan 阅读(151) |
摘要: 以下内容为原创,欢迎转载,转载请注明来自天天博客:/tiantianbyconan/p/4474748.htmlRapidFloatingActionButtonGoogle推出了MaterialDesign的设计语言,其中FloatingActionBu...
天天_byconan 阅读(8976) |
摘要: 以下内容为原创,欢迎转载,转载请注明来自天天博客:/tiantianbyconan/p/4389674.html需求:在ActivityA跳转到ActivityB,然后在ActivityB操作完返回数据给ActivityA。这个很普遍的需求,一般情况是使用...
天天_byconan 阅读(4475) |
摘要: 以下内容为原创,欢迎转载,转载请注明来自天天博客:/tiantianbyconan/p/4388175.html此文针对开源爱好者。如果你想让别人使用你的Android开源库,第一种方法是,提供你的Github地址,让别人clone一份,然后让别人impo...
天天_byconan 阅读(6291) |
摘要: 以下内容为原创,转载请注明:来自天天博客:/tiantianbyconan/p/4303910.html参考微信,使用ViewPager来显示不同的tab,每个tab是一个Fragment,假设有3个tab,对应的fragment是FragmentA、Fr...
天天_byconan 阅读(10242) |
摘要: 以下内容为原创,转载请注明:来自天天博客:/tiantianbyconan/p/4268097.html这次来使用RecyclerView实现PinnedListView的效果,效果很常见:开发的代码建立在上一篇([Android]使用RecyclerVi...
天天_byconan 阅读(9233) |
摘要: 以下内容为原创,转载请注明:来自天天博客:/tiantianbyconan/p/4242541.html以前写过一篇“[Android]使用AdapterTypeRender对不同类型的item数据到UI的渲染(...
天天_byconan 阅读(48691) |
摘要: 以下内容为原创,欢迎转载,转载请注明来自天天博客:/tiantianbyconan/p/4232560.htmlRecyclerView是一个比ListView更灵活的一个控件,以后可以直接抛弃ListView了。具体好在哪些地方,往下看就知道了。首先我们...
天天_byconan 阅读(124934) |
摘要: 以下内容为原创,欢迎转载,转载请注明来自天天博客:/tiantianbyconan/p/4182929.html可拖拽的红点,(仿新版QQ,tab下面拖拽标记为已读的效果),拖拽一定的距离可以消失回调。GitHub:DraggableFlagView(ht...
天天_byconan 阅读(4941) |
摘要: 以下内容为原创,欢迎转载,转载请注明来自天天博客:/tiantianbyconan/p/4172483.html需求:自定义一个ViewGroup,实现可以下拉刷新的功能。下拉一定距离后(下拉时显示的界面可以自定义任何复杂的界面)释放手指可以回调刷新的功能...
天天_byconan 阅读(18252) |
摘要: 以下内容为原创,欢迎转载,转载请注明来自天天博客:/tiantianbyconan/p/4146512.html给ListView中每个item绑定点击事件的方法,比较常见的如下这种方式: 1 public View getView(int positon...
天天_byconan 阅读(9612) |
摘要: 以下内容为原创,欢迎转载,转载请注明来自天天博客:/tiantianbyconan/p/4139998.html举个例子吧,以好友列表为例ListView中每个Item表示一个好友,每个好友中都有一个头像,需要从服务端加载到本地,然后显示在item中。显然...
天天_byconan 阅读(7545) |
摘要: 以下内容为原创,转载请注明:来自天天博客:/tiantianbyconan/p/3992843.html本文讲的工具均放在AndroidBucket开源项目中,欢迎大家star/fork,地址:/wangjiegulu/...
天天_byconan 阅读(3928) |
摘要: MVP(Model View Presenter)模式是著名的MVC(Model View Controller)模式的一个演化版本,目前它在Android应用开发中越来越重要了,大家也都在讨论关于MVP的理论,只是结构化的资料非常少。这就是我写这篇博客的原因,我想鼓励大家多参与讨论,然后把MVP模...
天天_byconan 阅读(2866) |
摘要: 以下内容为原创,转载请注明:来自天天博客:/tiantianbyconan/p/3823429.html项目中碰到一个问题,情景是这样的:有一个ListView,每个item中有一个TextView,这个TextView实现了LongClick事件,这个T...
天天_byconan 阅读(6598) |
摘要: 以下内容为原创,转载请注明:来自天天博客:/tiantianbyconan/p/3819304.html公司项目中有这么一个需求,所以需要自己实现下。效果类似android4.0以上原生的DatePicker这种。这个WheelView控件我已经放在git...
天天_byconan 阅读(85052) |
摘要: 方法一:1. 使用USB数据线连接设备。2. 命令输入adb tcpip 5555 ( 5555为端口号,可以自由指定)。3. 断开 USB数据,此时可以连接你需要连接的|USB设备。4. 再命令输入 adb connect :5555后面就可以使用ADB ,DDMS 来调试Android应用或显示...
天天_byconan 阅读(739) |
摘要: 3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这三种动画模式在SDK中被称为property animation,view animation,dra...
天天_byconan 阅读(149) |
摘要: 以下内容为原创,转载请注明:来自天天博客:/tiantianbyconan/p/3709957.html之前写过一篇博客,是使用Fragment来实现TabHost的效果,并且模拟TabHost的切换各个fragment生命周期的调用,见http://ww...
天天_byconan 阅读(1279) |
摘要: 一、 Android的内存机制Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似。程序员通过new为对象分配内存,所有对象在java堆内分配空间;然而对象的释放是由垃圾回收器来完成的.那么GC怎么能够确认某一个对象是不是已经被废弃了呢?Java采用了有向图的...
天天_byconan 阅读(948) |
摘要: 以下内容为原创,欢迎转载,转载请注明来自天天博客:/tiantianbyconan/p/3642849.html在Android项目中,经常都会用到ListView这个控件,而相应的Adapter中getView()方法的编写有一个标准的形式,如下: 1 ...
天天_byconan 阅读(4796) |
摘要: 今天我们来更深入了解一下Android开发上的模糊技术。我读过几篇有关的文章,也在StackOverFlow上看过一些相关教程的帖子,所以我想在这里总结一下学到的东西。为什么学习这个模糊技术?现在越来越多的开发者喜欢在自定义控件的时候加上各种模糊背景,看看RomanNurik开发的Muzei或者Yahoo的Weather应用app都非常不错。我非常喜欢他们的设计。我从Mark Allison的帖子(帖子地址)得到启发,然后写了这篇文章。这是我们需要完成下图展示的效果:预备知识首先描述一下我们需要的文件。我们需要一个主Activity,里面有一个含有多个Fragment的ViewPager,每个
天天_byconan 阅读(9031) |
摘要: 以下内容为原创,欢迎转载,转载请注明来自天天博客:/tiantianbyconan/p/3623050.htmlAndroidInject项目是我写的一个使用注解注入来简化代码的开源项目/wangjiegulu/androidInject今天新增功能如下:1. 增加对sqlite3数据库的orm注解支持,增加@AIColumn、@AIPrimaryKey、@AITable三个注解来映射到表(有待改进)2. 使用反射来封装AIDbExecutor类,实现半自动化orm,类似mybatis 先说说使用的方式吧 一...
天天_byconan 阅读(1988) |
摘要: 以下内容为原创,欢迎转载,转载请注明来自天天博客:/tiantianbyconan/p/3574131.html这个可以实现ImageView异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画。github地址:/wangjiegulu/ImageLoaderSample解决了:1. listview加载oom问题2. listview加载时卡顿的现象3. listview加载时item中图片重复错位等情况可以配置:1. 设置加载图片的最大尺寸2. 设置默认图片的显示3. 设置图片位图模
天天_byconan 阅读(3691) |
摘要: 以下内容为原创,欢迎转载,转载请注明来自天天博客:/tiantianbyconan/p/3403124.html本人从在学校开始到现在上班(13年毕业)一直做web和android方面的开发,最近才开学习及ios的开发,所以ios学习中有不当之处,请大家留言赐教啦以前从来没有接触过Objective-C这门语言,不过我想面向对象编程应该大体思想都差不多在ios中的UITableView学习中,开发过android的朋友应该马上会联想到ListView和GridView这两个控件,接下来以ListView为例子,跟UITableView做个对比,看看它
天天_byconan 阅读(6905) |
摘要: 以下内容为原创,转载请注明:/tiantianbyconan/p/3364728.html我前两天写过一篇博客《Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信》(/tiantianbyconan/p/3360938.html),实现了Tab切换时保留当前Fragment状态,并在切换前自动回调onPause()方法,在切换后自动调用onResume(),这样就做到了跟TahHost一样的功能。今天来实现下ViewPager
天天_byconan 阅读(52872) |
摘要: 以下内容为原创,转载请注明:/tiantianbyconan/p/3360938.html如新浪微博下面的标签切换功能,我以前也写过一篇博文(/tiantianbyconan/archive//2366237.html),可以实现,用的是TabHost。但是android发展比较迅速,TabHost这玩意现在已经被弃用了,虽说用现在也能用,但是被弃用的东西还是少用为妙。官方有个FragmentTabHost这么一个替代品,于是试了一下,发现每次切换tab,都会调用onCreateView
天天_byconan 阅读(77950) |
摘要: 以下内容为原创,转载时请注明链接地址:/tiantianbyconan/p/3311658.html这是我现在碰到的一个问题,如果需要在TextView中加载大文本的时候,比如几M的txt文件时,TextView载入的时候会出现卡死的现象,甚至会出现异常等待退出出现。解决办法之一就是通过“分段”或“分页”来显示数据,在TextView(嵌入在ScrollView之中实现了TextView的滚动)中滚动到底部的时候,再去加载下一部分的数据,依次类推,这样每次加载的数据相对来说都比较小,不会出现卡顿的现象。遇到的问题是,如何监听ScrollView滚动的
天天_byconan 阅读(6279) |
摘要: 对于刚开始学习android开发的童鞋们来说,若有一个简单而又全面的android工程能来剖析,那就是再好不过了,zxing就是不错得例子。zxing的源码可以到google code上下载,整个源码check out 下来,里面有各个平台的源码,ios的,android的。当然我们需要的就是android代码。将android的工程导入到eclipse中,导入完成后,eclipse会显示各种错误,这是缺少core文件夹里面的核心库文件所致,在project中创建文件夹core,再将zxing源码中得core文件夹下得代码导入进来,这样就可以了。如果遇到unable resolved targ
天天_byconan 阅读(2864) |
摘要: EditText继承TextView,所以EditText具有TextView的属性特点,下面主要介绍一些EditText的特有的输入法的属性特点android:layout_gravity=&center_vertical&:设置控件显示的位置:默认top,这里居中显示,还有bottomandroid:hin:Text为空时显示的文字提示信息,可通过textColorHint设置提示信息的颜色。android:singleLine:设置单行输入,一旦设置为true,则文字不会自动换行。android:gray=&top&:多行中指针在第一行第一位置et
天天_byconan 阅读(105) |
摘要: android:autoLink :设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web /email/phone/map/all)android:autoText :如果设置,将自动执行输入值的拼写纠正。此处无效果,在显示输入法并输入的时候起作用。android:bufferType : 指定getText()方式取得的文本类别。选项editable 类似于StringBuilder :可追加字符,也就是说getText后可调用append方法设置文本内容。spannable :则可在给定的字符区域使用样式,参见这里1、这里2。andr
天天_byconan 阅读(256) |
摘要: 在ListView中设置Selector为null会报空指针?mListView.setSelector(null);//空指针试试下面这种:mListView.setSelector(new ColorDrawable(Color.TRANSPARENT));如何让ListView初始化的时候就选中一项?ListView需要在初始化好数据后,其中一项需要呈选中状态。所谓&选中状态&就是该项底色与其它项不同,setSelection(position)只能定位到某个item,但是无法改变底色呈高亮。setSelection(position)只能让某个item显示在可见It
天天_byconan 阅读(12043) |
摘要: 1 /** 2 * 设置EditText是否可编辑 3 * @author com.tiantian 4 * @param editText 要设置的EditText 5 * @param value 可编辑:true 不可编辑:false 6 */ 7 private void setEditTextEditable(EditText editText, boolean value){ 8 if(value){ 9 editText.setFocusableInTouchMode(true);...
天天_byconan 阅读(1390) |
摘要: Application设置全局变量以及传值/*** 重写Application,主要重写里面的onCreate方法,就是创建的时候,* 我们让它初始化一些值,前段时间在javaeye里面看到过一个例子,与此相似,* 我做了些改进。听说外国开发者习惯用此初始化一些全局变量,好像在Activity* 一些类里面初始化全局变量的化,会遇到一些空指针的异常,当然,我没有遇到过。* 如果用此方法初始化的话,那么就可以避免那些有可能出现的错误。** 启动Application,他就会创建一个PID,就是进程ID,所有的Activity就会在此进程上运行。* 那么我们在Application创建的时候初始化
天天_byconan 阅读(38499) |
摘要: 1. reference:参考某一资源ID。 (1)属性定义: &declare-styleable name = &名称&& &attr name = &background& format = &reference& /& &/declare-styleable&(2)属性使用: &ImageView android:layout_width = &42dip&android:layout_height = &42dip& android:backg
天天_byconan 阅读(8015) |
摘要: 进入SDK的tools目录:adb uninstall com.xxx.xxx(包名)
天天_byconan 阅读(454) |
摘要: TextView及其子类,当字符内容太长显示不下时可以省略号代替未显示的字符;省略号可以在显示区域的起始,中间,结束位置,或者以跑马灯的方式显示文字(textview的状态为被选中)。 其实现只需在xml中对textview的ellipsize属性做相应的设置即可。 android:ellipsize=&start& 省略号在开头 android:ellipsize=&middle& 省略号在中间 android:ellipsize=&end& 省略号在结尾 android:ellipsize=&marquee&
天天_byconan 阅读(83) |
摘要: android 采用ScrollView布局时出现异常:ScrollView can host only one direct child。主要是ScrollView内部只能有一个子元素,即不能并列两个子元素,所以需要把所有的子元素放到一个LinearLayout内部或RelativeLayout等其他布局方式。
天天_byconan 阅读(2606) |
摘要: android真机调试时无法显示logcat信息的解决办法:window--&show view--&android-&devices,打开devices,点击右边的截屏图片的按钮。等到出现截图的时候,logcat就出来信息了!
天天_byconan 阅读(136) |
摘要: 屏蔽返回键的代码:public boolean onKeyDown(int keyCode,KeyEvent event){switch(keyCode){case KeyEvent.KEYCODE_HOME:case KeyEvent.KEYCODE_BACK:case KeyEvent.KEYCODE_CALL:case KeyEvent.KEYCODE_SYM:case KeyEvent.KEYCODE_VOLUME_DOWN:case KeyEvent.KEYCO
天天_byconan 阅读(13417) |
摘要: 一、常用的单位:相对单位主要有:px、sp、dp绝对单位主要有:pt、in、mm二、单位应用总结:一般用相对单位,而不是绝对单位1、字体的大小一般使用SP,用此单位的字体能够根据用户设置字体的大小而自动缩放2、空间等相对距离一般使用dp(dip),随着密度变化,对应的像素数量也变化,但并没有直接的相对比例的变化。3、px与实际像素有关,及与密度有关!dp和sp和实际像素没有关系,对于一定分辨率但不同密度的屏幕,px单位的应用可能会导致长度的相对比例的变化。三、密度与分辨率:密度值表示每英寸有多少个显示点,与分辨率是两个概念。其屏幕密度标准是:HVGA屏density=160;QVGA屏dens
天天_byconan 阅读(259) |
摘要: 1、使用TelephonyManager提供的方法,核心代码:TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);String imei = tm.getDeviceId(); //取出IMEILog.d(TAG, &IMEI:&+imei);String tel = tm.getLine1Number(); //取出MSISDN,很可能为空Log.d(TAG, &MSISDN:&+tel);String iccid =tm.getSimSer
天天_byconan 阅读(972) |
摘要: 1、standard :系统的默认模式,一次跳转即会生成一个新的实例。假设有一个activity命名为Act1,执行语句: startActivity(new Intent(Act1.this, Act1.class));后Act1将跳转到另外一个Act1,也就是现在的栈里面有 Act1 的两个实例。按返回键后你会发现仍然是在Act1(第一个)里面。 2、singleTop:singleTop 跟standard 模式比较类似。唯一的区别就是,当跳转的对象是位于栈顶的activity(应该可以理解为用户眼前所 看到的activity)时,程序将不会生成一个新的activity实例,而是直接跳到
天天_byconan 阅读(1383) |

我要回帖

更多关于 fragment填充整个布局 的文章

 

随机推荐