[英]Change Android Fragment without creating new one
我使用以下(並且可以正常工作)代碼切換片段:
Fragment fragment = new DashboardFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.main_fragment, fragment);
fragmentTransaction.commit();
但是總是在我調用此代碼時(通常是因為它在導航欄中),因此會調用onCreateView
函數。
我可以想象這是因為new DashboardFragment();
,但我不知道可以更改什么。
是否可以只創建一次片段,然后再次訪問它?
謝謝!
你可以找到一個以前添加的Fragment
通過使用FragmentManager
當你第一次添加您的Fragment
給它一個標簽,所以你可以在以后檢索。 這樣做是這樣的:
fragmentTransaction.replace(R.id.main_fragment, fragment, "my_fragment_tag");
然后,只要您想獲取fragment
就使用以下代碼:
FragmentManager fragmentManager = getSupportFragmentManager();
DashboardFragment dashboard = fragmentManager.findFragmentByTag("my_fragment_tag");
if(dashboard) {
//Do whatever you want with the fragment
} else {
dashboard = new DashboardFragment();
}
不管您如何嘗試,在替換您的Fragment
后總是會調用onCreateView
方法,該方法是自動調用的,因為它是生命周期中Fragment的一部分
也就是說,您可以保存Fragment
變量值,以保存靜態實例並通過靜態初始化方法調用它:
private static SameInstanceFragment sameInstanceFragment;
public static SameInstanceFragment getInstance() {
sameInstanceFragment = sameInstanceFragment == null ? new SameInstanceFragment() : sameInstanceFragment;
return sameInstanceFragment;
}
在下一個示例中,您將看到每次實例化的Fragment
如何都無法保存其值,而保存為唯一實例的Fragment
可以做到這一點:
// SameInstanceFragment
public class SameInstanceFragment extends Fragment {
private static SameInstanceFragment sameInstanceFragment;
private int mCounter;
public static SameInstanceFragment getInstance() {
sameInstanceFragment = sameInstanceFragment == null ? new SameInstanceFragment() : sameInstanceFragment;
return sameInstanceFragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mCounter++;
return inflater.inflate(R.layout.test_fragment, null);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
String feedback = " Member counter: " + mCounter;
Toast.makeText(getActivity(), feedback, Toast.LENGTH_SHORT).show();
//member variables preserve its value after replace
}
}
// NewInstanceFragment
public class NewInstanceFragment extends Fragment {
private int mCounter;
public static NewInstanceFragment getInstance() {
return new NewInstanceFragment();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mCounter++;
return inflater.inflate(R.layout.test_fragment, null);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
String feedback = " Member counter: " + mCounter;
Toast.makeText(getActivity(), feedback, Toast.LENGTH_SHORT).show();
//member variables don’t preserve its value after replace
}
}
// TestFragmentActivity
public class TestFragmentActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.test_fragments_activity);
switchFragment();
setListener();
}
private void setListener() {
findViewById(R.id.tb_switch_fragment).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
switchFragment();
}
});
}
private void switchFragment() {
Fragment fragmentDisplayed = getCurrentFragmentDisplayed();
Fragment fragmentToSwitch = null;
if (fragmentDisplayed == null)
fragmentToSwitch = SameInstanceFragment.getInstance();
else if(fragmentDisplayed instanceof SameInstanceFragment)
fragmentToSwitch = NewInstanceFragment.getInstance();
else
fragmentToSwitch = SameInstanceFragment.getInstance();
setFragment(fragmentToSwitch);
}
private void setFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fl_container, fragment);
fragmentTransaction.commit();
}
public Fragment getCurrentFragmentDisplayed(){
List<Fragment> fragments = getSupportFragmentManager().getFragments();
if(fragments == null) return null;
for (Fragment fragment : fragments) {
if(fragment.isVisible()) return fragment;
}
return null;
}
}
當然,創建一個成員變量和一個檢索它的方法,如下所示:
private DashboardFragment fragment;
private DashboardFragment getFragment() {
if (fragment == null)
fragment = new DashboardFragment();
return fragment;
}
然后,當您要訪問片段時,不要使用new DashboardFragment()
,而要使用getFragment()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.