0

afragment と bfragment の 2 つのタブを持つ ActionBar を作成しました。afragment にはボタンが含まれています。afragment のボタンをクリックすると、cfragment に変わります。ただし、タブをもう一度クリックすると、フラグメントが再度読み込まれます。これを防ぐにはどうすればよいですか。基本的に、「誰かがあなたをクリックすると、最後のフラグメント状態 (この場合は cfragment) をロードしますか?」とタブに伝えます。

これは私の 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);
}

私のタブリスナー:

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 をタブに保存するにはどうすればよいですか? ありがとうございました。

4

1 に答える 1

2

タブを変更するたびに新しいフラグメントを追加しているため、状態は保存されていません。

「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);
  }
}
于 2013-06-10T22:43:50.170 に答える