Skate is a fragment manager controller that allows you to easily navigate from one fragment to another. Simple and seamless. Just like it should be.
FragmentManager
has an unfriendly behavior to work with so Skate uses its own stack and backstack to manage fragments. The stack is pushed or popped only when a fragment is added or removed. Otherwise, any modifications are applied accordingly. In my opinion, this should be the intended behavior.
- No reflection
- Add/attach/show | Remove/detach/hide fragments
- Commit with state save
- Save and restore flow
- Listen to visibility changes
- Lifecycle aware
- Extremely lightweight and fast
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.inshiro:skate:0.2.1'
}
class MainActivity : AppCompatActivity() {
private lateinit var skate: Skate
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ...
skate = startSkating(savedInstanceState)
skate.fragmentManager = supportFragmentManager
skate.container = R.id.main_container
fragment.mode = Skate.SINGLETON // optional
}
override fun onBackPressed() {
if (!skate.back)
super.onBackPressed()
}
}
// Showing
fragment.show()
// Hiding
fragment.hide()
// Navigating
skate to fragment
Skate has 3 modes it operates on. The default is FACTORY
.
// add-remove
Skate.FACTORY = 0
// attach-detach
Skate.SPARING = 1
// show-hide
Skate.SINGLETON = 2
The mode is obtained from Fragment.mode
This determines the fragment's behavior on show or hide.
If you show, Skate will hide. Add, remove. etc...
fragment.mode = Skate.SINGLETON
mainFragment.mode = Skate.SPARING
At any given time you can set the global settings before showing or hiding a fragment.
skate.fragmentManager = supportFragmentManager
skate.container = R.id.main_container // id of your view
// Animations
skate.animationStart = android.R.animator.fade_in
skate.animationEnd = android.R.animator.fade_out
By default, fragments are added to the back stack. When going back, if there is currently a visible fragment, it gets hidden.
To listen to visibility changes, add an implementation of Skate.OnNavigateListener
to setOnNavigateListener
.
skate.setOnNavigateListener(object : Skate.OnNavigateListener {
override fun onHide() { }
override fun onShow() { }
override fun onBackPressed(current: Fragment?) { }
})
Sometimes you have lots of fragments you want to work with.
skate.operate {
hide(BillingFragment)
hide(PaymentFragment)
hide(DetailFragment1)
show(MainFragment)
}
Skate provides a bit of information about fragment visibility during runtime which might help in debugging visibility-related issues. To enable logging, pass an implementation of Skate.Logger
to the Skate.logger
property or use the default SkateLogger
.
Skate.logger = SkateLogger
If your application requires a call to any of Skate's methods in an Activity lifecycle method other than onCreate()
, do it in either FragmentActivity#onResumeFragments()
or Activity#onPostResume()
. These two methods are guaranteed to be called after the Activity has been restored to its original state, and therefore avoid the possibility of state loss all together.
See this blog for more detail.
Copyright 2019 inshiro
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.