文章目录
为了更好的了解Fragment在app中的存在状态(比如说,当前添加了几个Fragment、他们的层级关系如何、BackStack里有没有Fragment等),我们需要能够查看当前Fragment的情况。本文将介绍 如何通过adb命令行查看当前Fragment
1. 查看当前Fragment的adb命令
打开控制终端。就是那个黑窗口,window下可按win+R调出执行窗口,然后输入cmd,回车,就能弹出。mac电脑直接搜索terminal或者找到终端即可。
输入以下命令:
adb shell dumpsys activity fragment
2. 案例演示
下面用一个小案例来演示查看Fragment的过程。
2.1 案例代码
首先,准备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>
2.2 手机连接电脑,运行代码到手机
这里的连接指的是能够一键运行代码,安装到设备上进行调试开发的那种状态。需要开启开发者模式,打开USB调试,相信稍微有过Android开发经验的小伙伴都知道,不再赘述。
2.3 打开控制终端
打开控制终端。就是那个黑窗口,window下可按win+R调出执行窗口,然后输入cmd,回车,就能弹出。mac电脑直接搜索terminal或者找到终端即可。
2.4 输入adb命令
也就是上文提到的,输入以下命令:
adb shell dumpsys activity fragment
2.5 查看输出结果
输出内容很多,直接拉到最后,看关键词:“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按钮。
2.6 添加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、状态等信息。
关键信息解释:
- Active Fragments:当前活跃的Fragment
- Added Fragments: 当前被添加到容器View的Fragment
- Back Stack: Fragment后台栈的情况
让我们再点击一次“添加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代表第二次添加的。
2.7 添加Fragment,并添加到BackStack,再命令查看
点击“添加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。
3. 总结
以上就是对adb命令查看Framgent的介绍,包括 adb命令 、 如何从大量输出结果里快速找到关键信息、如何从输出信息判断Fragment的状态。
本例只是用添加两三个Fragment作为简单演示,如果你想查看更加复杂的Fragment场景,可以结合上一篇文章Fragment的编辑-增删查替显示隐藏自己调用remove、replace等方法操作Fragment,然后用本文的方法查看Fragment状态,进一步加深对Fragment的理解。