简体   繁体   English

如何在点击返回按钮时从一个片段中调用另一个片段?

[英]How to call another fragment from one fragment on hitting back button?

I have a MainActivity in my application, from where all the fragments are called using Navigation Drawer. 我的应用程序中有一个MainActivity ,从中可以使用Navigation Drawer调用所有片段。 And default fragment of the activity is 'A'. 活动的默认片段为“ A”。 So everytime i open the application, 'A' fragment is called. 因此,每次我打开应用程序时,都会调用“ A”片段。 when I hit 'back' from another fragment B, I want to get to default fragment 'A', as what happens in gmail - from any fragment if we hit back, it returns to default fragment "Primary mails". 当我从另一个片段B击中“返回”时,我想转到默认片段“ A”,就像gmail中发生的一样-如果我们击中任何片段,它将返回默认片段“主邮件”。

I tried calling the 'A' fragment by adding the following code to the onPause() of fragment 'B'. 我尝试通过将以下代码添加到片段“ B”的onPause()中来调用“ A”片段。

@Override
public void onPause() {
    super.onPause();

    fragment = new A();
    FragmentTransaction fragTransaction = getFragmentManager().beginTransaction();
                        fragTransaction.replace(R.id.a,fragment ).commit();

}

But when I hit back, fragment 'A' is called for a moment, but then the application closes unexpectedly. 但是,当我回击时,片段'A'被调用了片刻,但随后应用程序意外关闭。

Logcat : Logcat:

01-14 12:44:42.264: E/WindowManager(4655): android.view.WindowLeaked: Activity com.litchi.iguardian.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{41da6348 VE.... R.....ID 0,0-513,243} that was originally added here 01-14 12:44:42.264:E / WindowManager(4655):android.view.WindowLeaked:活动com.litchi.iguardian.MainActivity已泄漏窗口com.android.internal.policy.impl.PhoneWindow $ DecorView {41da6348 VE。 ... R ..... ID 0,0-513,243}最初是在此处添加的

Whats the correct way of doing this ? 正确的做法是什么?

You should customize the behavior when you press the back button, because by default it will destroy launched activity and you see your fragment while callbacks goes from onPause() until onStop() and activity is not visible for you anymore. 当您按下后退按钮时,您应该自定义行为,因为默认情况下,它将破坏启动的活动,并且您会在回调从onPause()onStop()同时看到您的片段,并且活动不再对您可见。 Just override this method, it must solve the problem: 只需重写此方法,就必须解决问题:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        // your code
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

But yeah, it is for global control, for switching fragments you may also call addToBackStack(); 但是,是的,它用于全局控制,用于切换片段,您也可以调用addToBackStack(); when you want return previous fragment by pressing back button. 当您想通过按返回按钮返回上一个片段时。

to back to previous fragment see below code : 返回上一个片段,请参见以下代码:

fragmentManager.popBackStack(...);

put this in onBack event 将此放在onBack事件中

to call popBackStack method you first need to call addToBackStack method while calling fragment 调用popBackStack方法,首先需要在调用片段时调用addToBackStack方法

Use this code 使用此代码

android.support.v4.app.Fragment detail = new CurrentClass();
detail.setArguments(bundle);
android.support.v4.app.FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.add(R.id.content_frame, detail).addToBackStack("back")
.commit();

无需在onPause()中编写该代码,您可以在您的主要活动的onBackPressed()中编写该代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM