2013-05-19 172 views
0

我製作了一個帶有兩個選項卡的ActionBar - 一個用於片段和bfragment。片段包含一個按鈕。單擊片段上的按鈕將導致它更改爲cfragment。但是,再次單擊該選項卡會導致再次加載碎片。我能做些什麼來防止這種情況,主要是在標籤上說:「當有人點擊你時,加載最後一個片段狀態(在本例中爲cfragment)?」在Tab中保存片段狀態

這是我MainActivity.java:

public class MainActivity extends Activity { 

public static Context appContext; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    appContext = getApplicationContext(); 

    //ActionBar 
    ActionBar actionbar = getActionBar(); 
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    ActionBar.Tab PlayerTab = actionbar.newTab().setText("Fragment A"); 
    ActionBar.Tab StationsTab = actionbar.newTab().setText("Fragment B"); 

    Fragment PlayerFragment = new AFragment(); 
    Fragment StationsFragment = new BFragment(); 

    PlayerTab.setTabListener(new MyTabsListener(PlayerFragment)); 
    StationsTab.setTabListener(new MyTabsListener(StationsFragment)); 

    actionbar.addTab(PlayerTab); 
    actionbar.addTab(StationsTab); 
} 

我TabListener:

class MyTabsListener implements ActionBar.TabListener { 
public Fragment fragment; 

public MyTabsListener(Fragment fragment) { 
    this.fragment = fragment; 
} 

@Override 
public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    Toast.makeText(MainActivity.appContext, "Reselected!", Toast.LENGTH_LONG).show(); 
} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    ft.replace(R.id.fragment_container, fragment); 
} 

@Override 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    ft.remove(fragment); 
} 
} 

最後,我AFragment.java:

public class AFragment extends Fragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.afragment, container, false); 
    Button mButton = (Button) view.findViewById(R.id.button1); 
    mButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      FragmentManager fragmentManager = getFragmentManager(); 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      CFragment fragment = new CFragment(); 
      fragmentTransaction.replace(R.id.fragment_container, fragment); 
      fragmentTransaction.commit(); 
     } 
    }); 
    return view; 
} 
} 

如何保存cfragment進入選項卡以這種方式單擊第一個選項卡不會導致再次加載片段?謝謝。

回答

1

狀態不會被保存,因爲每次更改選項卡時都會添加新的片段。

在「onTabUnselected`,不要刪除,但分離/隱藏

public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    if (fragment != null) { 
    ft.detach(fragment); 
    } 
} 

而且在onTabSelected,檢查,看看是否已經片段存在,而不是更換

public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    fragment = mActivity.getSupportFragmentManager().findFragmentByTag(tag); 
    if(fragment == null) { 
    fragment = Fragment.instantiate(mActivity, mClass.getName()); 
    ft.add(R.id.fragment_container, fragment, tag); 
    } else { 
    ft.attach(fragment); 
    } 
} 
+0

了'onTabSelected'的給我一個錯誤。你能澄清一下嗎? – Si8

+0

你遇到什麼錯誤?你確定片段是一個實例變量嗎? – loadedion

+0

我有兩個選項卡和一個選項卡有一些文本框來輸入數據,一旦我切換到另一個選項卡,並返回到原始選項卡的文本框失去其價值。這就是你要解決的問題? – Si8