2016-09-29 66 views
0

我有一个HomeFragmentLoginFragment在相同的Activity。起初它显示HomeFragment,然后去LoginFragment。但是当我回到HomeFragment它重新加载HomeFragmentAndroid移动到前一个片段没有重新加载

如何从LoginFragment按下HomeFragment不重新加载。

在此先感谢。这里是我的代码:

MainActivity.java

private void setEvent() { 
    img_action_back.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      closeKeyboard(getApplication(), img_action_back.getWindowToken()); 
      onBackPressed(); 
     } 
    }); 
} 

@Override 
public void onBackPressed() { 
    if (fragment instanceof LoginFragment) 
     { 
      LoginFragment loginFragment = (LoginFragment)fragment; 
      if(loginFragment.fromDrawer) 
       Navigator.showHomeFragment(mContext); 
      else 
       finish(); 
     } 
    } 
} 

Navigator.java

public static void showHomeFragment(Context context) { 
    final FragmentTransaction transaction = 
    getFragmentManager(context).beginTransaction(); 
    transaction.replace(CONTAINER_ID, new HomeFragment()); 
    transaction.commit(); 
} 

public static void showLoginFragment(Context context,Boolean fromDrawer,String infoRegister) { 
    final FragmentTransaction transaction = 
    getFragmentManager(context).beginTransaction(); 
    transaction.replace(CONTAINER_ID, 
    LoginFragment.newInstance(fromDrawer,infoRegister),"login"); 
    transaction.commit(); 
} 
+0

那么什么是与反正重装的问题? –

回答

3

你的问题是,当你按下回来,你要重新建立一个新的HomeFragment实例。你应该弹出FragmentManager后台堆栈。

@Override 
public void onBackPressed() { 
    if (fragment instanceof LoginFragment) { 
     LoginFragment loginFragment = (LoginFragment)fragment; 
     if(loginFragment.fromDrawer) { 
      getFragmentManager(mContext).popBackStack(); 
     } else { 
      finish(); 
     } 
    } 
} 

您还需要确保您添加LoginFragment到堆栈中。

public static void showLoginFragment(Context context,Boolean fromDrawer,String infoRegister) 
{ 
    final FragmentTransaction transaction = 
    getFragmentManager(context).beginTransaction(); 
    transaction.replace(CONTAINER_ID, 
    LoginFragment.newInstance(fromDrawer,infoRegister),"login"); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
} 
+0

谢谢,它解决了我的问题.. – santro

1

@SunnySydeUp有一个很好的答案。我在代码中找到了一些改进范围。

您需要在后备堆栈中添加Fragment,以便super.onBackPressed调用不会像其他答案所述再次重新创建Fragment

但是,如果您真的担心重新创建Fragment,您可能需要初始化它们一次并在事务处理期间再次使用该实例。

因此,在你的ActivityonCreate函数中,首先像这样初始化它们。

private HomeFragment mHomeFragment; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_layout); 

    mHomeFragment = new HomeFragment(); 
} 

现在你onBackPressed可能看起来像

@Override 
public void onBackPressed() { 
    if (fragment instanceof LoginFragment) { 
     if(loginFragment.fromDrawer) { 
      super.onBackPressed(); 
     } else { 
      finish(); 
     } 
    } 
} 

而且Navigator.java

public static void showHomeFragment(Context context) { 
    final FragmentTransaction transaction = 
    getFragmentManager(context).beginTransaction(); 
    transaction.replace(CONTAINER_ID, mHomeFragment); 
    transaction.commit(); 
} 

public static void showLoginFragment(Context context,Boolean fromDrawer,String infoRegister) { 
    final FragmentTransaction transaction = 
    getFragmentManager(context).beginTransaction(); 
    transaction.replace(CONTAINER_ID, 
    LoginFragment.newInstance(fromDrawer,infoRegister),"login"); 

    transaction.addToBackStack(null).commit(); 
} 
相关问题