簡體   English   中英

更改Android片段而無需創建新片段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM