2017-08-14 123 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方法,不进行重置他们的状态。

希望它有帮助!