2017-07-21 37 views
0

私は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() 
     } 
    } 
} 
+0

腸反応がある:あなたが追加するたびにフラグメントマネージャーでそれを探し、それがあればそれを削除します( 'FragmentTransaction.remove()')。そうすれば、あなたのフラグメントマネージャーには、指定されたフラグメントのインスタンスが1つだけ存在し、最新のものが一番上にあります。 –

+0

@BenP。しかし、フラグメントだけでなく、実際のトランザクションをどのように取得するのですか? –

答えて

0

私はそれがFragmentManagerでは動作しないかなり確信しているので、私は重複を許可していませんスタックを実装するクラスを作成しました:

class NoDuplicateStack<T> { 

    val stack: MutableList<T> = mutableListOf() 
    val size: Int 
     get() = stack.size 

    // Push element onto the stack 
    fun push(p: T) { 
     val index = stack.indexOf(p) 
     if (index != -1) { 
      stack.removeAt(index) 
     } 
     stack.add(p) 
    } 

    // Pop upper element of stack 
    fun pop(): T? { 
     if (size > 0) { 
      return stack.removeAt(stack.size - 1) 
     } else { 
      return null 
     } 
    } 

    // Look at upper element of stack, don't pop it 
    fun peek(): T? { 
     if (size > 0) { 
      return stack[stack.size - 1] 
     } else { 
      return null 
     } 
    } 

} 

私はその後、私の活動の中に、このクラスを統合:

class ActivityOverview : AppCompatActivity() { 

    val fragmentsStack = NoDuplicateStack<String>() 
    val fragmentHome = FragmentHome() 
    val fragmentSettings = FragmentSettings() 
    val fragmentHistory = FragmentHistory() 

    // Listener for BottomNavigationView 
    private val mOnNavigationItemSelectedListener = ... 

    override fun onCreate(savedInstanceState: Bundle?) { 
     ... 
    } 

    override fun onBackPressed() { 
     if (fragmentsStack.size > 1) { 
      // Remove current fragment from stack 
      fragmentsStack.pop() 
      // Get previous fragment from stack and set it again 
      val newTag = fragmentsStack.pop() 
      if (newTag != null) { 
       setActiveFragment(newTag) 
      } 
     } else { 
      finish() 
     } 
    } 

    // Update displayed fragment 
    fun setActiveFragment(tag: String) { 
     val fragment = when (tag) { 
      resources.getString(R.string.tag_fragment_home) -> fragmentHome 
      resources.getString(R.string.tag_fragment_settings) -> fragmentSettings 
      resources.getString(R.string.tag_fragment_history) -> fragmentHistory 
      else -> null 
     } 

     if (fragment != null && !fragment.isVisible) { 
      fragmentManager.beginTransaction() 
        .replace(R.id.container_fragment, fragment, tag) 
        .commit() 
      fragmentsStack.push(tag) 
     } 
    } 
} 
関連する問題