An Android library for managing multiple stacks of fragments

Overview

Build Status

FragNav

Android library for managing multiple stacks of fragments (e.g., Bottom Navigation , Navigation Drawer). This library does NOT include the UI for bottom tab bar layout. For that, I recommend either BottomBar (which is the library shown in the demo) or AHBottomNavigation. This library helps maintain order after pushing onto and popping from multiple stacks(tabs). It also helps with switching between desired tabs and clearing the stacks.

Donations

Did I help you out, save you some time, make your life easier? Oh, cool. Want to say thanks, buy me a coffee or a beer? HEY THANKS! I appreciate it.

Cash App

Paypal

Venmo

Restrictions

Fragments are maintained in a stack per Android's guideline https://developer.android.com/guide/navigation/navigation-principles#navigation_state_is_represented_as_a_stack_of_destinations . A lot of questions get asked about how to maintain only one instance of a fragment, or to pull out a fragment in the middle of the stack. That is outside Android navigation guidelines, and also this library. You may want to rethink your UX.

Sample

With Material Design Bottom Navigation pattern, and other tabbed navigation, managing multiple stacks of fragments can be a real headache. The example file shows best practice for navigating deep within a tab stack.

Gradle

implementation 'com.ncapdevi:frag-nav:3.2.0'   //or or `compile` if on older gradle version

How do I implement it?

Initialize using a builder and one of two methods

    private val fragNavController: FragNavController = FragNavController(supportFragmentManager, R.id.container)

1.

Create a list of fragments and pass them in

 val fragments = listOf(
                RecentsFragment.newInstance(0),
                FavoritesFragment.newInstance(0),
                NearbyFragment.newInstance(0),
                FriendsFragment.newInstance(0),
                FoodFragment.newInstance(0),
                RecentsFragment.newInstance(0),
                FavoritesFragment.newInstance(0),
                NearbyFragment.newInstance(0),
                FriendsFragment.newInstance(0),
                FoodFragment.newInstance(0),
                RecentsFragment.newInstance(0),
                FavoritesFragment.newInstance(0))

fragNavController.rootFragments = fragments

2.

Allow for dynamically creating the base class by implementing the NavListener in your class and overriding the getRootFragment method

public class YourActivity extends AppCompatActivity implements FragNavController.RootFragmentListener {
fragNavController.rootFragmentListener = this
    override val numberOfRootFragments: Int = 5

    override fun getRootFragment(index: Int): Fragment {
        when (index) {
            INDEX_RECENTS -> return RecentsFragment.newInstance(0)
            INDEX_FAVORITES -> return FavoritesFragment.newInstance(0)
            INDEX_NEARBY -> return NearbyFragment.newInstance(0)
            INDEX_FRIENDS -> return FriendsFragment.newInstance(0)
            INDEX_FOOD -> return FoodFragment.newInstance(0)
        }
        throw IllegalStateException("Need to send an index that we know")
    }

3.

        fragNavController.initialize(FragNavController.TAB3, savedInstanceState)

SaveInstanceState

Send in the supportFragment Manager, a list of base fragments, the container that you'll be using to display fragments. After that, you have four main functions that you can use In your activity, you'll also want to override your onSaveInstanceState like so

    override fun onSaveInstanceState(outState: Bundle?) {
        super.onSaveInstanceState(outState)
        fragNavController.onSaveInstanceState(outState!!)

    }

Switch tabs

Tab switching is indexed to try to prevent you from sending in wrong indices. It also will throw an error if you try to switch to a tab you haven't defined a base fragment for.

fragNavController.switchTab(NavController.TAB1);

Push a fragment

You can only push onto the currently selected index

        fragNavController.pushFragment(FoodFragment.newInstance())

Pop a fragment

You can only pop from the currently selected index. This can throw an UnsupportedOperationException if trying to pop the root fragment

        fragNavController.popFragment();

Pop multiple fragments

You can pop multiple fragments at once, with the same rules as above applying. If the pop depth is deeper than possible, it will stop when it gets to the root fragment

       fragNavController.popFragments(3);

Replacing a fragment

You can only replace onto the currently selected index

        fragNavController.replaceFragment(Fragment fragment);

You can also clear the stack to bring you back to the base fragment

        fragNavController.clearStack();

You can also navigate your DialogFragments using

        showDialogFragment(dialogFragment);
        clearDialogFragment();
        getCurrentDialogFrag()

Transaction Options

All of the above transactions can also be done with defined transaction options. The FragNavTransactionOptions have a builder that can be used.

class FragNavTransactionOptions private constructor(builder: Builder) {
    val sharedElements: List<Pair<View, String>> = builder.sharedElements
    @FragNavController.Transit
    val transition = builder.transition
    @AnimRes
    val enterAnimation = builder.enterAnimation
    @AnimRes
    val exitAnimation = builder.exitAnimation
    @AnimRes
    val popEnterAnimation = builder.popEnterAnimation
    @AnimRes
    val popExitAnimation = builder.popExitAnimation
    @StyleRes
    val transitionStyle = builder.transitionStyle
    val breadCrumbTitle: String? = builder.breadCrumbTitle
    val breadCrumbShortTitle: String? = builder.breadCrumbShortTitle
    val allowStateLoss: Boolean = builder.allowStateLoss

Get informed of fragment transactions

Have your activity implement FragNavController.TransactionListener and you will have methods that inform you of tab switches or fragment transactions

A sample application is in the repo if you need to see how it works.

Fragment Transitions

Can be set using the transactionOptions

Restoring Fragment State

Fragments transitions in this library use attach()/detch() (http://daniel-codes.blogspot.com/2012/06/fragment-transactions-reference.html). This is a delibrate choice in order to maintain the fragment's lifecycle, as well as being optimal for memory. This means that fragments will go through their proper lifecycle https://developer.android.com/guide/components/fragments.html#Lifecycle . This lifecycle includes going through OnCreateView which means that if you want to maintain view states, that is outside the scope of this library, and is up to the indiviudal fragment. There are plenty of resources out there that will help you design your fragments in such a way that their view state can be restored https://inthecheesefactory.com/blog/fragment-state-saving-best-practices/en and there are libraries that can help restore other states https://github.com/frankiesardo/icepick

Special Use Cases

History & Back navigation between tabs

The reason behind this feature is that many of the "big" apps out there has a fairly similar approach for handling back navigation. When the user starts to tap the back button the current tab's fragments are being thrown away (FragNav default configuration does this too). The more interesting part comes when the user reaches the "root" fragment of the current tab. At this point there are several approaches that we can choose:

  • Nothing happens on further back button taps - This is the default
  • FragNav tracks "Tab History" and send a tab switch signal and we navigate back in history to the previous tab.

To use the history keeping mode you'll have to add extra parameters to the builder:

mNavController = FragNavController.newBuilder(...)
                ...
                .switchController(FragNavTabHistoryController.UNLIMITED_TAB_HISTORY, new FragNavSwitchController() {
                    @Override
                    public void switchTab(int index, @Nullable FragNavTransactionOptions transactionOptions) {
                        bottomBar.selectTabAtPosition(index);
                    }
                })
                .build();

Here first we have to choose between two flavors (see below for details), then we'll have to provide a callback that handles the tab switch trigger (This is required so that our UI element that also contain the state of the selected tab can update itself - aka switching the tabs always triggered by the application never by FragNav).

UNLIMITED_TAB_HISTORY UNIQUE_TAB_HISTORY
Unlimited History Unique History

Show & Hide modes for fragment "replacement"

While having a good architecture and caching most of the data that is presented on a page makes attaching / detaching the fragments when switching pretty seamless there may be some cases where even a small glitch or slowdown can be bothering for the user. Let's assume a virtualized list with couple of hundred items, even if the attach is pretty fast and the data is available rebuilding all the cell items for the list is not immediate and user might see some loading / white screen. To optimize the experience we introduced 3 different possibility:

  • Using attach and detach for both opening new fragments on the current stack and switching between tabs - This is the default - DETACH

  • Using attach and detach for opening new fragments on the current stack and using show and hide for switching between tabs - DETACH_ON_NAVIGATE_HIDE_ON_SWITCH

    Having this setting we have a good balance between memory consumption and user experience. (we have at most as many fragment UI in the memory as the number of our tabs)

  • Using Fragment show and hide for both opening new fragments on the current stack and switching between tabs - HIDE

    This gives the best performance keeping all fragments in the memory so we won't have to wait for the rebuilding of them. However with many tabs and deep navigation stacks this can lead easily to memory consumption issues.

WARNING - Keep in mind that using show and hide does not trigger the usual lifecycle events of the fragments so app developer has to manually take care of handling state which is usually done in the Fragment onPause/Stop and onResume/Start methods.

mNavController = FragNavController.newBuilder(...)
                ...
                .fragmentHideStrategy(FragNavController.DETACH_ON_NAVIGATE_HIDE_ON_SWITCH)
                .eager(true)
                .build();

There is also a possibility to automatically add and inflate all the root fragments right after creation (This makes sense only using HIDE and DETACH_ON_NAVIGATE_HIDE_ON_SWITCH modes). To have this you should set "eager" mode to true on the builder (Default is false).

Apps Using FragNav

Feel free to send me a pull request with your app and I'll link you here:

Logo Name Play Store
RockbotDJ Rockbot DJ Get it on Google Play
RockbotRemote Rockbot Remote Get it on Google Play
Skyscanner Skyscanner Get it on Google Play
Fonic Fonic / Fonic Mobile Get it on Google Play
Just Expenses Just Expenses Get it on Google Play

Contributions

If you have any problems, feel free to create an issue or pull request.

The sample app in the repository uses BottomBar library.

License

FragNav Android Fragment Navigation Library
Copyright (c) 2016 Nic Capdevila (http://github.com/ncapdevi).

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • Bug: Clicking on pre-selected tab shows empty fragment instead of base fragment

    Bug: Clicking on pre-selected tab shows empty fragment instead of base fragment

    After the long awaited release, I could finally get rid of frag-nav as a locale module and include it as a dependency. Thank you for that! :)

    Unfortunately, I found an issue occurring in both versions 1.1.0 and 1.2.0:

    Previously I could click on a tab, which already was selected, and go back to the first fragment of the tab's stack. No matter if there were one or multiple fragments on the stack.

    Now, I just see an empty fragment.

    I assume this is a bug or must the library be used differently now?

    bug question 
    opened by p-fischer 24
  • The specified child already has a parent. You must call removeView()

    The specified child already has a parent. You must call removeView()

    i was making some modifications when android forced update to API 26 as there were a few bugs that weren't resolving.

    now app was just working fine with frag-nav 1.4.0 however, since i updated the support tools, bottom nav crashes. I understand the issue is that the parent isn't popping and the fragment i'm trying to access already has a parent, is there a quicker way than to integrate the newer version? i've been looking at revisions, i tried various methods and i'm just failing at it so far, been trying for a few hours.

    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

    at com.pnw.xyz.MainActivity.switchTab(MainActivity.java:428) at com.pnw.xyz.MainActivity$1.onClick(MainActivity.java:112)

    opened by Fahad-pnw 22
  • rollback separating intialization on construction

    rollback separating intialization on construction

    By separating initialize from construction we run into the situation where mSelectedTabIndex is set to 0, but none of the internals have been set up. This causes a NPE when calling getCurrentStack() and other functions that use mSelectedTabIndex. I think it makes more sense to default to TAB1 and initialize things on construction, but allow for delayed initialization by setting the defaultSelectedIndex to NO_TAB.

    You also run into a weird situation where the controller is restored from savedInstanceState, but then you call initialize which overrides the restored state.

    opened by liquidninja24 19
  • Custom popEnter/popExit Animations not working

    Custom popEnter/popExit Animations not working

    I've defined 4 animations enter, exit, popEnter, popExit. Before I migrated to this library, the animations were working correctly. When I try using them in this library (I added them as the defaults using the builder) for a "popFragment", the popEnter/popExit animations do not get used. Instead, the enter/exit animations get replayed.

    As a test to see if I was using the library incorrectly, I modified the test "Bottom Drawers" app but the same thing happens there.

    I've stepped through the library's code quite a bit, it looks like the animations are being set correctly, I can't find any obvious problem. I wonder though, because I never see popBackStack() ever being called, but rather some .remove() calls to get rid of fragments, maybe the animations are never triggered.

    Any ideas?

    bug 
    opened by drewlarsen 15
  • IllegalStateException: FragmentManager is already executing transactions

    IllegalStateException: FragmentManager is already executing transactions

    How can I avoid this exception?

    Fatal Exception: java.lang.IllegalStateException: FragmentManager is already executing transactions
    	androidx.fragment.app.FragmentManagerImpl.ensureExecReady (SourceFile:2207)
    	androidx.fragment.app.FragmentManagerImpl.execPendingActions (SourceFile:2267)
    	androidx.fragment.app.FragmentManagerImpl.executePendingTransactions (SourceFile:814)
    	com.ncapdevi.fragnav.FragNavController.tryPopFragmentsFromCurrentStack (SourceFile:745)
    	my.app.ui.base.BaseFragNavActivity.navigate (SourceFile:76)
    	my.app.ui.base.interfaces.FragmentNavigator$DefaultImpls.navigate$default (SourceFile:10)
    	my.app.ui.main.module.Fragment$initLive$7.invoke (SourceFile:80)
    	my.app.ui.main.module.Fragment$initLive$7.invoke (SourceFile:24)
    	my.app.ui.utils.extensions.LiveDataExtensionsKt$witness$1.onChanged (SourceFile:16)
    	my.app.util.arch.SingleLiveEvent$observe$1.onChanged (SourceFile:26)
    	androidx.lifecycle.LiveData.considerNotify (SourceFile:113)
    	androidx.lifecycle.LiveData.dispatchingValue (SourceFile:126)
    	androidx.lifecycle.LiveData$ObserverWrapper.activeStateChanged (SourceFile:424)
    	androidx.lifecycle.LiveData$LifecycleBoundObserver.onStateChanged (SourceFile:376)
    	androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent (SourceFile:355)
    	androidx.lifecycle.LifecycleRegistry.forwardPass (SourceFile:293)
    	androidx.lifecycle.LifecycleRegistry.sync (SourceFile:333)
    	androidx.lifecycle.LifecycleRegistry.moveToState (SourceFile:138)
    	androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent (SourceFile:124)
    	androidx.fragment.app.Fragment.performStart (SourceFile:2487)
    	androidx.fragment.app.FragmentManagerImpl.moveToState (SourceFile:1494)
    	androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState (SourceFile:1784)
    	androidx.fragment.app.BackStackRecord.executeOps (SourceFile:797)
    	androidx.fragment.app.FragmentManagerImpl.executeOps (SourceFile:2625)
    	androidx.fragment.app.FragmentManagerImpl.executeOpsTogether (SourceFile:2411)
    	androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute (SourceFile:2366)
    	androidx.fragment.app.FragmentManagerImpl.execPendingActions (SourceFile:2273)
    	androidx.fragment.app.FragmentManagerImpl$1.run (SourceFile:733)
    	android.os.Handler.handleCallback (Handler.java:789)
    	android.os.Handler.dispatchMessage (Handler.java:98)
    	android.os.Looper.loop (Looper.java:164)
    	android.app.ActivityThread.main (ActivityThread.java:6938)
    	java.lang.reflect.Method.invoke (Method.java)
    	com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:327)
    	com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)
    

    76's line is navController.executePendingTransactions():

     override fun navigate(fragment: Fragment, pop: Int) {
            when (fragment) {
                is BaseFragment<*> -> setTitle(fragment.getTitle(resources))
            }
            when (pop == 0) {
                true -> navController.pushFragment(fragment)
                else -> {
                    if (!navController.isRootFragment) {
                        navController.popFragments(pop)
                    } else Timber.e("Tried to pop when it's root fragment. Not cool.")
    
                    navController.pushFragment(fragment)
                }
            }
            navController.executePendingTransactions()
        }
    
    opened by alashow 14
  • switch tab without detach fragments

    switch tab without detach fragments

    I found that it will detach fragment once switch tabs, if so, fragments will recreate view while attach and some operation like data load will be performed every time. can we have a option to not detach/attach just hide/show fragment?

    enhancement help wanted question 
    opened by xxxifan 12
  • Fragment transition when restoring from saved state

    Fragment transition when restoring from saved state

    Hey Nick,

    When restoring from saved instance state the default transition animations are being applied to the current fragment: https://github.com/ncapdevi/FragNav/blob/master/frag-nav/src/main/java/com/ncapdevi/fragnav/FragNavController.java#L901

    I believe the call to switchTab should be invoked with an empty set of FragNavTransactionOptions so that the default options are overwritten, and the current tab / fragment is immediately shown.

    opened by liquidninja24 11
  • Feature request

    Feature request

    There is a method in FragNavController.class with the following signature:

    public void pushFragment(@Nullable Fragment fragment, @Nullable FragNavTransactionOptions transactionOptions)

    Inside that method is used a FragmentTransaction object and is called the commit() method on it.

    I wish we can have another pushFragment() method that uses commitAllowingStateLoss() method call on the FragmentTransaction object instead of simple commit() method call.

    The motivation for this request is that I get that annoying error in some cases:

    java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

    and I need, on my risk, to use commitAllowingStateLoss() on pushFragment().

    Thanks.

    enhancement help wanted 
    opened by predasorinionut 11
  • FragNav3.0 has memory leak?

    FragNav3.0 has memory leak?

    Memory Leak give varning all times with FragNav3.0 but old version not problem. Im writing java. new FragNav3.0 is kotlin.I know. but its a problem?

    * androidx.constraintlayout.widget.ConstraintLayout has leaked:
    * Toast$TN.mNextView
    * ↳ LinearLayout.mContext
    * ↳ TabHostActivity.!(fragNavController)!
    * ↳ FragNavController.!(fragmentManger)!
    * ↳ FragmentManagerImpl.!(mActive)!
    * ↳ SparseArray.!(mValues)!
    * ↳ array Object[].!([2])!
    * ↳ ListSummaryItemsFragment.pullToRefreshLayout
    * ↳ SwipeRefreshLayout.mParent
    * ↳ ConstraintLayout
    
    * Reference Key: b1449967-416d-4633-97ad-e6fe4c59b492
    * Device: Google google Android SDK built for x86 sdk_gphone_x86
    * Android Version: 9 API: 28 LeakCanary: 1.6.2 0ebc1fc
    * Durations: watch=5570ms, gc=135ms, heap dump=2267ms, analysis=5707ms
    
    * Details:
    * Instance of android.widget.Toast$TN
    |   static $class$status = -536870912
    |   static $class$methods = 1902976660
    |   static $class$primitiveType = 131072
    |   static $class$dexTypeIndex = 5868
    |   static $class$numReferenceStaticFields = 0
    |   static $class$accessFlags = 524288
    |   static $class$clinitThreadId = 0
    |   static $class$shadow$_klass_ = java.lang.Class
    |   static $class$extData = null
    |   static $class$sFields = 1902002436
    |   static LONG_DURATION_TIMEOUT = 7000
    |   static $class$dexClassDefIndex = 6024
    |   static $class$classLoader = null
    |   static SHOW = 0
    |   static $class$classSize = 284
    |   static $class$referenceInstanceOffsets = 1011
    |   static $class$virtualMethodsOffset = 3
    |   static $class$objectSizeAllocFastPath = 72
    |   static HIDE = 1
    |   static $class$copiedMethodsOffset = 8
    |   static $class$vtable = null
    |   static $class$superClass = android.app.ITransientNotification$Stub
    |   static $class$dexCache = java.lang.DexCache@1897591112 (0x711af148)
    |   static $class$componentType = null
    |   static $class$name = "android.widget.Toast$TN"
    |   static $class$objectSize = 72
    |   static $class$numReferenceInstanceFields = 6
    |   static $class$classFlags = 0
    |   static $class$shadow$_monitor_ = 536870912
    |   static $class$iFields = 1902002520
    |   static CANCEL = 2
    |   static $class$ifTable = java.lang.Object[6]@1898422456 (0x7127a0b8)
    |   static $classOverhead = byte[132]@1898650369 (0x712b1b01)
    |   static SHORT_DURATION_TIMEOUT = 4000
    |   mDuration = 1
    |   mGravity = 16
    |   mHandler = android.widget.Toast$TN$1@320340352 (0x13180180)
    |   mHorizontalMargin = 0.0
    |   mNextView = android.widget.LinearLayout@320340712 (0x131802e8)
    |   mPackageName = "com.corbone.beno.client.android"
    |   mParams = android.view.WindowManager$LayoutParams@320340144 (0x131800b0)
    |   mVerticalMargin = 0.0
    |   mView = android.widget.LinearLayout@320340712 (0x131802e8)
    |   mWM = android.view.WindowManagerImpl@315442448 (0x12cd4510)
    |   mX = 0
    |   mY = 0
    |   mDescriptor = "android.app.ITransientNotification"
    |   mObject = 3963891296
    |   mOwner = android.widget.Toast$TN@320339992 (0x13180018)
    |   shadow$_klass_ = android.widget.Toast$TN
    |   shadow$_monitor_ = 0
    * Instance of android.widget.LinearLayout
    |   static $class$status = -536870912
    |   static HORIZONTAL = 0
    |   static $class$methods = 1903972984
    |   static $class$primitiveType = 131072
    |   static SHOW_DIVIDER_BEGINNING = 1
    |   static $class$dexTypeIndex = 5524
    |   static VERTICAL_GRAVITY_COUNT = 4
    |   static sCompatibilityDone = true
    |   static $class$numReferenceStaticFields = 0
    |   static $class$accessFlags = 524289
    |   static $class$clinitThreadId = 0
    |   static $class$shadow$_klass_ = java.lang.Class
    |   static $class$extData = null
    |   static $class$sFields = 1902475480
    |   static INDEX_FILL = 3
    |   static $class$dexClassDefIndex = 6000
    |   static $class$classLoader = null
    |   static $class$classSize = 4170
    |   static INDEX_CENTER_VERTICAL = 0
    |   static $class$referenceInstanceOffsets = -1073741824
    |   static $class$virtualMethodsOffset = 11
    |   static $class$objectSizeAllocFastPath = 680
    |   static INDEX_TOP = 1
    |   static $class$copiedMethodsOffset = 63
    |   static $class$vtable = null
    |   static $class$superClass = android.view.ViewGroup
    |   static $class$dexCache = java.lang.DexCache@1897591112 (0x711af148)
    |   static $class$componentType = null
    |   static $class$name = "android.widget.LinearLayout"
    |   static sRemeasureWeightedChildren = true
    |   static $class$objectSize = 676
    |   static $class$numReferenceInstanceFields = 3
    |   static SHOW_DIVIDER_END = 4
    |   static INDEX_BOTTOM = 2
    |   static $class$classFlags = 0
    |   static $class$shadow$_monitor_ = 536870912
    |   static SHOW_DIVIDER_MIDDLE = 2
    |   static VERTICAL = 1
    |   static $class$iFields = 1902475692
    |   static $class$ifTable = java.lang.Object[10]@1897931960 (0x712024b8)
    |   static $classOverhead = byte[4000]@1898509121 (0x7128f341)
    |   static SHOW_DIVIDER_NONE = 0
    |   mAllowInconsistentMeasurement = false
    |   mBaselineAligned = true
    |   mBaselineAlignedChildIndex = -1
    |   mBaselineChildTop = 0
    |   mDivider = null
    |   mDividerHeight = 0
    |   mDividerPadding = 0
    |   mDividerWidth = 0
    |   mGravity = 8388659
    |   mLayoutDirection = 0
    |   mMaxAscent = null
    |   mMaxDescent = null
    |   mOrientation = 1
    |   mShowDividers = 0
    |   mTotalLength = 391
    |   mUseLargestChild = false
    |   mWeightSum = -1.0
    |   mAnimationListener = null
    |   mCachePaint = null
    |   mChildCountWithTransientState = 0
    |   mChildTransformation = null
    |   mChildUnhandledKeyListeners = 0
    |   mChildren = android.view.View[12]@320342552 (0x13180a18)
    |   mChildrenCount = 2
    |   mChildrenInterestedInDrag = null
    |   mCurrentDragChild = null
    |   mCurrentDragStartEvent = null
    |   mDefaultFocus = null
    |   mDisappearingChildren = null
    |   mFirstHoverTarget = null
    |   mFirstTouchTarget = null
    |   mFocused = null
    |   mFocusedInCluster = null
    |   mGroupFlags = 2244723
    |   mHoveredSelf = false
    |   mInvalidateRegion = null
    |   mInvalidationTransformation = null
    |   mIsInterestedInDrag = false
    |   mLastTouchDownIndex = -1
    |   mLastTouchDownTime = 0
    |   mLastTouchDownX = 0.0
    |   mLastTouchDownY = 0.0
    |   mLayoutAnimationController = null
    |   mLayoutCalledWhileSuppressed = false
    |   mLayoutMode = -1
    |   mLayoutTransitionListener = android.view.ViewGroup$4@320342536 (0x13180a08)
    |   mLocalPoint = null
    |   mNestedScrollAxes = 0
    |   mOnHierarchyChangeListener = null
    |   mPersistentDrawingCache = 2
    |   mPreSortedChildren = null
    |   mSuppressLayout = false
    |   mTempPoint = null
    |   mTooltipHoverTarget = null
    |   mTooltipHoveredSelf = false
    |   mTransientIndices = null
    |   mTransientViews = null
    |   mTransition = null
    |   mTransitioningViews = null
    |   mVisibilityChangingChildren = null
    |   mAccessibilityCursorPosition = -1
    |   mAccessibilityDelegate = null
    |   mAccessibilityPaneTitle = null
    |   mAccessibilityTraversalAfterId = -1
    |   mAccessibilityTraversalBeforeId = -1
    |   mAccessibilityViewId = -1
    |   mAnimator = null
    |   mAttachInfo = android.view.View$AttachInfo@320354936 (0x13183a78)
    |   mAttributes = null
    |   mAutofillHints = null
    |   mAutofillId = null
    |   mAutofillViewId = -1
    |   mBackground = android.graphics.drawable.GradientDrawable@320341784 (0x13180718)
    |   mBackgroundRenderNode = android.view.RenderNode@320366368 (0x13186720)
    |   mBackgroundResource = 0
    |   mBackgroundSizeChanged = false
    |   mBackgroundTint = null
    |   mBottom = 391
    |   mCachingFailed = false
    |   mClipBounds = null
    |   mContentDescription = null
    |   mContext = com.corbone.beno.client.android.activity.TabHostActivity@316248840 (0x12d99308)
    |   mCurrentAnimation = null
    |   mDefaultFocusHighlight = null
    |   mDefaultFocusHighlightCache = null
    |   mDefaultFocusHighlightEnabled = true
    |   mDefaultFocusHighlightSizeChanged = true
    |   mDrawableState = int[2]@1898293200 (0x7125a7d0)
    |   mDrawingCache = null
    |   mDrawingCacheBackgroundColor = 0
    |   mFloatingTreeObserver = null
    |   mForegroundInfo = null
    |   mFrameMetricsObservers = null
    |   mGhostView = null
    |   mHasPerformedLongPress = false
    |   mID = -1
    |   mIgnoreNextUpEvent = false
    |   mInContextButtonPress = false
    |   mInputEventConsistencyVerifier = null
    |   mKeyedTags = null
    |   mLabelForId = -1
    |   mLastIsOpaque = false
    |   mLayerPaint = null
    |   mLayerType = 0
    |   mLayoutInsets = null
    |   mLayoutParams = android.view.WindowManager$LayoutParams@320340144 (0x131800b0)
    |   mLeft = 0
    |   mLeftPaddingDefined = true
    |   mListenerInfo = null
    |   mLongClickX = NaN
    |   mLongClickY = NaN
    |   mMatchIdPredicate = null
    |   mMatchLabelForPredicate = null
    |   mMeasureCache = android.util.LongSparseLongArray@320359328 (0x13184ba0)
    |   mMeasuredHeight = 391
    |   mMeasuredWidth = 840
    |   mMinHeight = 0
    |   mMinWidth = 0
    |   mNestedScrollingParent = null
    |   mNextClusterForwardId = -1
    |   mNextFocusDownId = -1
    |   mNextFocusForwardId = -1
    |   mNextFocusLeftId = -1
    |   mNextFocusRightId = -1
    |   mNextFocusUpId = -1
    |   mOldHeightMeasureSpec = -2147483257
    |   mOldWidthMeasureSpec = -2147482808
    |   mOutlineProvider = android.view.ViewOutlineProvider$1@1897749000 (0x711d5a08)
    |   mOverScrollMode = 1
    |   mOverlay = null
    |   mPaddingBottom = 42
    |   mPaddingLeft = 42
    |   mPaddingRight = 42
    |   mPaddingTop = 42
    |   mParent = android.view.ViewRootImpl@320351216 (0x13182bf0)
    |   mPendingCheckForLongPress = null
    |   mPendingCheckForTap = null
    |   mPerformClick = null
    |   mPointerIcon = null
    |   mPrivateFlags = 16812080
    |   mPrivateFlags2 = 1611867680
    |   mPrivateFlags3 = 536870916
    |   mRecreateDisplayList = false
    |   mRenderNode = android.view.RenderNode@320341392 (0x13180590)
    |   mResources = android.content.res.Resources@316253840 (0x12d9a690)
    |   mRight = 840
    |   mRightPaddingDefined = true
    |   mRoundScrollbarRenderer = null
    |   mRunQueue = null
    |   mScrollCache = null
    |   mScrollIndicatorDrawable = null
    |   mScrollX = 0
    |   mScrollY = 0
    |   mSendViewScrolledAccessibilityEvent = null
    |   mSendingHoverAccessibilityEvents = false
    |   mStartActivityRequestWho = null
    |   mStateListAnimator = null
    |   mSystemUiVisibility = 0
    |   mTag = null
    |   mTempNestedScrollConsumed = null
    |   mTooltipInfo = null
    |   mTop = 0
    |   mTouchDelegate = null
    |   mTouchSlop = 21
    |   mTransformationInfo = null
    |   mTransientStateCount = 0
    |   mTransitionName = null
    |   mUnscaledDrawingCache = null
    |   mUnsetPressedState = null
    |   mUserPaddingBottom = 42
    |   mUserPaddingEnd = -2147483648
    |   mUserPaddingLeft = 42
    |   mUserPaddingLeftInitial = 42
    |   mUserPaddingRight = 42
    |   mUserPaddingRightInitial = 42
    |   mUserPaddingStart = -2147483648
    |   mVerticalScrollFactor = 0.0
    |   mVerticalScrollbarPosition = 0
    |   mViewFlags = 402653328
    |   mVisibilityChangeForAutofillHandler = null
    |   mWindowAttachCount = 1
    |   shadow$_klass_ = android.widget.LinearLayout
    |   shadow$_monitor_ = 0
    * Instance of com.corbone.beno.client.android.activity.TabHostActivity
    |   static $class$status = -536870912
    |   static $class$methods = 3998710680
    |   static $class$primitiveType = 131072
    |   static $change = null
    |   static $class$dexTypeIndex = 321
    |   static $class$numReferenceStaticFields = 2
    |   static $class$accessFlags = 524289
    |   static $class$clinitThreadId = 12204
    |   static $class$shadow$_klass_ = java.lang.Class
    |   static $class$extData = null
    |   static $class$sFields = 3998710408
    |   static $class$dexClassDefIndex = 154
    |   static $class$classLoader = dalvik.system.PathClassLoader@315181064 (0x12c94808)
    |   static $class$classSize = 2432
    |   static $class$referenceInstanceOffsets = -1073741824
    |   static $class$virtualMethodsOffset = 6
    |   static $class$objectSizeAllocFastPath = 352
    |   static log = java.util.logging.Logger@318440464 (0x12fb0410)
    |   static serialVersionUID = -3562897586443766621
    |   static $class$copiedMethodsOffset = 28
    |   static $class$vtable = null
    |   static $class$superClass = com.corbone.beno.client.android.base.BaseActivity
    |   static $class$dexCache = java.lang.DexCache@315878224 (0x12d3eb50)
    |   static $class$componentType = null
    |   static $class$name = "com.corbone.beno.client.android.activity.TabHostActivity"
    |   static $class$objectSize = 352
    |   static $class$numReferenceInstanceFields = 10
    |   static $class$classFlags = 0
    |   static $class$shadow$_monitor_ = -1898045558
    |   static $class$iFields = 3998710464
    |   static $class$ifTable = java.lang.Object[46]@318440192 (0x12fb0300)
    |   static $classOverhead = byte[2292]@315901105 (0x12d444b1)
    |   activateShakeDetector = false
    |   backButtonPressedLapsedTime = 0
    |   currentTab = com.corbone.beno.model.Tab@317090392 (0x12e66a58)
    |   fragNavController = com.ncapdevi.fragnav.FragNavController@317090464 (0x12e66aa0)
    |   organizationKnoad = com.corbone.beno.model.Knoad@317025152 (0x12e56b80)
    |   profileKnoad = com.corbone.beno.model.Knoad@317025264 (0x12e56bf0)
    |   qrReaderClassRowId = null
    |   scannerContent = null
    |   shakeDetector = com.corbone.beno.client.android.utils.ShakeDetector@317090544 (0x12e66af0)
    |   tabChangeRequest = false
    |   tabHost = com.google.android.material.bottomnavigation.BottomNavigationView@316810312 (0x12e22448)
    |   tabs = java.util.ArrayList@317025208 (0x12e56bb8)
    |   toolbar = androidx.appcompat.widget.Toolbar@316883544 (0x12e34258)
    |   mAlertDialog = com.corbone.beno.client.android.base.LoadingDialogView@317090576 (0x12e66b10)
    |   mConnectionChangeReceiver = com.corbone.beno.client.android.utils.network.ConnectionChangeReceiver@317090672 (0x12e66b70)
    |   mDialogTitle = null
    |   mNoConnectionDialog = null
    |   mSlidingMenu = com.corbone.beno.client.android.base.SlidingMenu@316893400 (0x12e368d8)
    |   runningDataOperation = 0
    |   toolbar = null
    |   mDelegate = androidx.appcompat.app.AppCompatDelegateImpl@316249256 (0x12d994a8)
    |   mResources = null
    |   mThemeId = 2131820965
    |   mCreated = true
    |   mFragments = androidx.fragment.app.FragmentController@317090696 (0x12e66b88)
    |   mHandler = androidx.fragment.app.FragmentActivity$1@317090712 (0x12e66b98)
    |   mNextCandidateRequestIndex = 0
    |   mPendingFragmentActivityResults = androidx.collection.SparseArrayCompat@317090744 (0x12e66bb8)
    |   mRequestedPermissionsFromFragment = false
    |   mResumed = true
    |   mStartedActivityFromFragment = false
    |   mStartedIntentSenderFromFragment = false
    |   mStopped = false
    |   mViewModelStore = null
    |   mExtraDataMap = androidx.collection.SimpleArrayMap@317090768 (0x12e66bd0)
    |   mLifecycleRegistry = androidx.lifecycle.LifecycleRegistry@317090792 (0x12e66be8)
    |   mActionBar = null
    |   mActionModeTypeStarting = 0
    |   mActivityInfo = android.content.pm.ActivityInfo@317024496 (0x12e568f0)
    |   mActivityTransitionState = android.app.ActivityTransitionState@317090824 (0x12e66c08)
    |   mApplication = com.corbone.beno.client.android.application.BenoApp@315189784 (0x12c96a18)
    |   mAutoFillIgnoreFirstResumePause = false
    |   mAutoFillResetNeeded = true
    |   mAutofillManager = android.view.autofill.AutofillManager@316539896 (0x12de03f8)
    |   mAutofillPopupWindow = null
    |   mCalled = true
    |   mCanEnterPictureInPicture = true
    |   mChangeCanvasToTranslucent = false
    |   mChangingConfigurations = false
    |   mComponent = android.content.ComponentName@317024968 (0x12e56ac8)
    |   mConfigChangeFlags = 0
    |   mCurrentConfig = android.content.res.Configuration@317090880 (0x12e66c40)
    |   mDecor = com.android.internal.policy.DecorView@316251696 (0x12d99e30)
    |   mDefaultKeyMode = 0
    |   mDefaultKeySsb = null
    |   mDestroyed = false
    |   mDoReportFullyDrawn = true
    |   mEmbeddedID = null
    |   mEnableDefaultActionBarUp = false
    |   mEnterTransitionListener = android.app.SharedElementCallback$1@1897687312 (0x711c6910)
    |   mExitTransitionListener = android.app.SharedElementCallback$1@1897687312 (0x711c6910)
    |   mFinished = false
    |   mFragments = android.app.FragmentController@317090992 (0x12e66cb0)
    |   mHandler = android.os.Handler@317091008 (0x12e66cc0)
    |   mHasCurrentPermissionsRequest = false
    |   mIdent = 24161167
    |   mInstanceTracker = android.os.StrictMode$InstanceTracker@317091040 (0x12e66ce0)
    |   mInstrumentation = android.app.Instrumentation@317091056 (0x12e66cf0)
    |   mIntent = android.content.Intent@317024672 (0x12e569a0)
    |   mLastAutofillId = 1073741870
    |   mLastNonConfigurationInstances = null
    |   mMainThread = android.app.ActivityThread@315097464 (0x12c80178)
    |   mManagedCursors = java.util.ArrayList@317091128 (0x12e66d38)
    |   mManagedDialogs = null
    |   mMenuInflater = null
    |   mParent = null
    |   mReferrer = "com.corbone.beno.client.android"
    |   mRestoredFromBundle = true
    |   mResultCode = 0
    |   mResultData = null
    |   mResumed = true
    |   mSearchEvent = null
    |   mSearchManager = null
    |   mStartedActivity = false
    |   mStopped = false
    |   mTaskDescription = android.app.ActivityManager$TaskDescription@317091152 (0x12e66d50)
    |   mTemporaryPause = false
    |   mTitle = "Dexter"
    |   mTitleColor = 0
    |   mTitleReady = true
    |   mToken = android.os.BinderProxy@316253424 (0x12d9a4f0)
    |   mTranslucentCallback = null
    |   mUiThread = java.lang.Thread@1968768864 (0x75590760)
    |   mVisibleFromClient = true
    |   mVisibleFromServer = true
    |   mVoiceInteractor = null
    |   mWindow = com.android.internal.policy.PhoneWindow@316250640 (0x12d99a10)
    |   mWindowAdded = true
    |   mWindowManager = android.view.WindowManagerImpl@316253648 (0x12d9a5d0)
    |   mInflater = com.android.internal.policy.PhoneLayoutInflater@316252872 (0x12d9a2c8)
    |   mOverrideConfiguration = null
    |   mResources = android.content.res.Resources@316253840 (0x12d9a690)
    |   mTheme = android.content.res.Resources$Theme@316253880 (0x12d9a6b8)
    |   mThemeResource = 2131820965
    |   mBase = android.content.ContextWrapper@317091192 (0x12e66d78)
    |   shadow$_klass_ = com.corbone.beno.client.android.activity.TabHostActivity
    |   shadow$_monitor_ = -2024538872
    * Instance of com.ncapdevi.fragnav.FragNavController
    |   static $class$methods = 3999014664
    |   static EXTRA_CURRENT_FRAGMENT = "com.ncapdevi.fragnav.FragNavController:EXTRA_CURRENT_FRAGMENT"
    |   static $class$primitiveType = 131072
    |   static $class$dexTypeIndex = 5548
    |   static $class$numReferenceStaticFields = 5
    |   static $class$extData = null
    |   static $class$sFields = 3999013864
    |   static $class$classLoader = dalvik.system.PathClassLoader@315181064 (0x12c94808)
    |   static Companion = com.ncapdevi.fragnav.FragNavController$Companion@318579240 (0x12fd2228)
    |   static $class$classSize = 464
    |   static $class$referenceInstanceOffsets = 4095
    |   static $class$objectSizeAllocFastPath = 80
    |   static TAB19 = 18
    |   static TAB18 = 17
    |   static $class$vtable = null
    |   static TAB17 = 16
    |   static TAB16 = 15
    |   static TAB15 = 14
    |   static $class$dexCache = java.lang.DexCache@315460960 (0x12cd8d60)
    |   static $class$componentType = null
    |   static $class$name = "com.ncapdevi.fragnav.FragNavController"
    |   static $class$objectSize = 74
    |   static $class$numReferenceInstanceFields = 12
    |   static TAB1 = 0
    |   static TAB2 = 1
    |   static TAB3 = 2
    |   static TAB4 = 3
    |   static NO_TAB = -1
    |   static TAB5 = 4
    |   static $class$ifTable = java.lang.Object[0]@1896352608 (0x71080b60)
    |   static TAB14 = 13
    |   static TAB6 = 5
    |   static TAB13 = 12
    |   static TAB7 = 6
    |   static TAB12 = 11
    |   static TAB8 = 7
    |   static TAB11 = 10
    |   static TAB9 = 8
    |   static DETACH = 0
    |   static TAB10 = 9
    |   static EXTRA_FRAGMENT_STACK = "com.ncapdevi.fragnav.FragNavController:EXTRA_FRAGMENT_STACK"
    |   static $class$status = -536870912
    |   static $class$accessFlags = 524305
    |   static $class$clinitThreadId = 12204
    |   static $class$shadow$_klass_ = java.lang.Class
    |   static $class$dexClassDefIndex = 2979
    |   static EXTRA_TAG_COUNT = "com.ncapdevi.fragnav.FragNavController:EXTRA_TAG_COUNT"
    |   static $class$virtualMethodsOffset = 28
    |   static TAB20 = 19
    |   static HIDE = 1
    |   static $class$copiedMethodsOffset = 70
    |   static $class$superClass = java.lang.Object
    |   static REMOVE = 3
    |   static EXTRA_SELECTED_TAB_INDEX = "com.ncapdevi.fragnav.FragNavController:EXTRA_SELECTED_TAB_INDEX"
    |   static $class$classFlags = 0
    |   static $class$shadow$_monitor_ = 0
    |   static $class$iFields = 3999014368
    |   static DETACH_ON_NAVIGATE_HIDE_ON_SWITCH = 2
    |   static $classOverhead = byte[216]@315606449 (0x12cfc5b1)
    |   static MAX_NUM_TABS = 20
    |   containerId = 2131362087
    |   createEager = false
    |   currentStackIndex = 1
    |   defaultTransactionOptions = com.ncapdevi.fragnav.FragNavTransactionOptions@317196256 (0x12e807e0)
    |   executingTransaction = false
    |   fragNavLogger = null
    |   fragNavTabHistoryController = com.ncapdevi.fragnav.tabhistory.CurrentTabHistoryController@317196304 (0x12e80810)
    |   fragmentCache = java.util.LinkedHashMap@317196320 (0x12e80820)
    |   fragmentHideStrategy = 0
    |   fragmentManger = androidx.fragment.app.FragmentManagerImpl@316246864 (0x12d98b50)
    |   fragmentStacksTags = java.util.ArrayList@317196376 (0x12e80858)
    |   mCurrentDialogFrag = null
    |   mCurrentFrag = com.corbone.beno.client.android.fragment.ListWallPostsFragment@316241080 (0x12d974b8)
    |   navigationStrategy = com.ncapdevi.fragnav.tabhistory.CurrentTabStrategy@317196400 (0x12e80870)
    |   rootFragmentListener = null
    |   rootFragments = java.util.ArrayList@317196408 (0x12e80878)
    |   tagCount = 5
    |   transactionListener = null
    |   shadow$_klass_ = com.ncapdevi.fragnav.FragNavController
    |   shadow$_monitor_ = 0
    * Instance of androidx.fragment.app.FragmentManagerImpl
    |   static $class$status = -536870912
    |   static ANIM_STYLE_FADE_ENTER = 5
    |   static $class$methods = 4059851136
    |   static $class$primitiveType = 131072
    |   static $class$dexTypeIndex = 1908
    |   static $class$numReferenceStaticFields = 10
    |   static $class$accessFlags = 524304
    |   static $class$clinitThreadId = 12204
    |   static $class$shadow$_klass_ = java.lang.Class
    |   static ANIM_STYLE_OPEN_ENTER = 1
    |   static $class$extData = null
    |   static $class$sFields = 4059850352
    |   static $class$dexClassDefIndex = 4396
    |   static $class$classLoader = dalvik.system.PathClassLoader@315181064 (0x12c94808)
    |   static DECELERATE_QUINT = android.view.animation.DecelerateInterpolator@318501640 (0x12fbf308)
    |   static $class$classSize = 645
    |   static ANIM_STYLE_FADE_EXIT = 6
    |   static ANIM_STYLE_CLOSE_EXIT = 4
    |   static $class$referenceInstanceOffsets = 4194303
    |   static $class$virtualMethodsOffset = 31
    |   static $class$objectSizeAllocFastPath = 112
    |   static VIEW_STATE_TAG = "android:view_state"
    |   static ACCELERATE_QUINT = android.view.animation.AccelerateInterpolator@318501600 (0x12fbf2e0)
    |   static TARGET_STATE_TAG = "android:target_state"
    |   static $class$copiedMethodsOffset = 132
    |   static $class$vtable = null
    |   static sAnimationListenerField = java.lang.reflect.Field@318501656 (0x12fbf318)
    |   static $class$superClass = androidx.fragment.app.FragmentManager
    |   static ANIM_STYLE_OPEN_EXIT = 2
    |   static $class$dexCache = java.lang.DexCache@315460960 (0x12cd8d60)
    |   static ANIM_DUR = 220
    |   static ANIM_STYLE_CLOSE_ENTER = 3
    |   static $class$componentType = null
    |   static $class$name = null
    |   static $class$objectSize = 110
    |   static DECELERATE_CUBIC = android.view.animation.DecelerateInterpolator@318501624 (0x12fbf2f8)
    |   static TARGET_REQUEST_CODE_STATE_TAG = "android:target_req_state"
    |   static $class$numReferenceInstanceFields = 22
    |   static USER_VISIBLE_HINT_TAG = "android:user_visible_hint"
    |   static $class$classFlags = 0
    |   static $class$shadow$_monitor_ = 0
    |   static $class$iFields = 4059850648
    |   static TAG = "FragmentManager"
    |   static $class$ifTable = java.lang.Object[4]@318501544 (0x12fbf2a8)
    |   static $classOverhead = byte[452]@315704345 (0x12d14419)
    |   static ACCELERATE_CUBIC = android.view.animation.AccelerateInterpolator@318501576 (0x12fbf2c8)
    |   static DEBUG = false
    |   mActive = android.util.SparseArray@317210728 (0x12e84068)
    |   mAdded = java.util.ArrayList@317210752 (0x12e84080)
    |   mAvailBackStackIndices = null
    |   mBackStack = null
    |   mBackStackChangeListeners = null
    |   mBackStackIndices = null
    |   mContainer = androidx.fragment.app.FragmentActivity$HostCallbacks@316246976 (0x12d98bc0)
    |   mCreatedMenus = java.util.ArrayList@317210776 (0x12e84098)
    |   mCurState = 4
    |   mDestroyed = false
    |   mExecCommit = androidx.fragment.app.FragmentManagerImpl$1@317210800 (0x12e840b0)
    |   mExecutingActions = false
    |   mHavePendingDeferredStart = false
    |   mHost = androidx.fragment.app.FragmentActivity$HostCallbacks@316246976 (0x12d98bc0)
    |   mLifecycleCallbacks = java.util.concurrent.CopyOnWriteArrayList@317210816 (0x12e840c0)
    |   mNeedMenuInvalidate = false
    |   mNextFragmentIndex = 6
    |   mNoTransactionsBecause = null
    |   mParent = null
    |   mPendingActions = java.util.ArrayList@317210832 (0x12e840d0)
    |   mPostponedTransactions = null
    |   mPrimaryNav = null
    |   mSavedNonConfig = null
    |   mStateArray = null
    |   mStateBundle = null
    |   mStateSaved = false
    |   mStopped = false
    |   mTmpAddedFragments = java.util.ArrayList@317210856 (0x12e840e8)
    |   mTmpIsPop = java.util.ArrayList@317210880 (0x12e84100)
    |   mTmpRecords = java.util.ArrayList@317210904 (0x12e84118)
    |   shadow$_klass_ = androidx.fragment.app.FragmentManagerImpl
    |   shadow$_monitor_ = 0
    * Instance of android.util.SparseArray
    |   static $class$status = -536870912
    |   static $class$methods = 1903669988
    |   static $class$primitiveType = 131072
    |   static $class$dexTypeIndex = 4154
    |   static $class$numReferenceStaticFields = 1
    |   static $class$accessFlags = 524289
    |   static $class$clinitThreadId = 0
    |   static $class$shadow$_klass_ = java.lang.Class
    |   static $class$extData = null
    |   static $class$sFields = 1902320368
    |   static $class$dexClassDefIndex = 1750
    |   static $class$classLoader = null
    |   static $class$classSize = 248
    |   static $class$referenceInstanceOffsets = 3
    |   static $class$virtualMethodsOffset = 4
    |   static $class$objectSizeAllocFastPath = 24
    |   static DELETED = java.lang.Object@1897591592 (0x711af328)
    |   static $class$copiedMethodsOffset = 24
    |   static $class$vtable = null
    |   static $class$superClass = java.lang.Object
    |   static $class$dexCache = java.lang.DexCache@1897591112 (0x711af148)
    |   static $class$componentType = null
    |   static $class$name = "android.util.SparseArray"
    |   static $class$objectSize = 21
    |   static $class$numReferenceInstanceFields = 2
    |   static $class$classFlags = 0
    |   static $class$shadow$_monitor_ = 536870912
    |   static $class$iFields = 1902320388
    |   static $class$ifTable = java.lang.Object[2]@1898010280 (0x712156a8)
    |   static $classOverhead = byte[120]@1899207361 (0x71339ac1)
    |   mGarbage = false
    |   mKeys = int[11]@317469160 (0x12ec31e8)
    |   mSize = 5
    |   mValues = java.lang.Object[11]@317469216 (0x12ec3220)
    |   shadow$_klass_ = android.util.SparseArray
    |   shadow$_monitor_ = 0
    * Array of java.lang.Object[]
    |   [0] = com.corbone.beno.client.android.fragment.EmptyFragment@317469272 (0x12ec3258)
    |   [1] = com.corbone.beno.client.android.fragment.KnoadDetailFragment@317469424 (0x12ec32f0)
    |   [2] = com.corbone.beno.client.android.fragment.ListSummaryItemsFragment@317221696 (0x12e86b40)
    |   [3] = com.bumptech.glide.manager.SupportRequestManagerFragment@317211976 (0x12e84548)
    |   [4] = com.corbone.beno.client.android.fragment.ListWallPostsFragment@316241080 (0x12d974b8)
    |   [5] = null
    |   [6] = null
    |   [7] = null
    |   [8] = null
    |   [9] = null
    |   [10] = null
    * Instance of com.corbone.beno.client.android.fragment.ListSummaryItemsFragment
    |   static $class$status = -536870912
    |   static $class$methods = 3956371808
    |   static $class$primitiveType = 131072
    |   static $change = null
    |   static $class$dexTypeIndex = 252
    |   static $class$numReferenceStaticFields = 1
    |   static $class$accessFlags = 524289
    |   static $class$clinitThreadId = 12204
    |   static $class$shadow$_klass_ = java.lang.Class
    |   static $class$extData = null
    |   static $class$sFields = 3956371768
    |   static $class$dexClassDefIndex = 160
    |   static $class$classLoader = dalvik.system.PathClassLoader@315181064 (0x12c94808)
    |   static $class$classSize = 912
    |   static $class$referenceInstanceOffsets = -1073741824
    |   static $class$virtualMethodsOffset = 7
    |   static $class$objectSizeAllocFastPath = 192
    |   static serialVersionUID = -6479134344003965144
    |   static $class$copiedMethodsOffset = 17
    |   static $class$vtable = null
    |   static $class$superClass = com.corbone.beno.client.android.fragment.base.ListSummaryItemsBase
    |   static $class$dexCache = java.lang.DexCache@316058080 (0x12d6a9e0)
    |   static $class$componentType = null
    |   static $class$name = "com.corbone.beno.client.android.fragment.ListSummaryItemsFragment"
    |   static $class$objectSize = 186
    |   static $class$numReferenceInstanceFields = 0
    |   static $class$classFlags = 0
    |   static $class$shadow$_monitor_ = -1963309916
    |   static $class$iFields = 0
    |   static $class$ifTable = java.lang.Object[18]@318436048 (0x12faf2d0)
    |   static $classOverhead = byte[776]@315914129 (0x12d47791)
    |   SEARCHVIEW_ENTER_BUTTON = 2131492873
    |   adapter = com.corbone.beno.client.android.adapter.MultipleInfoAdapter@317222664 (0x12e86f08)
    |   destroyableObjects = java.util.ArrayList@317222824 (0x12e86fa8)
    |   deviceWidth = 420
    |   isRefreshRequest = true
    |   loadMore = false
    |   offset = 0
    |   pullToRefreshLayout = androidx.swiperefreshlayout.widget.SwipeRefreshLayout@317222848 (0x12e86fc0)
    |   recyclerView = androidx.recyclerview.widget.RecyclerView@317223608 (0x12e872b8)
    |   searchViewHelper = com.corbone.beno.client.android.utils.SearchViewHelper@317224480 (0x12e87620)
    |   loaded = false
    |   weakActivity = java.lang.ref.WeakReference@317224496 (0x12e87630)
    |   mAdded = false
    |   mAnimationInfo = androidx.fragment.app.Fragment$AnimationInfo@317224520 (0x12e87648)
    |   mArguments = android.os.Bundle@1897727168 (0x711d04c0)
    |   mBackStackNesting = 0
    |   mCalled = true
    |   mChildFragmentManager = androidx.fragment.app.FragmentManagerImpl@317221504 (0x12e86a80)
    |   mChildNonConfig = null
    |   mContainer = null
    |   mContainerId = 2131362087
    |   mDeferStart = false
    |   mDetached = true
    |   mFragmentId = 2131362087
    |   mFragmentManager = androidx.fragment.app.FragmentManagerImpl@316246864 (0x12d98b50)
    |   mFromLayout = false
    |   mHasMenu = true
    |   mHidden = false
    |   mHiddenChanged = false
    |   mHost = androidx.fragment.app.FragmentActivity$HostCallbacks@316246976 (0x12d98bc0)
    |   mInLayout = false
    |   mIndex = 2
    |   mInnerView = null
    |   mIsCreated = true
    |   mIsNewlyAdded = false
    |   mLayoutInflater = com.android.internal.policy.PhoneLayoutInflater@317224600 (0x12e87698)
    |   mLifecycleRegistry = androidx.lifecycle.LifecycleRegistry@317224648 (0x12e876c8)
    |   mMenuVisible = true
    |   mParentFragment = null
    |   mPerformedCreateView = false
    |   mPostponedAlpha = 0.0
    |   mRemoving = false
    |   mRestored = true
    |   mRetainInstance = false
    |   mRetaining = false
    |   mSavedFragmentState = null
    |   mSavedUserVisibleHint = null
    |   mSavedViewState = android.util.SparseArray@317224680 (0x12e876e8)
    |   mState = 1
    |   mTag = "com.corbone.beno.client.android.fragment.ListSummaryItemsFragment3"
    |   mTarget = null
    |   mTargetIndex = -1
    |   mTargetRequestCode = 0
    |   mUserVisibleHint = true
    |   mView = null
    |   mViewLifecycleOwner = null
    |   mViewLifecycleOwnerLiveData = androidx.lifecycle.MutableLiveData@317224792 (0x12e87758)
    |   mViewLifecycleRegistry = androidx.lifecycle.LifecycleRegistry@317224832 (0x12e87780)
    |   mViewModelStore = androidx.lifecycle.ViewModelStore@317224864 (0x12e877a0)
    |   mWho = "android:fragment:2"
    |   shadow$_klass_ = com.corbone.beno.client.android.fragment.ListSummaryItemsFragment
    |   shadow$_monitor_ = -2031295120
    * Instance of androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    |   static DEFAULT = 1
    |   static $class$status = -536870912
    |   static ANIMATE_TO_START_DURATION = 200
    |   static $class$methods = 3974148016
    |   static $class$primitiveType = 131072
    |   static CIRCLE_BG_LIGHT = -328966
    |   static LOG_TAG = "SwipeRefreshLayout"
    |   static MAX_ALPHA = 255
    |   static $class$dexTypeIndex = 2420
    |   static $class$numReferenceStaticFields = 2
    |   static $class$accessFlags = 524289
    |   static $class$clinitThreadId = 12204
    |   static $class$shadow$_klass_ = java.lang.Class
    |   static $class$extData = null
    |   static $class$sFields = 3974147056
    |   static $class$dexClassDefIndex = 4507
    |   static DRAG_RATE = 0.5
    |   static $class$classLoader = dalvik.system.PathClassLoader@315181064 (0x12c94808)
    |   static LARGE = 0
    |   static $class$classSize = 4136
    |   static INVALID_POINTER = -1
    |   static $class$referenceInstanceOffsets = -1073741824
    |   static $class$virtualMethodsOffset = 19
    |   static $class$objectSizeAllocFastPath = 760
    |   static CIRCLE_DIAMETER = 40
    |   static $class$copiedMethodsOffset = 68
    |   static $class$vtable = null
    |   static $class$superClass = android.view.ViewGroup
    |   static $class$dexCache = java.lang.DexCache@315460960 (0x12cd8d60)
    |   static DEFAULT_SLINGSHOT_DISTANCE = -1
    |   static ANIMATE_TO_TRIGGER_DURATION = 200
    |   static MAX_PROGRESS_ANGLE = 0.8
    |   static $class$componentType = null
    |   static $class$name = "androidx.swiperefreshlayout.widget.SwipeRefreshLayout"
    |   static $class$objectSize = 756
    |   static ALPHA_ANIMATION_DURATION = 300
    |   static $class$numReferenceInstanceFields = 18
    |   static DEFAULT_CIRCLE_TARGET = 64
    |   static LAYOUT_ATTRS = int[1]@318591536 (0x12fd5230)
    |   static $class$classFlags = 0
    |   static $class$shadow$_monitor_ = 0
    |   static CIRCLE_DIAMETER_LARGE = 56
    |   static $class$iFields = 3974147368
    |   static DECELERATE_INTERPOLATION_FACTOR = 2.0
    |   static $class$ifTable = java.lang.Object[14]@318591392 (0x12fd51a0)
    |   static STARTING_PROGRESS_ALPHA = 76
    |   static $classOverhead = byte[3936]@315575697 (0x12cf4d91)
    |   static SCALE_DOWN_DURATION = 150
    |   mActivePointerId = 0
    |   mAlphaMaxAnimation = null
    |   mAlphaStartAnimation = null
    |   mAnimateToCorrectPosition = androidx.swiperefreshlayout.widget.SwipeRefreshLayout$6@317456384 (0x12ec0000)
    |   mAnimateToStartPosition = androidx.swiperefreshlayout.widget.SwipeRefreshLayout$7@317456504 (0x12ec0078)
    |   mChildScrollUpCallback = null
    |   mCircleDiameter = 105
    |   mCircleView = androidx.swiperefreshlayout.widget.CircleImageView@317456624 (0x12ec00f0)
    |   mCircleViewIndex = 1
    |   mCurrentTargetOffsetTop = -105
    |   mCustomSlingshotDistance = 0
    |   mDecelerateInterpolator = android.view.animation.DecelerateInterpolator@317457192 (0x12ec0328)
    |   mFrom = 0
    |   mInitialDownY = 288.22266
    |   mInitialMotionY = 0.0
    |   mIsBeingDragged = false
    |   mListener = com.corbone.beno.client.android.fragment.ListSummaryItemsFragment@317221696 (0x12e86b40)
    |   mMediumAnimationDuration = 400
    |   mNestedScrollInProgress = false
    |   mNestedScrollingChildHelper = androidx.core.view.NestedScrollingChildHelper@317457208 (0x12ec0338)
    |   mNestedScrollingParentHelper = androidx.core.view.NestedScrollingParentHelper@317457240 (0x12ec0358)
    |   mNotify = false
    |   mOriginalOffsetTop = -105
    |   mParentOffsetInWindow = int[2]@317457256 (0x12ec0368)
    |   mParentScrollConsumed = int[2]@317457280 (0x12ec0380)
    |   mProgress = androidx.swiperefreshlayout.widget.CircularProgressDrawable@317457304 (0x12ec0398)
    |   mRefreshListener = androidx.swiperefreshlayout.widget.SwipeRefreshLayout$1@317457368 (0x12ec03d8)
    |   mRefreshing = false
    |   mReturningToStart = false
    |   mScale = false
    |   mScaleAnimation = null
    |   mScaleDownAnimation = null
    |   mScaleDownToStartAnimation = null
    |   mSpinnerOffsetEnd = 168
    |   mStartingScale = 0.0
    |   mTarget = androidx.recyclerview.widget.RecyclerView@317223608 (0x12e872b8)
    |   mTotalDragDistance = 168.0
    |   mTotalUnconsumed = 0.0
    |   mTouchSlop = 21
    |   mUsingCustomStart = false
    |   mAnimationListener = null
    |   mCachePaint = null
    |   mChildCountWithTransientState = 0
    |   mChildTransformation = null
    |   mChildUnhandledKeyListeners = 0
    |   mChildren = android.view.View[12]@317457384 (0x12ec03e8)
    |   mChildrenCount = 2
    |   mChildrenInterestedInDrag = null
    |   mCurrentDragChild = null
    |   mCurrentDragStartEvent = null
    |   mDefaultFocus = null
    |   mDisappearingChildren = null
    |   mFirstHoverTarget = null
    |   mFirstTouchTarget = null
    |   mFocused = null
    |   mFocusedInCluster = null
    |   mGroupFlags = 2245715
    |   mHoveredSelf = false
    |   mInvalidateRegion = null
    |   mInvalidationTransformation = null
    |   mIsInterestedInDrag = false
    |   mLastTouchDownIndex = 0
    |   mLastTouchDownTime = 307823782
    |   mLastTouchDownX = 417.35962
    |   mLastTouchDownY = 288.22266
    |   mLayoutAnimationController = null
    |   mLayoutCalledWhileSuppressed = false
    |   mLayoutMode = -1
    |   mLayoutTransitionListener = android.view.ViewGroup$4@317457448 (0x12ec0428)
    |   mLocalPoint = null
    |   mNestedScrollAxes = 0
    |   mOnHierarchyChangeListener = null
    |   mPersistentDrawingCache = 2
    |   mPreSortedChildren = java.util.ArrayList@317457464 (0x12ec0438)
    |   mSuppressLayout = false
    |   mTempPoint = float[2]@317457488 (0x12ec0450)
    |   mTooltipHoverTarget = null
    |   mTooltipHoveredSelf = false
    |   mTransientIndices = null
    |   mTransientViews = null
    |   mTransition = null
    |   mTransitioningViews = null
    |   mVisibilityChangingChildren = null
    |   mAccessibilityCursorPosition = -1
    |   mAccessibilityDelegate = null
    |   mAccessibilityPaneTitle = null
    |   mAccessibilityTraversalAfterId = -1
    |   mAccessibilityTraversalBeforeId = -1
    |   mAccessibilityViewId = -1
    |   mAnimator = null
    |   mAttachInfo = null
    |   mAttributes = null
    |   mAutofillHints = null
    |   mAutofillId = null
    |   mAutofillViewId = -1
    |   mBackground = null
    |   mBackgroundRenderNode = null
    |   mBackgroundResource = 0
    |   mBackgroundSizeChanged = true
    |   mBackgroundTint = null
    |   mBottom = 1453
    |   mCachingFailed = false
    |   mClipBounds = null
    |   mContentDescription = null
    |   mContext = com.corbone.beno.client.android.activity.TabHostActivity@316248840 (0x12d99308)
    |   mCurrentAnimation = null
    |   mDefaultFocusHighlight = null
    |   mDefaultFocusHighlightCache = null
    |   mDefaultFocusHighlightEnabled = true
    |   mDefaultFocusHighlightSizeChanged = true
    |   mDrawableState = int[3]@1898293224 (0x7125a7e8)
    |   mDrawingCache = null
    |   mDrawingCacheBackgroundColor = 0
    |   mFloatingTreeObserver = null
    |   mForegroundInfo = null
    |   mFrameMetricsObservers = null
    |   mGhostView = null
    |   mHasPerformedLongPress = false
    |   mID = 2131362140
    |   mIgnoreNextUpEvent = false
    |   mInContextButtonPress = false
    |   mInputEventConsistencyVerifier = null
    |   mKeyedTags = null
    |   mLabelForId = -1
    |   mLastIsOpaque = false
    |   mLayerPaint = null
    |   mLayerType = 0
    |   mLayoutInsets = null
    |   mLayoutParams = androidx.constraintlayout.widget.ConstraintLayout$LayoutParams@317457512 (0x12ec0468)
    |   mLeft = 0
    |   mLeftPaddingDefined = false
    |   mListenerInfo = null
    |   mLongClickX = NaN
    |   mLongClickY = NaN
    |   mMatchIdPredicate = null
    |   mMatchLabelForPredicate = null
    |   mMeasureCache = android.util.LongSparseLongArray@317457792 (0x12ec0580)
    |   mMeasuredHeight = 1453
    |   mMeasuredWidth = 1080
    |   mMinHeight = 0
    |   mMinWidth = 0
    |   mNestedScrollingParent = null
    |   mNextClusterForwardId = -1
    |   mNextFocusDownId = -1
    |   mNextFocusForwardId = -1
    |   mNextFocusLeftId = -1
    |   mNextFocusRightId = -1
    |   mNextFocusUpId = -1
    |   mOldHeightMeasureSpec = 1073743277
    |   mOldWidthMeasureSpec = 1073742904
    |   mOutlineProvider = android.view.ViewOutlineProvider$1@1897749000 (0x711d5a08)
    |   mOverScrollMode = 1
    |   mOverlay = null
    |   mPaddingBottom = 0
    |   mPaddingLeft = 0
    |   mPaddingRight = 0
    |   mPaddingTop = 0
    |   mParent = androidx.constraintlayout.widget.ConstraintLayout@317236040 (0x12e8a348)
    |   mPendingCheckForLongPress = null
    |   mPendingCheckForTap = null
    |   mPerformClick = null
    |   mPointerIcon = null
    |   mPrivateFlags = -2128472048
    |   mPrivateFlags2 = 1610819112
    |   mPrivateFlags3 = 0
    |   mRecreateDisplayList = false
    |   mRenderNode = android.view.RenderNode@317457816 (0x12ec0598)
    |   mResources = android.content.res.Resources@316253840 (0x12d9a690)
    |   mRight = 1080
    |   mRightPaddingDefined = false
    |   mRoundScrollbarRenderer = null
    |   mRunQueue = null
    |   mScrollCache = null
    |   mScrollIndicatorDrawable = null
    |   mScrollX = 0
    |   mScrollY = 0
    |   mSendViewScrolledAccessibilityEvent = null
    |   mSendingHoverAccessibilityEvents = false
    |   mStartActivityRequestWho = null
    |   mStateListAnimator = null
    |   mSystemUiVisibility = 0
    |   mTag = null
    |   mTempNestedScrollConsumed = null
    |   mTooltipInfo = null
    |   mTop = 0
    |   mTouchDelegate = null
    |   mTouchSlop = 21
    |   mTransformationInfo = null
    |   mTransientStateCount = 0
    |   mTransitionName = null
    |   mUnscaledDrawingCache = null
    |   mUnsetPressedState = null
    |   mUserPaddingBottom = 0
    |   mUserPaddingEnd = -2147483648
    |   mUserPaddingLeft = 0
    |   mUserPaddingLeftInitial = 0
    |   mUserPaddingRight = 0
    |   mUserPaddingRightInitial = 0
    |   mUserPaddingStart = -2147483648
    |   mVerticalScrollFactor = 0.0
    |   mVerticalScrollbarPosition = 0
    |   mViewFlags = 402653200
    |   mVisibilityChangeForAutofillHandler = null
    |   mWindowAttachCount = 1
    |   shadow$_klass_ = androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    |   shadow$_monitor_ = 0
    * Instance of androidx.constraintlayout.widget.ConstraintLayout
    |   static $class$status = -536870912
    |   static $class$methods = 4003579848
    |   static $class$primitiveType = 131072
    |   static USE_CONSTRAINTS_HELPER = true
    |   static $class$dexTypeIndex = 1409
    |   static $class$numReferenceStaticFields = 2
    |   static $class$accessFlags = 524289
    |   static $class$clinitThreadId = 12204
    |   static $class$shadow$_klass_ = java.lang.Class
    |   static $class$extData = null
    |   static DESIGN_INFO_ID = 0
    |   static $class$sFields = 4003579400
    |   static $class$dexClassDefIndex = 469
    |   static $class$classLoader = dalvik.system.PathClassLoader@315181064 (0x12c94808)
    |   static $class$classSize = 4056
    |   static $class$referenceInstanceOffsets = -1073741824
    |   static $class$virtualMethodsOffset = 11
    |   static $class$objectSizeAllocFastPath = 696
    |   static $class$copiedMethodsOffset = 44
    |   static $class$vtable = null
    |   static $class$superClass = android.view.ViewGroup
    |   static $class$dexCache = java.lang.DexCache@315460960 (0x12cd8d60)
    |   static $class$componentType = null
    |   static $class$name = "androidx.constraintlayout.widget.ConstraintLayout"
    |   static $class$objectSize = 696
    |   static $class$numReferenceInstanceFields = 7
    |   static VERSION = "ConstraintLayout-1.1.3"
    |   static $class$classFlags = 0
    |   static $class$shadow$_monitor_ = 0
    |   static $class$iFields = 4003579520
    |   static TAG = "ConstraintLayout"
    |   static $class$ifTable = java.lang.Object[10]@318586176 (0x12fd3d40)
    |   static $classOverhead = byte[3916]@315584137 (0x12cf6e89)
    |   static DEBUG = false
    |   static CACHE_MEASURED_DIMENSION = false
    |   static ALLOWS_EMBEDDED = false
    |   mChildrenByIds = android.util.SparseArray@317236776 (0x12e8a628)
    |   mConstraintHelpers = java.util.ArrayList@317236800 (0x12e8a640)
    |   mConstraintSet = null
    |   mConstraintSetId = -1
    |   mDesignIds = java.util.HashMap@317236824 (0x12e8a658)
    |   mDirtyHierarchy = true
    |   mLastMeasureHeight = -1
    |   mLastMeasureHeightMode = 0
    |   mLastMeasureHeightSize = -1
    |   mLastMeasureWidth = -1
    |   mLastMeasureWidthMode = 0
    |   mLastMeasureWidthSize = -1
    |   mLayoutWidget = androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer@317236864 (0x12e8a680)
    |   mMaxHeight = 2147483647
    |   mMaxWidth = 2147483647
    |   mMetrics = null
    |   mMinHeight = 0
    |   mMinWidth = 0
    |   mOptimizationLevel = 7
    |   mVariableDimensionsWidgets = java.util.ArrayList@317237232 (0x12e8a7f0)
    |   mAnimationListener = null
    |   mCachePaint = null
    |   mChildCountWithTransientState = 0
    |   mChildTransformation = null
    |   mChildUnhandledKeyListeners = 0
    |   mChildren = android.view.View[12]@317237256 (0x12e8a808)
    |   mChildrenCount = 2
    |   mChildrenInterestedInDrag = null
    |   mCurrentDragChild = null
    |   mCurrentDragStartEvent = null
    |   mDefaultFocus = null
    |   mDisappearingChildren = null
    |   mFirstHoverTarget = null
    |   mFirstTouchTarget = null
    |   mFocused = null
    |   mFocusedInCluster = null
    |   mGroupFlags = 2244691
    |   mHoveredSelf = false
    |   mInvalidateRegion = null
    |   mInvalidationTransformation = null
    |   mIsInterestedInDrag = false
    |   mLastTouchDownIndex = 1
    |   mLastTouchDownTime = 307823782
    |   mLastTouchDownX = 417.35962
    |   mLastTouchDownY = 288.22266
    |   mLayoutAnimationController = null
    |   mLayoutCalledWhileSuppressed = false
    |   mLayoutMode = -1
    |   mLayoutTransitionListener = android.view.ViewGroup$4@317237320 (0x12e8a848)
    |   mLocalPoint = null
    |   mNestedScrollAxes = 0
    |   mOnHierarchyChangeListener = null
    |   mPersistentDrawingCache = 2
    |   mPreSortedChildren = null
    |   mSuppressLayout = false
    |   mTempPoint = float[2]@317237336 (0x12e8a858)
    |   mTooltipHoverTarget = null
    |   mTooltipHoveredSelf = false
    |   mTransientIndices = null
    |   mTransientViews = null
    |   mTransition = null
    |   mTransitioningViews = null
    |   mVisibilityChangingChildren = null
    |   mAccessibilityCursorPosition = -1
    |   mAccessibilityDelegate = null
    |   mAccessibilityPaneTitle = null
    |   mAccessibilityTraversalAfterId = -1
    |   mAccessibilityTraversalBeforeId = -1
    |   mAccessibilityViewId = -1
    |   mAnimator = null
    |   mAttachInfo = null
    |   mAttributes = null
    |   mAutofillHints = null
    |   mAutofillId = null
    |   mAutofillViewId = -1
    |   mBackground = null
    |   mBackgroundRenderNode = null
    |   mBackgroundResource = 0
    |   mBackgroundSizeChanged = true
    |   mBackgroundTint = null
    |   mBottom = 1453
    |   mCachingFailed = false
    |   mClipBounds = null
    |   mContentDescription = null
    |   mContext = com.corbone.beno.client.android.activity.TabHostActivity@316248840 (0x12d99308)
    |   mCurrentAnimation = null
    |   mDefaultFocusHighlight = null
    |   mDefaultFocusHighlightCache = null
    |   mDefaultFocusHighlightEnabled = true
    |   mDefaultFocusHighlightSizeChanged = true
    |   mDrawableState = int[3]@1898293224 (0x7125a7e8)
    |   mDrawingCache = null
    |   mDrawingCacheBackgroundColor = 0
    |   mFloatingTreeObserver = null
    |   mForegroundInfo = null
    |   mFrameMetricsObservers = null
    |   mGhostView = null
    |   mHasPerformedLongPress = false
    |   mID = -1
    |   mIgnoreNextUpEvent = false
    |   mInContextButtonPress = false
    |   mInputEventConsistencyVerifier = null
    |   mKeyedTags = null
    |   mLabelForId = -1
    |   mLastIsOpaque = false
    |   mLayerPaint = null
    |   mLayerType = 0
    |   mLayoutInsets = null
    |   mLayoutParams = android.widget.FrameLayout$LayoutParams@317237360 (0x12e8a870)
    |   mLeft = 0
    |   mLeftPaddingDefined = false
    |   mListenerInfo = null
    |   mLongClickX = NaN
    |   mLongClickY = NaN
    |   mMatchIdPredicate = null
    |   mMatchLabelForPredicate = null
    |   mMeasureCache = android.util.LongSparseLongArray@317237416 (0x12e8a8a8)
    |   mMeasuredHeight = 1453
    |   mMeasuredWidth = 1080
    |   mMinHeight = 0
    |   mMinWidth = 0
    |   mNestedScrollingParent = null
    |   mNextClusterForwardId = -1
    |   mNextFocusDownId = -1
    |   mNextFocusForwardId = -1
    |   mNextFocusLeftId = -1
    |   mNextFocusRightId = -1
    |   mNextFocusUpId = -1
    |   mOldHeightMeasureSpec = 1073743277
    |   mOldWidthMeasureSpec = 1073742904
    |   mOutlineProvider = android.view.ViewOutlineProvider$1@1897749000 (0x711d5a08)
    |   mOverScrollMode = 1
    |   mOverlay = null
    |   mPaddingBottom = 0
    |   mPaddingLeft = 0
    |   mPaddingRight = 0
    |   mPaddingTop = 0
    |   mParent = null
    |   mPendingCheckForLongPress = null
    |   mPendingCheckForTap = null
    |   mPerformClick = null
    |   mPointerIcon = null
    |   mPrivateFlags = -2128537424
    |   mPrivateFlags2 = 1610819112
    |   mPrivateFlags3 = 1
    |   mRecreateDisplayList = false
    |   mRenderNode = android.view.RenderNode@317237440 (0x12e8a8c0)
    |   mResources = android.content.res.Resources@316253840 (0x12d9a690)
    |   mRight = 1080
    |   mRightPaddingDefined = false
    |   mRoundScrollbarRenderer = null
    |   mRunQueue = null
    |   mScrollCache = null
    |   mScrollIndicatorDrawable = null
    |   mScrollX = 0
    |   mScrollY = 0
    |   mSendViewScrolledAccessibilityEvent = null
    |   mSendingHoverAccessibilityEvents = false
    |   mStartActivityRequestWho = null
    |   mStateListAnimator = null
    |   mSystemUiVisibility = 0
    |   mTag = null
    |   mTempNestedScrollConsumed = null
    |   mTooltipInfo = null
    |   mTop = 0
    |   mTouchDelegate = null
    |   mTouchSlop = 21
    |   mTransformationInfo = null
    |   mTransientStateCount = 0
    |   mTransitionName = null
    |   mUnscaledDrawingCache = null
    |   mUnsetPressedState = null
    |   mUserPaddingBottom = 0
    |   mUserPaddingEnd = -2147483648
    |   mUserPaddingLeft = 0
    |   mUserPaddingLeftInitial = 0
    |   mUserPaddingRight = 0
    |   mUserPaddingRightInitial = 0
    |   mUserPaddingStart = -2147483648
    |   mVerticalScrollFactor = 0.0
    |   mVerticalScrollbarPosition = 0
    |   mViewFlags = 939524240
    |   mVisibilityChangeForAutofillHandler = null
    |   mWindowAttachCount = 1
    |   shadow$_klass_ = androidx.constraintlayout.widget.ConstraintLayout
    |   shadow$_monitor_ = 0
    * Excluded Refs:
    | Field: android.os.Message.obj
    | Field: android.os.Message.next
    | Field: android.os.Message.target
    | Field: android.view.Choreographer$FrameDisplayEventReceiver.mMessageQueue (always)
    | Field: android.view.ViewGroup$ViewLocationHolder.mRoot
    | Thread:FinalizerWatchdogDaemon (always)
    | Thread:main (always)
    | Thread:LeakCanary-Heap-Dump (always)
    | Class:java.lang.ref.WeakReference (always)
    | Class:java.lang.ref.SoftReference (always)
    | Class:java.lang.ref.PhantomReference (always)
    | Class:java.lang.ref.Finalizer (always)
    | Class:java.lang.ref.FinalizerReference (always)
    
    opened by burakztrk 10
  • Request upgrade to Android X

    Request upgrade to Android X

    @ncapdevi Request to upgrade FragNav to Android X

    Because the support library and the androidx library are incompatible, This will lead to multiple errors. Because support is about to be replaced by androidx. image image

    Refactor AndroidX URL:

    https://android-developers.googleblog.com/2018/05/hello-world-androidx.html https://developer.android.com/studio/preview/features/#androidx_refactoring https://dl.google.com/dl/android/maven2/index.html

    image

    opened by tcqq 10
  • Show/Hide fragment

    Show/Hide fragment

    Hello, I need to keep the state of fragments when switching between tabs and not reload them every time. Would it be possible to replace attach() in reattachPreviousFragment() with show() and replace detach() in detachCurrentFragment() with hide()?

    could you add an option to choose whether to attach/detach or show/hide fragment? Thanks

    opened by adibon 10
  • Cannot find or not found code in Kotlin dsl

    Cannot find or not found code in Kotlin dsl

    I implement this "com.ncapdevi:frag-nav:3.3.0" in Kotlin dsl app build.gradle.kts but cannot found the code in main activity. Like this please how to fix it Screen Shot 2022-06-27 at 23 25 04

    opened by thawzintoe-codigo 0
  • Be able to setMaxLifecycle during the fragment transaction

    Be able to setMaxLifecycle during the fragment transaction

    Story

    There's a known issue that if you use the hiding strategy on the fragment switch, the fragment's lifecycle won't be changed.

    However, there's a new setMaxLifecycle function been added in the FragmentTransaction which can set the maximum lifecycle state during the transaction, and ViewPager2.FragmentStateAdapter actually has such implementation.

    Bringing this function call to the library for the hiding strategy, so the fragment lifecycle will be triggered properly during switching.

    What have been changed in this PR:

    • Offered a setMaxLifecycleOnSwitch flag in FragNavController, and set max lifecycle to "Started" for those fragments that are going to be hidden in the transaction.
    • Updated quite a lot of dependencies and gradle plugins
    • Adjusted the gradle settings for publishing

    Related issue: https://github.com/ncapdevi/FragNav/issues/244

    Original pull request: https://github.com/bandlab/FragNav/pull/2 coauthored by @gildor

    opened by kevinguitar 0
  • Memory Leak when the user closes the dialog shown via FragNavController.showDialogFragment

    Memory Leak when the user closes the dialog shown via FragNavController.showDialogFragment

    I was profiling my app and noticed that my closed dialog is not being garbage collected. Then I checked the references and found out that the FragNavController was holding a ref, namely the mCurrentDialogFrag field. I suggest you make a weak reference to the current dialog frag instead of a strong reference for such cases.

    opened by alexeiartsimovich 0
  • How to use Shared Elements Transition with FragNav ?

    How to use Shared Elements Transition with FragNav ?

    I'm working on a single activity app with multiple tabs and in one of my fragments I have a recyclerview full of products, How can I implement Shared Elements transition on my items to open a details screen with an animation ?

    opened by gabriel-TheCode 0
  • Hide Strategy

    Hide Strategy

    "WARNING - Keep in mind that using show and hide does not trigger the usual lifecycle events of the fragments"

    What strategy should I use to have the normal lifecycle of the fragments? Actually I have a bug, when I relaunch a fragment that I have already started, it does nothing. I have a blank screen, and none of the lifecycles method is triggered.

    opened by GoriunovAlexandr 1
Releases(3.3.0)
  • 3.3.0(Jun 25, 2019)

  • 3.2.0(Mar 18, 2019)

  • 3.1.0(Dec 26, 2018)

    • Ability to clear a stack other than the one you are currently on #172
    • Migrate to AndroidX #161
    • Fix pop animation #176
    • General improvements and tests added
    Source code(tar.gz)
    Source code(zip)
  • 3.0.0(Nov 19, 2018)

    Major release. The library has been transitioned to Kotlin.

    The builder has been entirely removed. This allows for creating a Non-Nullable val object of the FragNavController, as the only things required for initializing the controller are the Container (this should never change) and the fragmentManager (ditto). Everything else can be set as pleased and will be correctly initialized using the initialize function. The secondary benefit to this is that if you are using a single Activity, and need to change the tab structure, you can set things on the fly and just call the initialize function when needed.

    Please refer to the sample app for suggested best practices, and I will be updating the readme as well as taking feedback over the next couple weeks.

    Source code(tar.gz)
    Source code(zip)
  • 3.0.0-RC(Apr 22, 2018)

    This is a pre-release in order to get some in field testing. Since this is a major re-write, I want to give a week or two of usage, bug fixing, feedback before going live with a production ready release.

    This is a Major point release, meaning it has breaking changes.

    The library has been completed transitioned over to Kotlin, but with the intention of having it as easy to use as possible on either Java or Kotlin. That being said, some heavy underlying changes were made in order to optimize things for Kotlin (without making any sacrifices on the Java end)

    The builder has been entirely removed. This allows for creating a Non-Nullable val object of the FragNavController, as the only things required for initializing the controller are the Container (this should never change) and the fragmentManager (ditto). Everything else can be set as pleased and will be correctly initialized using the initialize function. The secondary benefit to this is that if you are using a single Activity, and need to change the tab structure, you can set things on the fly and just call the initialize function when needed.

    Please refer to the sample app for suggested best practices, and I will be updating the readme as well as taking feedback over the next couple weeks.

    Source code(tar.gz)
    Source code(zip)
  • 2.4.0(Nov 21, 2017)

    • removed executePendingTransactions from being called after every commit, and instead made the function public and open for the consumer to decide when it is needed
    • added 3 navigation strategies via #98 Thanks @mateherber !
    Source code(tar.gz)
    Source code(zip)
  • 2.3.0(Nov 16, 2017)

    • Modified how public Fragment getCurrentFrag() works. There were previously situations where a fragment had been transacted, and thus was on the stack, but the function was still returning the previous function. This should no longer be the case.
    • Made void initialize(@TabIndex int index) a public function. This can be useful if you want to clear all the stacks and start over.
    Source code(tar.gz)
    Source code(zip)
  • 2.2.3(Oct 9, 2017)

  • 2.2.2(Sep 19, 2017)

  • 2.2.1(Sep 9, 2017)

    • added boolean isStateSaved() function to check if the FragmentManager is in a saved state. This is useful to know before hand so you can decide to allowStateLoss
    Source code(tar.gz)
    Source code(zip)
  • 2.1.0(Aug 5, 2017)

  • 2.0.2(Jun 4, 2017)

  • 2.0.1(Apr 30, 2017)

  • 2.0.0(Apr 4, 2017)

    Lots of new things!

    • FragNavTransactionOptions Use these with your transactions to do things like SharedElementAnimations, TransitionAnimations, or setting breadcrumbs.
    • FragNavController now created via a builder. The number of possible constructors was growing way too wildly, so instead, we're switching to a builder pattern. The main Builder constructor takes in the required things. It is required that at least one of the following is set: trootfragment, rootfragments, or a rootfragmentlistner.
    • general code cleanup and bug fixex
    • Lots more testing to keep things going
    Source code(tar.gz)
    Source code(zip)
  • 1.4.0(Jan 23, 2017)

    -getCurrentSack() now returns a copy of the stack as opposed to the original object. This prevents outside manipulation of the stack that could easily lead to problems.

    Source code(tar.gz)
    Source code(zip)
  • 1.3.0(Jan 23, 2017)

    • Deprecated push() and pop() in favor of the more clear pushFragment() and popFragment()
    • Added the ability to pop multiple fragments at once via popFragments(int popDepth)
    Source code(tar.gz)
    Source code(zip)
  • 1.2.5(Dec 6, 2016)

  • 1.2.4(Nov 29, 2016)

  • 1.2.3(Nov 29, 2016)

  • 1.2.2(Nov 21, 2016)

  • 1.2.1(Nov 21, 2016)

    • Fixed major bug that would happen if you used the list of Fragments version of the constructor.
    • Fixed a bug resulting in a null crash from a refactoring miss
    Source code(tar.gz)
    Source code(zip)
  • 1.2.0(Nov 21, 2016)

    Several Breaking Changes Several breaking changes in this version that were long overdue, but provide more modularity and structure moving forward. I know it's a little frustrating, but shouldn't take to long to update.

    • Changing constructors.
    • breaking apart the listeners into two separate classes (TransactionListener and RootFragmentListener)
    • several name changes that help for clarity.
    • transition mode being use in all transactions
    • savedInstanceState using either method.
    • a few bug fixes and stability improvements.
    Source code(tar.gz)
    Source code(zip)
  • 1.1.0(Nov 20, 2016)

    • Handle savedinstancestate in some cases (not done yet)
    • Added support for Dialogues
    • Added the functionality to dynamically create base fragments via the NavListener
    • Added a helper method to setTransition, it doesn’t need to be part of the constructor
    • added an initialize method. This is helper to use when first creating instead of switchTab. Specifically because if the activity was destroyed (due to memory) you still may have a fragment backstack.
    • properly handle executependingtransactions with a helper function
    • Added a replace method
    • Added helper canPop() method
    • sample app bottom bar now shows new dynamic fragment method
    • getBaseFragment method to simplify the process
    • updated build tools
    • updated support libraries
    • reorganized sample app
    Source code(tar.gz)
    Source code(zip)
Owner
Nic Capdevila
https://angel.co/nic-capdevila
Nic Capdevila
An Android library that allows you to easily create applications with slide-in menus. You may use it in your Android apps provided that you cite this project and include the license in your app. Thanks!

SlidingMenu (Play Store Demo) SlidingMenu is an Open Source Android library that allows developers to easily create applications with sliding menus li

Jeremy Feinstein 11.1k Dec 21, 2022
Android-NewPopupMenu 3.9 0.0 Java is an android library to create popup menu with GoogleMusic app-like style.

Android-NewPopupMenu Android-NewPopupMenu is an android library to create popup menu with GoogleMusic app-like style. Requirements Tested with APIv4 H

u1aryz 159 Nov 21, 2022
BottomSheet-Android - A simple customizable BottomSheet Library for Android Kotlin

BottomSheet-Android A simple customizable BottomSheet Library for Android Kotlin

Munachimso Ugorji 0 Jan 3, 2022
Android library that provides the floating action button to sheet transition from Google's Material Design.

MaterialSheetFab Library that implements the floating action button to sheet transition from Google's Material Design documentation. It can be used wi

Gordon Wong 1.6k Dec 13, 2022
Simple library which enable you to add a drawer(slide-out) navigation to your android application

SimpleSideDrawer is an android library to add a drawer navigation into your android application. This library has high affinity with other libraries l

null 217 Nov 25, 2022
Android Library for a DrawerLayout similar to the one in Google Apps

GoogleNavigationDrawerMenu This project aims to let you use a ListView menu similar to the one in the new Google Apps (Keep, Play Music...) without ha

Jorge Martin Espinosa 267 Nov 25, 2022
An Android Library that allows users to pull down a menu and select different actions. It can be implemented inside ScrollView, GridView, ListView.

AndroidPullMenu AndroidPullMenu is an Open Source Android library that allows developers to easily create applications with pull menu. The aim of this

Armando TBA 181 Nov 29, 2022
A floating menu library for Android.

Hover Hover is a floating menu implementation for Android. Goals The goals of Hover are to: Provide an easy-to-use, out-of-the-box floating menu imple

Google 2.7k Dec 27, 2022
Spotify like android material bottom navigation bar library.

SuperBottomBar About Spotify like android material bottom navigation bar library. GIF Design Credits All design and inspiration credits belongs to Spo

Ertugrul 73 Dec 10, 2022
Suhuf is an android library that is used to build bottom sheets in an elegant way.

Suhuf is an android library that is used to build bottom sheets in an elegant way.

Rahmat Rasyidi Hakim 10 Nov 15, 2021
Neat library, that provides a simple way to implement guillotine-styled animation

Guillotine animation Neat library, that provides a simple way to implement guillotine-styled animation Check this [project on Dribbble] (https://dribb

Yalantis 2.7k Jan 3, 2023
🚀 A very customizable library that allows you to present menu items (from menu resource and/or other sources) to users as a bottom sheet.

SlidingUpMenu A library that allows you to present menu items (from menu resource and/or other sources) to users as a bottom sheet. Gradle Dependency

Rasheed Sulayman 26 Jul 17, 2022
Space Navigation is a library allowing easily integrate fully customizable Google Spaces like navigation to your app.

Space-Navigation-View Introduction Space Navigation is a library allowing easily integrate fully customizable Google [Spaces][1] like navigation to yo

Arman 2k Dec 23, 2022
СontextMenu library based on BottomSheetDialog written in Kotlin.

KtxMenu Description СontextMenu library based on BottomSheetDialog written in Kotlin. Example ?? Installation Add the JitPack repository to your build

nprk 1 Apr 28, 2022
🎨A Jetpack Compose searchable drop down menu library

Searchable-Dropdown-Menu-Jetpack-Compose ?? A Jetpack Compose Android Library to create a dropdown menu that is searchable. How to include it into you

Breens Robert 30 Dec 26, 2022
an animated circular menu for Android

CircularFloatingActionMenu An animated, customizable circular floating menu for Android, inspired by Path app. Getting Started Requirements API >= 15

Oğuz Bilgener 2.7k Dec 24, 2022
A menu which can ... BOOM! - Android

BoomMenu 2.0.0 Comes Finally Approximately 8 months ago, I got an inspiration to creating something that can boom and show menu, which I named it Boom

Nightonke 5.8k Dec 27, 2022