Java 如何在片段中设置返回操作的限制

Java 如何在片段中设置返回操作的限制,java,android,user-interface,android-fragments,kotlin,Java,Android,User Interface,Android Fragments,Kotlin,我有3个不同的片段。这是一个奇怪的问题,但我想将事务限制为一些片段。例如:如果我在第三个片段中单击后退,我将返回第一个片段。如果我在第一个中单击back,它将返回到MainActivity。但这三个片段都是从另一个名为SearchActivity的活动中显示出来的。这样做有两个问题。 第一:我的状态栏看起来有点。。。请注意: 我的第二个问题:当我在片段中返回时(从MainActivity开始,使用带有currentItem(0)的底部导航栏启动SearchActivity),然后我按下后退按钮

我有3个不同的片段。这是一个奇怪的问题,但我想将事务限制为一些片段。例如:如果我在第三个片段中单击后退,我将返回第一个片段。如果我在第一个中单击back,它将返回到MainActivity。但这三个片段都是从另一个名为SearchActivity的活动中显示出来的。这样做有两个问题。 第一:我的状态栏看起来有点。。。请注意:

我的第二个问题:当我在片段中返回时(从MainActivity开始,使用带有currentItem(0)的底部导航栏启动SearchActivity),然后我按下后退按钮,我想它将进入SearchActivity,但我需要返回MainActivity。要返回MainActivity,我需要按下后退两次,因为第一次按下时它将进入SearchActivity)这种情况发生:

我的活动:

lateinit var toolbar: ActionBar

private fun openFragment(fragment: Fragment) {
    val transaction = supportFragmentManager.beginTransaction()
    transaction.replace(R.id.container, fragment)
    transaction.addToBackStack(null)
    transaction.commit()
}

private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
    when (item.itemId) {
        R.id.navigation_1 -> {
            toolbar.title = resources.getString(R.string.title_1)
            val firstFragment = FirstView.newInstance()
            openFragment(firstFragment)
            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_2-> {
            toolbar.title = resources.getString(R.string.title_2)
            val secFragment = SecView.newInstance()
            openFragment(secFragment)
            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_3 -> {
            toolbar.title = resources.getString(R.string.title_3)
            val thirdFragment = ThirdView.newInstance()
            openFragment(thirdFragment)
            return@OnNavigationItemSelectedListener true
        }
    }
    false
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_search)

    toolbar = supportActionBar!!

    val bottomNavigation: BottomNavigationView = findViewById(R.id.navigation)
    bottomNavigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
    bottomNavigation.selectedItemId = R.id.navigation_1
}
还有活动xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="s.com.s.SearchActivity">

<!--<FrameLayout-->
    <!--android:layout_width="wrap_content"-->
    <!--android:layout_height="wrap_content"/>-->

<android.support.design.widget.BottomNavigationView
    android:id="@+id/navigation"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="0dp"
    android:layout_marginStart="0dp"
    android:background="@android:color/white"
    app:itemBackground="@android:color/white"
    app:itemIconTint="@drawable/tab_state"
    app:itemTextColor="@drawable/tab_state"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:menu="@menu/navigation" />

片段示例:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view = inflater.inflate(R.layout.fragment_first, container, false)

    val rv = view.findViewById<RecyclerView>(R.id.firstView)
    rv.layoutManager = LinearLayoutManager(context, LinearLayout.VERTICAL, false)
    val firsts = ArrayList<Hotel>()
    firsts.add(Hotel("Paul", "Mr", R.drawable.abc_list_longpressed_holo))
    firsts.add(Hotel("Jane", "Miss", R.drawable.abc_ratingbar_material))
    firsts.add(Hotel("John", "Dr", R.drawable.abc_btn_check_to_on_mtrl_000))
    firsts.add(Hotel("Amy", "Mrs", R.drawable.abc_ic_menu_paste_mtrl_am_alpha))

    var adapter = CustomAdapter(firsts)
    rv.adapter = adapter

    return view
}

companion object {
    fun newInstance(): FirstView = FirstView()
}
override fun onCreateView(充气机:布局充气机,容器:ViewGroup?,savedInstanceState:Bundle?):视图?{
val视图=充气机。充气(R.layout.fragment_first,container,false)
val rv=view.findviewbyd(R.id.firstView)
rv.layoutManager=LinearLayoutManager(上下文,LinearLayout.VERTICAL,false)
val firsts=ArrayList()
第一。添加(酒店(“保罗”,“先生”,R.drawable.abc\u列表\u Long\u holo))
第一。添加(酒店(“简”,“小姐”,R.drawable.abc\u ratingbar\u material))
第一。添加(酒店(“John”、“Dr”、R.drawable.abc\u btn\u check\u to\u on\u mtrl\u 000))
第一。添加(酒店(“艾米”,“夫人”,R.drawable.abc\U ic\U菜单\U粘贴\U mtrl\U am\U alpha))
var适配器=自定义适配器(第一个)
rv.适配器=适配器
返回视图
}
伴星{
fun newInstance():FirstView=FirstView()
}
和xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorAccent"
android:orientation="vertical">

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="?attr/actionBarSize"
    android:id="@+id/firstView"/>


很高兴能得到帮助,我一个星期都解决不了。我希望我已经解释好了所有的事情,因为我甚至不知道如何解释它。

我有一个可能的解决方案:

您应该需要实现

onBackPressed() 
(自API级别5起受支持)

然后编写如下代码:

  Intent i=new Intent(this, MainActivity.class);
  i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  startActivity(i);
这将清除所有活动数据并返回到主屏幕。
希望它能帮助您。

您需要跟踪当前片段并覆盖onBackPressed。然后,您将在活动的onBackPressed中添加一些逻辑,以根据您所在的片段确定要执行的操作。您有任何示例吗?我只是不明白如何使用片段(只听说过活动),所以。。。希望你能帮上忙…我稍后再试试,谢谢。但是,对不起,我在这方面不太聪明。当我需要将片段切换到另一个片段时(例如从fr3切换到fr1,而不是其他地方),如何解决这个问题?如果你知道如何解决第一个问题,我很高兴为你效劳。不管怎样,我会记住的别担心,首先。。1.你想要一个状态栏吗?(我不知道你是否想要,但你可以删除它)2。“我想将事务限制为某些片段。例如:如果我在第三个片段中单击“后退”,我将返回到第一个片段。如果我在第一个片段中单击“后退”,它将返回到MainActivity。”如果要跳过“搜索活动”并直接转到main,则需要使用函数“onBackPressed”并指定它“当你按下u mobile的“后退”按钮时,你将清除碎片并开始主要活动。我知道这是你想要的。更多问题,请回答:)非常感谢你提供了这样一个信息丰富的答案。这对我很有帮助。我甚至没想到这是否很容易解决。