1

FragmentTabHostとで作成したタブの内容を変更したいのgetSupportFragmentManager()ですが、やり方がわかりません。ここに私が持っているものがあります:

mTabHost = new FragmentTabHost(this);
    setContentView(mTabHost);

    mTabHost.setup(this, getSupportFragmentManager(),R.id.menu_settings);
    mTabHost.addTab(mTabHost.newTabSpec("A").setIndicator("A"),
            A.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("B").setIndicator("B"),
            B.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("C").setIndicator("C"),
            C.class, null);

ロードされた各クラスはフラグメントを拡張しonCreateView、そのレイアウトを拡張します。

問題は、それらの 1 つ (たとえば A.class ) 内にダイアログがあり、ダイアログの応答に応じて、フラグメント D に移動し、タブ C に配置する必要があることです。これを行うにはどうすればよいですか? ダイアログから、タブを作成してフラグメントを指定するアクティビティに通信できましたが、タブ内にあるフラグメント (この場合は C ) を変更する方法がわかりません。

要約すると、C が配置されたタブ内でフラグメント C を D に変更する必要があります。サポートライブラリを使用しています。

ありがとう!!

4

1 に答える 1

0

クラスを作成すると、フラグメント コンテナーのように機能します。

例えば:

public class FragmentContainer extends SherlockFragment implements OnBackStackChangedListener {
public static final String PARAM_CONTENT_FRAGMENT = "param_content_fragment";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    return inflater.inflate(R.layout.frag_container, null);
}

public void replaceContent(Class<? extends Fragment> clz, Bundle args) {
    FragmentTransaction tx = getChildFragmentManager().beginTransaction();

    tx.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

    // save
    Fragment curFrag = getChildFragmentManager().findFragmentById(R.id.fragment_content);
    tx.addToBackStack(curFrag.getClass().getSimpleName());

    // change
    try {
        Fragment newFragment = clz.newInstance();
        newFragment.setArguments(args);
        tx.replace(R.id.fragment_content, newFragment, clz.getClass().getSimpleName());
        tx.commit();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

}

@Override
public void onResume() {
    super.onResume();
    Fragment f = getChildFragmentManager().findFragmentById(R.id.fragment_content);
    if (f == null) {
        Class<? extends Fragment> claz = (Class<? extends Fragment>) getArguments().getSerializable(
                PARAM_CONTENT_FRAGMENT);
        FragmentTransaction tx = getChildFragmentManager().beginTransaction();
        try {
            f = claz.newInstance();
            f.setTargetFragment(this, 0);
            tx.add(R.id.fragment_content, f);
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

    }
}

ここでいくつかの重要なポイント:

  1. FragmentContainer.class で 3 番目のタブを開始し、C.class をフラグメント引数として指定します。(引数キーは PARAM_CONTENT_FRAGMENT です)

  2. onCreateView() id @+id/fragment_content で FrameLayout を作成するだけです。ここに子フラグメントを配置します。

  3. onResume() 存在しない場合、子フラグメントを FrameLayout に配置します。

  4. replaceContent() Fragment-C がそれ自体を Fragment-D に変更したい場合に、このメソッドを呼び出します。

たとえば Frament-C では、次のようになります。

((FragmentContainer)getParentFragment() ).replaceContent( D.class, null );
于 2013-04-09T13:31:19.933 に答える