技术标签: Android Fragment的基本用法 android Fragment adb
打开控制终端。就是那个黑窗口,window下可按win+R调出执行窗口,然后输入cmd,回车,就能弹出。mac电脑直接搜索terminal或者找到终端即可。
输入以下命令:
adb shell dumpsys activity fragment
下面用一个小案例来演示查看Fragment的过程。
首先,准备Fragment: FragmentA.java
// 导包省略。。。
public class FragmentA extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_a, container, false);
}
}
然后,准备Activity: TestActivity.java
// 导包省略。。。
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
}
public void addFragment(View view) {
getSupportFragmentManager()
.beginTransaction()
.add(R.id.fragment_container, FragmentA.class, null)
.commit();
}
public void addFragmentAndBackStack(View view) {
getSupportFragmentManager()
.beginTransaction()
.add(R.id.fragment_container, FragmentA.class, null)
.addToBackStack("myBackStack")
.setReorderingAllowed(true)
.commit();
}
}
布局文件:activity_test.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.fragment.app.FragmentContainerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/fragment_container"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="添加Fragment"
android:onClick="addFragment"
android:textAllCaps="false"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="添加Fragment并加入BackStack"
android:onClick="addFragmentAndBackStack"
android:textAllCaps="false"
/>
</LinearLayout>
这里的连接指的是能够一键运行代码,安装到设备上进行调试开发的那种状态。需要开启开发者模式,打开USB调试,相信稍微有过Android开发经验的小伙伴都知道,不再赘述。
打开控制终端。就是那个黑窗口,window下可按win+R调出执行窗口,然后输入cmd,回车,就能弹出。mac电脑直接搜索terminal或者找到终端即可。
也就是上文提到的,输入以下命令:
adb shell dumpsys activity fragment
输出内容很多,直接拉到最后,看关键词:“Local FragmentActivity”
Local FragmentActivity cd1c582 State:
mCreated=true mResumed=true mStopped=false Back Stack Index: 0
FragmentManager misc state:
mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@d5cbaa8
mContainer=androidx.fragment.app.FragmentActivity$HostCallbacks@d5cbaa8
mCurState=7 mStateSaved=false mStopped=false mDestroyed=false
这里可以看到Local FragmentActivity里还没有Fragment。因为我们还没有点击添加Fragment按钮。
点击“添加Fragment”按钮, 然后再次执行上面命令adb shell dumpsys activity fragment
,结果如下:
Local FragmentActivity 480780e State:
mCreated=true mResumed=true mStopped=false Active Fragments:
FragmentA{
70fbb60} (e04b5bf9-9719-4629-a914-bf9c0ef11b54 id=0x7f0800d3)
mFragmentId=#7f0800d3 mContainerId=#7f0800d3 mTag=null
mState=7 mWho=e04b5bf9-9719-4629-a914-bf9c0ef11b54 mBackStackNesting=0
mAdded=true mRemoving=false mFromLayout=false mInLayout=false
mHidden=false mDetached=false mMenuVisible=true mHasMenu=false
mRetainInstance=false mUserVisibleHint=true
mFragmentManager=FragmentManager{
90a3819 in HostCallbacks{
2c7b0de}}}
mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
mPopDirection=false
mContainer=androidx.fragment.app.FragmentContainerView{
9cce02e V.E...... ........ 0,52-1080,313 #7f0800d3 app:id/fragment_container1}
mView=android.widget.LinearLayout{
a1da7cf V.E...... ........ 0,0-1080,261}
Child FragmentManager{
9e22bf in FragmentA{
70fbb60}}}:
Back Stack Index: 0
FragmentManager misc state:
mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
mContainer=androidx.fragment.app.Fragment$4@a52d8c
mParent=FragmentA{
70fbb60} (e04b5bf9-9719-4629-a914-bf9c0ef11b54 id=0x7f0800d3)
mCurState=7 mStateSaved=false mStopped=false mDestroyed=false
Added Fragments:
#0: FragmentA{70fbb60} (e04b5bf9-9719-4629-a914-bf9c0ef11b54 id=0x7f0800d3)
Back Stack Index: 0
FragmentManager misc state:
mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
mContainer=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
mCurState=7 mStateSaved=false mStopped=false mDestroyed=false
从上面可以看到,Local FragmentActivity的状态已经存在活跃的Fragment了:“Active Fragments”。
此时,活跃的Fragment就是我们添加的FragmentA,从输出信息中可以看出它的id、状态等信息。
关键信息解释:
让我们再点击一次“添加Fragment”,看看添加两个Fragment后的情况
输出结果:
Local FragmentActivity 480780e State:
mCreated=true mResumed=true mStopped=false Active Fragments:
FragmentA{
85b0d8} (d789ff6b-8df2-499b-a614-1e13d1496afa id=0x7f0800d3)
mFragmentId=#7f0800d3 mContainerId=#7f0800d3 mTag=null
mState=7 mWho=d789ff6b-8df2-499b-a614-1e13d1496afa mBackStackNesting=0
mAdded=true mRemoving=false mFromLayout=false mInLayout=false
mHidden=false mDetached=false mMenuVisible=true mHasMenu=false
mRetainInstance=false mUserVisibleHint=true
mFragmentManager=FragmentManager{
90a3819 in HostCallbacks{
2c7b0de}}}
mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
mPopDirection=false
mContainer=androidx.fragment.app.FragmentContainerView{
9cce02e V.E...... ........ 0,52-1080,313 #7f0800d3 app:id/fragment_container1}
mView=android.widget.LinearLayout{
14dc9b5 V.E...... ........ 0,0-1080,261}
Child FragmentManager{
3de4c31 in FragmentA{
85b0d8}}}:
Back Stack Index: 0
FragmentManager misc state:
mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
mContainer=androidx.fragment.app.Fragment$4@fc38f16
mParent=FragmentA{
85b0d8} (d789ff6b-8df2-499b-a614-1e13d1496afa id=0x7f0800d3)
mCurState=7 mStateSaved=false mStopped=false mDestroyed=false
FragmentA{
70fbb60} (e04b5bf9-9719-4629-a914-bf9c0ef11b54 id=0x7f0800d3)
mFragmentId=#7f0800d3 mContainerId=#7f0800d3 mTag=null
mState=7 mWho=e04b5bf9-9719-4629-a914-bf9c0ef11b54 mBackStackNesting=0
mAdded=true mRemoving=false mFromLayout=false mInLayout=false
mHidden=false mDetached=false mMenuVisible=true mHasMenu=false
mRetainInstance=false mUserVisibleHint=true
mFragmentManager=FragmentManager{
90a3819 in HostCallbacks{
2c7b0de}}}
mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
mPopDirection=false
mContainer=androidx.fragment.app.FragmentContainerView{
9cce02e V.E...... ........ 0,52-1080,313 #7f0800d3 app:id/fragment_container1}
mView=android.widget.LinearLayout{
a1da7cf V.E...... ........ 0,0-1080,261}
Child FragmentManager{
9e22bf in FragmentA{
70fbb60}}}:
Back Stack Index: 0
FragmentManager misc state:
mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
mContainer=androidx.fragment.app.Fragment$4@a52d8c
mParent=FragmentA{
70fbb60} (e04b5bf9-9719-4629-a914-bf9c0ef11b54 id=0x7f0800d3)
mCurState=7 mStateSaved=false mStopped=false mDestroyed=false
Added Fragments:
#0: FragmentA{70fbb60} (e04b5bf9-9719-4629-a914-bf9c0ef11b54 id=0x7f0800d3)
#1: FragmentA{85b0d8} (d789ff6b-8df2-499b-a614-1e13d1496afa id=0x7f0800d3)
Back Stack Index: 0
FragmentManager misc state:
mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
mContainer=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
mCurState=7 mStateSaved=false mStopped=false mDestroyed=false
可以看出,Added Fragments显示出当前有两个FragmentA,#0 代表第一次添加的Fragment,#1代表第二次添加的。
点击“添加Fragment并加入BackStack”按钮,再次输入命令 adb shell dumpsys activity fragment
,结果如下:
Local FragmentActivity 480780e State:
mCreated=true mResumed=true mStopped=false Active Fragments:
FragmentA{
85b0d8} (d789ff6b-8df2-499b-a614-1e13d1496afa id=0x7f0800d3)
mFragmentId=#7f0800d3 mContainerId=#7f0800d3 mTag=null
mState=7 mWho=d789ff6b-8df2-499b-a614-1e13d1496afa mBackStackNesting=0
mAdded=true mRemoving=false mFromLayout=false mInLayout=false
mHidden=false mDetached=false mMenuVisible=true mHasMenu=false
mRetainInstance=false mUserVisibleHint=true
mFragmentManager=FragmentManager{
90a3819 in HostCallbacks{
2c7b0de}}}
mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
mPopDirection=false
mContainer=androidx.fragment.app.FragmentContainerView{
9cce02e V.E...... ........ 0,52-1080,313 #7f0800d3 app:id/fragment_container1}
mView=android.widget.LinearLayout{
14dc9b5 V.E...... ........ 0,0-1080,261}
Child FragmentManager{
3de4c31 in FragmentA{
85b0d8}}}:
Back Stack Index: 0
FragmentManager misc state:
mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
mContainer=androidx.fragment.app.Fragment$4@fc38f16
mParent=FragmentA{
85b0d8} (d789ff6b-8df2-499b-a614-1e13d1496afa id=0x7f0800d3)
mCurState=7 mStateSaved=false mStopped=false mDestroyed=false
FragmentA{
70fbb60} (e04b5bf9-9719-4629-a914-bf9c0ef11b54 id=0x7f0800d3)
mFragmentId=#7f0800d3 mContainerId=#7f0800d3 mTag=null
mState=7 mWho=e04b5bf9-9719-4629-a914-bf9c0ef11b54 mBackStackNesting=0
mAdded=true mRemoving=false mFromLayout=false mInLayout=false
mHidden=false mDetached=false mMenuVisible=true mHasMenu=false
mRetainInstance=false mUserVisibleHint=true
mFragmentManager=FragmentManager{
90a3819 in HostCallbacks{
2c7b0de}}}
mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
mPopDirection=false
mContainer=androidx.fragment.app.FragmentContainerView{
9cce02e V.E...... ........ 0,52-1080,313 #7f0800d3 app:id/fragment_container1}
mView=android.widget.LinearLayout{
a1da7cf V.E...... ........ 0,0-1080,261}
Child FragmentManager{
9e22bf in FragmentA{
70fbb60}}}:
Back Stack Index: 0
FragmentManager misc state:
mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
mContainer=androidx.fragment.app.Fragment$4@a52d8c
mParent=FragmentA{
70fbb60} (e04b5bf9-9719-4629-a914-bf9c0ef11b54 id=0x7f0800d3)
mCurState=7 mStateSaved=false mStopped=false mDestroyed=false
FragmentA{
80cf313} (48e80f6d-d9b2-4ba2-a1a0-203127bab718 id=0x7f0800d3)
mFragmentId=#7f0800d3 mContainerId=#7f0800d3 mTag=null
mState=7 mWho=48e80f6d-d9b2-4ba2-a1a0-203127bab718 mBackStackNesting=1
mAdded=true mRemoving=false mFromLayout=false mInLayout=false
mHidden=false mDetached=false mMenuVisible=true mHasMenu=false
mRetainInstance=false mUserVisibleHint=true
mFragmentManager=FragmentManager{
90a3819 in HostCallbacks{
2c7b0de}}}
mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
mPopDirection=false
mContainer=androidx.fragment.app.FragmentContainerView{
9cce02e V.E...... ........ 0,52-1080,313 #7f0800d3 app:id/fragment_container1}
mView=android.widget.LinearLayout{
7a812e4 V.E...... ........ 0,0-1080,261}
Child FragmentManager{
3457950 in FragmentA{
80cf313}}}:
Back Stack Index: 0
FragmentManager misc state:
mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
mContainer=androidx.fragment.app.Fragment$4@36b3749
mParent=FragmentA{
80cf313} (48e80f6d-d9b2-4ba2-a1a0-203127bab718 id=0x7f0800d3)
mCurState=7 mStateSaved=false mStopped=false mDestroyed=false
Added Fragments:
#0: FragmentA{70fbb60} (e04b5bf9-9719-4629-a914-bf9c0ef11b54 id=0x7f0800d3)
#1: FragmentA{85b0d8} (d789ff6b-8df2-499b-a614-1e13d1496afa id=0x7f0800d3)
#2: FragmentA{80cf313} (48e80f6d-d9b2-4ba2-a1a0-203127bab718 id=0x7f0800d3)
Back Stack:
#0: BackStackEntry{af4f84e #0 myBackStack}
mName=myBackStack mIndex=0 mCommitted=true
Operations:
Op #0: ADD FragmentA{80cf313} (48e80f6d-d9b2-4ba2-a1a0-203127bab718 id=0x7f0800d3)
Back Stack Index: 1
FragmentManager misc state:
mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
mContainer=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
mCurState=7 mStateSaved=false mStopped=false mDestroyed=false
可以看出,Added Framents处已经有三个添加记录了,正是对应了我们之前三次添加的操作,并且按照添加的顺序,先添加的序号小,后添加的序号大。
这次添加操作我们增加了addToBackStack("myBackStack")
,将Fragment添加到容器View的同时,也添加到了BackStack。因此,注意到输出信息里Back Stack处也有了记录:
Back Stack:
#0: BackStackEntry{af4f84e #0 myBackStack}
mName=myBackStack mIndex=0 mCommitted=true
Operations:
Op #0: ADD FragmentA{80cf313} (48e80f6d-d9b2-4ba2-a1a0-203127bab718 id=0x7f0800d3)
Back Stack Index: 1
mName=myBackStack,对应了我们的addToBackStack("myBackStack")
Operations:里的#0: ADD FragmentA{80cf313}
,是添加到BackStack的Fragment记录。从 80cf313 可以看出和Added Fragments处的 #3 是同一个Fragment,也就是我们第三次添加的Fragment。这就证明了我们将Fragment添加到容器View的同时,也添加到了BackStack。
以上就是对adb命令查看Framgent的介绍,包括 adb命令 、 如何从大量输出结果里快速找到关键信息、如何从输出信息判断Fragment的状态。
本例只是用添加两三个Fragment作为简单演示,如果你想查看更加复杂的Fragment场景,可以结合上一篇文章Fragment的编辑-增删查替显示隐藏自己调用remove、replace等方法操作Fragment,然后用本文的方法查看Fragment状态,进一步加深对Fragment的理解。
文章浏览阅读257次。注意 : 文中 "加载区域" = 可视区域(父容器高度) * preload(用户使用时配置项中传入) = 可视区域(父容器高度) + 预加载区域 当访问页面时,如果一次性请求当前页面中的所有图片,会占用很大的资源。而图片懒加载所实现的功能,就是只加载用户加载区域的图片,而加载区域外的图片并不会进行资源请求,当页面滚动时会对当前加载区域的内容继续进行加载。其HTML加载过程如下: 已加载的图片为用..._jquery.alerts loading图标
文章浏览阅读3.1k次,点赞3次,收藏8次。1.多人协助实现分为如下几个步骤:1.从裸服务器将版本库克隆至本地(git clone)2.本地常规操作克隆下来的版本库不允许在master分支上做修改,修改要切换到dev分支或者你自己新建的分支进行操作,切换分支操作git checkout 分支名、查看分支命令 git branch小组成员需要建立属于自己的分支,每个分支代表着开发不同的功能,一般线上每个版本maste..._在git开发流程中,小组成员和小组长的开发流程是怎样的?
文章浏览阅读1.9k次。在小程序开发文档中,有个小程序页面配置,navigationStyle 有两个值,default默认样式custom自定义导航栏,只保留右上角胶囊按钮。可以参考文档具体说明https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/page.html这个最好只在一级页面设置,如果当前是二级页面的话,设置满屏左上角就没有返回键了,这个要注意下。(完结)下面是我自己的小程序,不过我放在二级页面里面.._小程序视频点击全屏怎么写
文章浏览阅读595次。CSS的代码规范_媒体查询执行顺序
文章浏览阅读292次。随着 Java 8 的出现,这门语言在许多地方发生了翻天覆地的变化。在新的版本中,代码的运用和实现上与以往不尽相同。与几年前我们依赖印刷媒体相比,YouTube,博客和 StackOve..._java编程思想最新版下载
文章浏览阅读731次,点赞2次,收藏4次。点击“开发者技术前线”,选择“星标????”让一部分开发者看到未来高赞回答一 作者:NYC-2009夫妻都是985的副教授。2019年度国家个人所得税的系统里面的税前是270k过一点(..._博士头衔在大厂重要么
文章浏览阅读1.4k次。随着社会的快速发展,计算机的影响是全面且深入的。人们的生活水平不断提高,日常生活中毕业生对招聘平台方面的要求也在不断提高,需要招聘平台的人数更是不断增加,使得毕业生信息招聘平台的开发成为必需而且紧迫的事情。毕业生信息招聘平台主要是借助计算机,通过对毕业生信息招聘平台所需的信息管理,增加毕业生选择,同时也方便对广大招聘平台的及时查询、修改以及对毕业生信息的及时了解。毕业生信息招聘平台对毕业生带来了更多的便利, 该系统通过和数据库管理系统软件协作来满足毕业生的需求。_基于ssm招聘网站论文
文章浏览阅读2.1w次,点赞6次,收藏16次。我们常常会在一些好莱坞电影大片里看到超级黑客高手,在电脑前轻松“黑”进别人的安全系统的场景。那纯熟自如地输入一大堆复杂的代码,不一下子就入侵/破解完成,其实这些网址就能帮你实现你的黑客演义梦http://hackcode.ishoulu.com/scp/http://hackcode.ishoulu.com/combine/http://hackcode.ishoulu.com/bla_htt://hackcode.ishoulucom/blackmesa/
文章浏览阅读274次。点击“开发者技术前线”,选择“星标”让一部分开发者看到未来作者丨潘昱来源丨《华为人》、心声社区2018年,坐在UCLA大学教室里,我和华为进行了一场视频面试。去投行从事对冲基金业务,..._美元外派服务app
文章浏览阅读5.5k次,点赞2次,收藏25次。由于有点学习得比较仓促,很多内容运用得不熟练,现在开始呢对部分问题试着自己解决一下,今天先来个简单的,后面慢慢加大难度。点击Sheet1里面的内容,自动显示Sheet2表格对应内容。sheet1功能:sheet2内容:解决思路:(1)用户点击Sheet1的B2到B6单元格时,触发SelectionChange事件,点击其他地方不触发;(2)根据sheet1点击的内容,筛选sheet2里面B列数据(3)把sheet2的数据复制到sheet1的显示区域。(4)把复._vba 输入框复制
文章浏览阅读1.9k次。1.EG3 关于嵌入式开发的站点,提供非常多关于嵌入式开发的资料。包括开发公司,技术文档,免费资源等等。版面包括busses & boards,embedded software,dsp,embedded systems,open source,rtos,embedded chi_嵌入式学习的开发平台
文章浏览阅读948次。反码的实质是一种特殊的补码,其特殊之处在于反码的模比补码的模小一个最低位上的1。反码的定义:ü 纯小数:0ü 纯整数:0根据反码的定义可得反码的求法:若x>=0,则使符号位为0,数值部分与x相同,即可得到x反;若x例4-1:已知x原码、x补码,求x反码。ü x原码=0.0101001 x原码>0,由定义反码为其自身,x反码=0.0_为什么纯小数的反码不能表示-1