私はBottomNavigationView
で簡単な活動をしています。私は、異なるページのアクティビティの内容を実装するためにフラグメントを使用しています。FragmentManagerから重複したエントリを削除するには?
ユーザーが戻るボタンを押すと、以前に参照したページに戻ることになっています。問題は、ページ(断片)の間を繰り返し行き来すると、この全体の履歴が記録されることです。 - > B - > A - > B - > C - > A - > C
逆につながる戻るボタンを押すと、代わりに私はこの振る舞いをしたいが、(私が気づい
A:この例を見てみましょうそれInstagramのアプリで):
C - > A - > B - > [終了]のApp
だから、すべてのフラグメントが唯一backstackに一つのエントリを持っている必要があります。これはどうすればいいですか?スタックからフラグメントの以前のトランザクションを削除しますか?
これはFragmentManagerを使用してすべて可能ですか?あるいは私は自分自身を実装する必要がありますか?
BottomNavigationViewとMy活動
:この時点でclass ActivityOverview : AppCompatActivity() {
// Listener for BottomNavigationView
private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
when (item.itemId) {
R.id.navigation_home -> {
// "Home" menu item pressed
setActiveFragment(resources.getString(R.string.tag_fragment_home))
[email protected] true
}
R.id.navigation_dashboard -> {
// "Dashboard" menu item pressed
[email protected] true
}
R.id.navigation_settings -> {
// "Settings" menu item pressed
setActiveFragment(resources.getString(R.string.tag_fragment_settings))
[email protected] true
}
}
false
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_overview)
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
navigation.menu.findItem(R.id.navigation_home).setChecked(true)
// Set initial fragment
setActiveFragment(resources.getString(R.string.tag_fragment_home))
}
override fun onBackPressed() {
// > 1 so initial fragment addition isn't removed from stack
if (fragmentManager.backStackEntryCount > 1) {
fragmentManager.popBackStack()
} else {
finish()
}
}
// Update displayed fragment
fun setActiveFragment(tag: String) {
val fragment = if (fragmentManager.findFragmentByTag(tag) != null) {
// Fragment is already initialized
if (fragmentManager.findFragmentByTag(tag).isVisible) {
// Fragment is visible already, don't add another transaction
null
} else {
// Fragment is not visible, add transaction
fragmentManager.findFragmentByTag(tag)
}
} else {
// Fragment is not initialized yet
when (tag) {
resources.getString(R.string.tag_fragment_home) -> FragmentHome()
resources.getString(R.string.tag_fragment_settings) -> FragmentSettings()
else -> null
}
}
if (fragment != null) {
val transaction = fragmentManager.beginTransaction()
transaction.replace(R.id.container_fragment, fragment, tag)
transaction.addToBackStack(null)
transaction.commit()
}
}
}
腸反応がある:あなたが追加するたびにフラグメントマネージャーでそれを探し、それがあればそれを削除します( 'FragmentTransaction.remove()')。そうすれば、あなたのフラグメントマネージャーには、指定されたフラグメントのインスタンスが1つだけ存在し、最新のものが一番上にあります。 –
@BenP。しかし、フラグメントだけでなく、実際のトランザクションをどのように取得するのですか? –