我有mainFrag
,它有2个标签(没有ViewPager
)和容器布局,其中显示了2个片段frag1
和frag2
。
该应用正在使用替换交易,mainFrag
也添加到了backstack
,mainFrag
使用childFragmentManager
来替换片段。
问题frag1
和frag2
不使用backstack
并在每次调用onCreate
时重新创建并从REST请求加载数据的问题
在这种情况下(使用单个Activity
),如何可能在没有开销的情况下解决该问题?也许是一些好的做法?
答案 0 :(得分:2)
否,您无法在replace
之后恢复片段状态。
来自Official documentation:
FragmentTransaction replace (int containerViewId, Fragment fragment, String tag)
替换添加到容器中的现有片段。这与调用
remove(Fragment)
来调用所有当前添加的,使用相同containerViewId然后使用此处给出的相同参数的add(int, Fragment, String)
片段相同。
如果要保留片段状态,可以尝试hide(Fragment)
,show(Fragment)
。
编辑
如果您想通过onBackPressed()
浏览它们,则应创建自己的后堆栈数组
例如:
第一个片段:
class Fragment1 : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment1_view, container, false)
}
companion object {
fun newInstance() = Fragment1()
}
}
第二个片段:
class Fragment2 : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment2_view, container, false)
}
companion object {
fun newInstance() = Fragment2()
}
}
活动:
class MainActivity : AppCompatActivity() {
private val backStack = mutableListOf<String>()
private val fragment1:Fragment1 = Fragment1.newInstance()
private val fragment2:Fragment2 = Fragment2.newInstance()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
supportFragmentManager.beginTransaction()
.add(R.id.container, fragment1, "Fragment1")
.add(R.id.container, fragment2, "Fragment2")
.commit()
backStack.add("Fragment1")
backStack.add("Fragment2")
}
fun showFragment1() {
if (backStack.last() == "Fragment1") return
supportFragmentManager.beginTransaction()
.hide(fragment2)
.show(fragment1)
.commit()
backStack.add("Fragment1")
}
fun showFragment2() {
if (backStack.last() == "Fragment2") return
supportFragmentManager.beginTransaction()
.hide(fragment1)
.show(fragment2)
.commit()
backStack.add("Fragment1")
}
override fun onBackPressed() {
if (backStack.size < 2) super.onBackPressed()
val last = backStack.removeAt(backStack.size - 1)
if (last == "Fragment1") {
supportFragmentManager.beginTransaction()
.hide(fragment1)
.show(fragment2)
.commit()
} else {
supportFragmentManager.beginTransaction()
.hide(fragment2)
.show(fragment1)
.commit()
}
}
}
More关于hide()
More关于show()
答案 1 :(得分:2)
根据the Fragments documentation,您应该使用addToBackStack()
和replace()
操作将片段B添加到后堆栈中。
// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
执行此操作时,FragmentManager会为您处理onBackPressed()
,反转replace()
操作并还原先前的Fragment,还原其保存的实例状态,视图状态等。