2016-09-29 68 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(); 
} 
相關問題