我有两个片段,我想使用操作栏中的后退按钮在它们之间创建交互。理想情况下,我希望保存前一个片段的状态。我可以只找到活动的信息。
我找到了这个碎片
private fun setupBackButton() {
if (activity is AppCompatActivity) {
(activity as AppCompatActivity?)?.supportActionBar?.setDisplayHomeAsUpEnabled(true)
}
}
但它只显示后退按钮,点击没有任何React。
编辑
在第一个片段中我称第二个像为:
val fragment = UserContentFragment()
fragment.setUser(item.user)
if (fragmentManager != null) {
fragmentManager!!
.beginTransaction()
.replace(R.id.main_layout, fragment)
.addToBackStack(null)
.commit()
}
这是我的UserContentFragment
第二个片段:
class UserContentFragment : Fragment() {
private lateinit var user: SearchUser
fun setUser(user: SearchUser) {
this.user = user
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val root = inflater.inflate(R.layout.fragment_user_content, container, false)
val userImage = root.findViewById(R.id.user_img) as ImageView
if (context != null) {
Glide.with(context!!)
.load(user.profile_pic_url)
.circleCrop()
.into(userImage)
}
val userName: TextView = root.findViewById(R.id.user_name)
userName.text = user.full_name
val toolbar: Toolbar = root.findViewById(R.id.toolbar)
toolbar.setNavigationOnClickListener { requireActivity().onBackPressed() }
setupBackButton()
return root
}
private fun setupBackButton() {
if (activity is AppCompatActivity) {
(activity as AppCompatActivity?)?.supportActionBar?.setDisplayHomeAsUpEnabled(true)
}
}
}
下面是它的.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBlack">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/user_title"
android:layout_width="match_parent"
android:layout_height="100dp">
<ImageView
android:id="@+id/user_img"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginStart="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/user_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginEnd="16dp"
android:textColor="@color/colorWhite"
android:textSize="22sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/user_img"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</RelativeLayout>
7条答案
按热度按时间tcomlyy61#
为了在您点击Home/up按钮时获得响应,以下是解决此问题的几个选项:
第一个选项
在显示Home/UP按钮的片段中,重写
onOptionsItemSelected()
方法并调用Activity的onBackPressed()
作为home按钮id旁注:
不是使用下面的方法在
ActionBar
上显示Home/Up按钮,而是使用下面的方法为每个需要显示Home按钮的片段设置布尔值:您可以改为在练习的
onCreate()
方法中使用AppBarConfiguration
设置ActionBar
,如下所示:这样做,up按钮将显示在所有片段中,但
R.id.second_fragment, R.id.third_fragment
除外,您不再需要为每个片段设置setDisplayHomeAsUpEnabled()
来显示home/up按钮。但您仍然需要如上所述覆盖onOptionsItemSelected
。第二个选项
这比第一个选项更简洁。首先,你必须实现上面的边节点,以允许
NavController
自动控制/配置ActionBar
。因此,过去的附注是此选项的强制性部分。
然后覆盖活动中的
onSupportNavigateUp()
,使NavigationUI
支持正确的ActionBar
向上导航。然后在Activity中重写
onOptionsItemSelected()
,使“让导航UI处理OptionsMenu/ActionBar”项选择我会说选项2比选项1更简洁,因为你在一个地方(活动)编写所有代码,而不需要接触片段,而且它会自动配置所有片段,不需要手动
setDisplayHomeAsUpEnabled()
或activity.onBackPressed()
为您希望Home/Up按钮显示的单个片段。yqhsw0fo2#
在带导航的Kotlin碎片中
首先,在onCreate中添加
setHasOptionsMenu(true)
然后覆盖
onOptionsItemSelected
,当R.id.home
时,您可以控制返回按钮watbbzwu3#
您需要将单击侦听器附加到工具栏,如下所示:
xriantvc4#
luaexgnf5#
将此添加到NavigationClickListener中。
rggaifut6#
Zain's
Second Option
非常好,但我将以onCreate
的用法,为使用DataBinding
制作的部分展示一种不同的方法:8aqjt8rx7#
这是一个迟来的答案,但我希望它会帮助一些人。
我在Kotlin做的,我成功的方法是:
在
MainActivity
中,我覆盖了onSupportNavigateUp
:并声明了
onCreate()
之外的AppBarConfiguration