48

わかりました。アプリケーションでフラグメントを置き換えようとすると、他のフラグメントが存在するコンテナ内にフラグメントが追加されるだけで、現在のフラグメントが残ります。replaceを呼び出して、フラグメントを含むビューを参照し、フラグメント自体を参照してみました。これらはどちらも機能しません。フラグメントトランザクションマネージャーを使用してビューにフラグメントを追加できますが、追加後にフラグメントを削除しようとしても機能しません。どんな助けでもいただければ幸いです。これが私のファイルです。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //Setup the actionabar. Use setDrawableBackground to set a background image for the actionbar.
    final ActionBar actionbar = getActionBar();
    actionbar.setDisplayShowTitleEnabled(false);
    actionbar.setDisplayUseLogoEnabled(true);
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionbar.addTab(actionbar.newTab().setText(R.string.home_tab_text).setTabListener(this),true);
    actionbar.addTab(actionbar.newTab().setText(R.string.insert_tab_text).setTabListener(this));

    Fragment fragment = new insert_button_frag();
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.button_fragment, fragment);
    transaction.addToBackStack(null);

    transaction.commit();
}

これがレイアウトです

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
        android:orientation="vertical"
        android:id="@+id/button_fragment_container"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <fragment
            android:name="com.bv.silveredittab.home_button_frag"
            android:id="@+id/button_fragment"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <fragment
            android:name="com.bv.silveredittab.quick_insert_frag"
            android:id="@+id/quick_insert_frag"
            android:layout_width="350dip"
            android:layout_height="fill_parent" />

        <fragment
            android:name="com.bv.silveredittab.editor_frag"
            android:id="@+id/editor_frag"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

    </LinearLayout>

</LinearLayout>

そしてここにフラグメントコードがあります

public class insert_button_frag extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        return inflater.inflate(R.layout.insert_buttons,container, false);
    }
}

私が言ったように。フラグメントの親ビューを参照して置き換えようとしましたが、フラグメント自体(idによる)は、元のフラグメントが含まれているビュー内に新しいフラグメントを追加するだけです。

4

4 に答える 4

37

レイアウトでプレースホルダーを使用し、実行時にフラグメントをそれにアタッチすることで、これを解決しました。

あなたと同じように、xmlレイアウト内でフラグメントをインスタンス化した場合、実行時に別のフラグメントに置き換えた後もコンテンツは表示されたままになります。

于 2011-03-17T22:16:45.640 に答える
20

問題はこの行です:

transaction.replace(R.id.button_fragment, fragment);

replace2つのオーバーロードされたフォームがあります。どちらの場合も、最初の引数は、フラグメント自体ではなく、置き換えられるフラグメントのコンテナーです。だから、あなたの場合、あなたは電話する必要があります

transaction.replace(R.id.button_fragment_container, fragment);

編集:あなたの質問で、あなたは両方を試したことがわかります。動作をテストして検証しました。これはFragmentTransactionAPIのバグのようです。

Edit2:結局のところバグではありません。レイアウトファイルに静的に追加されたフラグメントを置き換えることはできません。プログラムで追加したもののみを置き換えることができます(Android:あるフラグメントを別のフラグメントに置き換えることはできません

于 2012-03-16T05:08:01.420 に答える
2

私も同じ問題を抱えていました。このリンクを見てください:Android Fragment Duplication

コンテナをinflater.inflate()メソッドに渡したという事実により、大規模な置換ではなく、古いフラグメントの内部に新しいフラグメントが作成されるのではないかと思います。作業バージョンでは、インフレータに「null」を提供してきました。

これが私が作業しているバージョンの必需品です...

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
   View newFrag = new View(getActivity().getApplicationContext());
   newFrag = inflater.inflate(R.id.frag, null);
   return newFrag;
}
于 2011-03-14T01:37:30.573 に答える
0

グーグル開発者ガイドは、最初にハードコードされたフラグメントをxmlに実装することを示しているため、非常に混乱しています。ただし、実際に既存のフラグメントを新しいフラグメントに置き換えたい場合は、実行時に(最初の)フラグメントを追加する必要があります。

公式サイトの状態は何ですか

FragmentTransaction replace(int containerViewId、フラグメントフラグメント、文字列タグ)

コンテナに追加された既存のフラグメントを置き換えます。これは基本的に、同じcontainerViewIdで追加された現在追加されているすべてのフラグメントに対してremove(Fragment)を呼び出し、次にここで指定された同じ引数でadd(int、Fragment、String)を呼び出すことと同じです。

コンテナに追加された既存のフラグメントを置き換えると表示されていることに注意してください

したがって、xmlは someActivity.xmlのようになります。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    tools:context="someActivity">

    <ImageView
        .../>

    <LinearLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="bottom"/>

</RelativeLayout>

そして、あなたの活動よりもOnCreate()で行います

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        [...]
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container, new FirstFragment).commit();

    }

フラグメントをアニメーションに簡単に置き換えて、その状態を保存するためにイベントをバックスタックに追加するよりも。

private SecondFrag getSecondFrag(){
    if(secondFrag == null)
        secondFrag = new SecondFrag()
    return secondFrag;
}

private void openRechargeFragment(){
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.setCustomAnimations(R.anim.show_frag, R.anim.hide_frag,
                R.anim.show_frag, R.anim.hide_frag);
        ft.replace(R.id.fragment_container, getSecondFrag(), "myTAG");
        ft.addToBackStack(null);
        ft.commit();
}
于 2016-07-20T09:32:52.143 に答える