2017-08-14 74 views
0

當在我MainActivity類保持片段的狀態,我有一個BottomNavigationView 3個選項卡,活動(主頁,搜索和個人)之間進行切換。每當我點擊任何選項卡,它拉的各分段,但我相信,我每一次調用一個新片段。如何切換片段

我需要這些碎片保持任何變化在他們提出(類似於Instagram的如何做)。每個片段是目前非常基本的(新建和不變),但我想設置它們在當我回去給他們自己的狀態,當我切換到另一個片段保存和恢復的方法。

下面是我的主要活動和家庭片段代碼。

public class MainActivity extends AppCompatActivity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    BottomNavigationView navigationView = (BottomNavigationView) findViewById(R.id.bottomNavigationView); 
    navigationView.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction transaction = fragmentManager.beginTransaction(); 
    transaction.replace(R.id.content, new HomeFragment()).commit(); 
} 

private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = 
     new BottomNavigationView.OnNavigationItemSelectedListener(){ 
      @Override 
      public boolean onNavigationItemSelected(@NonNull MenuItem item){ 
       FragmentManager fragmentManager = getSupportFragmentManager(); 
       FragmentTransaction transaction = fragmentManager.beginTransaction(); 
       switch (item.getItemId()){ 
        case R.id.HomeItem: 
         transaction.replace(R.id.content, new HomeFragment()).commit(); 
         return true; 
        case R.id.SearchItem: 
         transaction.replace(R.id.content, new SearchFragment()).commit(); 
         return true; 
        case R.id.PersonalItem: 
         transaction.replace(R.id.content, new PersonalFragment()).commit(); 
         return true; 
       } 
       return false; 
      } 
     }; 
} 


public class HomeFragment extends Fragment { 
// TODO: Rename parameter arguments, choose names that match 
private static final String ARG_PARAM1 = "param1"; 
private static final String ARG_PARAM2 = "param2"; 

// TODO: Rename and change types of parameters 
private String mParam1; 
private String mParam2; 

private OnFragmentInteractionListener mListener; 

public HomeFragment() { 
    // Required empty public constructor 
} 

// TODO: Rename and change types and number of parameters 
public static HomeFragment newInstance(String param1, String param2) { 
    HomeFragment fragment = new HomeFragment(); 
    Bundle args = new Bundle(); 
    args.putString(ARG_PARAM1, param1); 
    args.putString(ARG_PARAM2, param2); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (getArguments() != null) { 
     mParam1 = getArguments().getString(ARG_PARAM1); 
     mParam2 = getArguments().getString(ARG_PARAM2); 
    } 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragment_home, container, false); 
} 

// TODO: Rename method, update argument and hook method into UI event 
public void onButtonPressed(Uri uri) { 
    if (mListener != null) { 
     mListener.onFragmentInteraction(uri); 
    } 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    if (context instanceof OnFragmentInteractionListener) { 
     mListener = (OnFragmentInteractionListener) context; 
    } else { 
     Toast.makeText(context, "Home Fragment Attached", Toast.LENGTH_SHORT).show(); 
    } 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
    mListener = null; 
} 

public interface OnFragmentInteractionListener { 
    // TODO: Update argument type and name 
    void onFragmentInteraction(Uri uri); 
} 
} 

回答

0

您必須使用transaction.hide(片段)和transaction.show(片段),而不是transaction.replace,因爲更換將刪除片段,然後重新添加,刪除其保存的狀態。 做我的方式將調用片段的onPause和onReaume方法,不進行重置他們的狀態。

希望它有幫助!