【发布时间】:2022-01-13 09:16:29
【问题描述】:
您好,我在片段之间的导航方面遇到了一些问题
好的,我详细解释一下
我有一个带有 4 个片段 Home、Following、Notification 和 Profile 的底部导航,backstack 上的底部导航没有问题,但现在例如从配置文件片段我跳转到一个名为 edit_profile 的片段,它不是一部分底部导航,当按下返回时,我希望它应该返回到配置文件片段,但后台堆栈正在将我从 edit_profile 直接带到主页片段
这是link的录音
我最近将我的项目从 java 更改为 kotlin,我是 kotlin 的初学者
我真的很喜欢 Pinterest 和 Instagram 的导航
注意:- 所有这些代码都会自动更改为 kotlin(带有一些 手动完成更改),此问题也与 java 相关,而不是在迁移到 kotlin 之后,另外,如果您想要更多参考代码 请告诉我我会更新问题
代码
MainActivity.kt // 底部导航
class MainActivity : AppCompatActivity() {
var bottomNavigationView: BottomNavigationView? = null
var integerDeque: Deque<Int> = ArrayDeque(3)
var flag = true
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
setContentView(R.layout.activity_main)
val window = this.window
window.statusBarColor = this.resources.getColor(R.color.black)
bottomNavigationView = findViewById(R.id.bottom_navigation_view)
integerDeque.push(R.id.nav_home)
loadFragments(Home_Fragment())
bottomNavigationView!!.selectedItemId = R.id.nav_home
bottomNavigationView!!.setOnNavigationItemSelectedListener(
BottomNavigationView.OnNavigationItemSelectedListener { item: MenuItem ->
val id = item.itemId
if (integerDeque.contains(id)) {
if (id == R.id.nav_home) {
integerDeque.size
if (flag) {
integerDeque.addFirst(R.id.nav_home)
flag = false
}
}
integerDeque.remove(id)
}
integerDeque.push(id)
loadFragments(getFragment(item.itemId))
false
}
)
}
@SuppressLint("NonConstantResourceId")
private fun getFragment(itemId: Int): Fragment {
when (itemId) {
R.id.nav_home -> {
bottomNavigationView!!.menu.getItem(0).isChecked = true
return Home_Fragment()
}
R.id.nav_following -> {
bottomNavigationView!!.menu.getItem(1).isChecked = true
return Following_Fragment()
}
R.id.nav_notification -> {
bottomNavigationView!!.menu.getItem(2).isChecked = true
return Notification_Fragment()
}
R.id.nav_profile -> {
bottomNavigationView!!.menu.getItem(3).isChecked = true
return Profile_Fragment()
}
}
bottomNavigationView!!.menu.getItem(0).isChecked = true
return Home_Fragment()
}
private fun loadFragments(fragment: Fragment?) {
if (fragment != null) {
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment, fragment.javaClass.simpleName)
.commit()
}
}
override fun onBackPressed() {
integerDeque.pop()
if (!integerDeque.isEmpty()) {
loadFragments(getFragment(integerDeque.peek()))
} else {
finish()
}
}
Edit_Profile.kt // 从这个片段我想回到最后一个片段,它应该是配置文件片段
class Edit_Profile : Fragment() {
private var profilePhoto: CircleImageView? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_edit_profile, container, false)
profilePhoto = view.findViewById(R.id.circleImageView)
initImageLoader()
setProfileImage()
val imageView = view.findViewById<ImageView>(R.id.backArrow)
imageView.setOnClickListener {
val newCase: Fragment = Profile_Fragment()
assert(fragmentManager != null)
val transaction = requireFragmentManager().beginTransaction()
transaction.replace(R.id.fragment_container, newCase)
transaction.addToBackStack(Profile_Fragment.toString())
transaction.commit()
}
return view
}
编辑
将部分交易从 Profile Fragment 添加到 Edit Profile
ProfileFragment.kt
editProfileButton!!.setOnClickListener(View.OnClickListener { v: View? ->
val edit_profile: Fragment = Edit_Profile()
requireActivity().getSupportFragmentManager()
.beginTransaction()
.add(R.id.fragment_container, edit_profile,"TAG")
.addToBackStack("TAG")
.commit()
})
【问题讨论】:
-
我的猜测是替换可能是问题,因为这意味着清除所有片段然后添加新片段,而是尝试添加片段而不是替换。
-
嘿,我是 kotlin 新手,你能告诉我有没有一种简单的方法来管理后台导航(我真的很喜欢 Pinterest 和 Instagram 的导航)
-
你是如何对
Edit_Profile片段进行交易的? -
@Zain 我已在编辑部分添加代码,请查看我是如何完成交易的
标签: android kotlin android-fragments navigation fragment-backstack