2

2つのフラグメントを含む単純なレイアウトがあります。2つのフラグメントの1つは定期的に置き換えられ、もう1つは使用している間ずっと一貫性が保たれます。何らかの理由で、削除/追加は問題なく機能しますが、置き換えると他のフラグメントが消えます。デバッグコードから、明らかな理由もなく、フラグメントが単に切り離されることがわかります。なぜこれなのか?後者を使用する場合は、QuestionAreaが最初になくなるように細心の注意を払う必要があります...

これらのコード行は、FragmentActivityクラスのから来ています。

        fragManager.beginTransaction()
        .replace(R.id.QuestionArea, getQuestionPostView(), "QuestionArea")
        .commit();

        fragManager.beginTransaction()
        .remove(fragManager.findFragmentById(R.id.QuestionArea))
        .add(R.id.QuestionArea, getQuestionPostView(), "QuestionArea")
        .commit();

これが私が望む他の関連するコードです:

メインディスプレイのXML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:orientation="vertical" >

    <com.pearsonartphoto.FontFitTextView
        android:id="@+id/Name"
        style="@style/bigText"
        android:background="@color/blue"
        android:gravity="center"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"/>

    <TextView android:id="@+id/Instructions"
        style="@style/medText"
        android:layout_width="fill_parent"
        android:layout_below="@id/PowerName"
        />

    <fragment
        android:name="com.pearsonartphoto.NumberDisplay"
        android:gravity="center"
        android:id="@+id/QuestionArea"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/Instructions"/>

    <fragment
        android:name="com.pearsonartphoto.AbstractAnswerFragment"
        android:id="@+id/AnswerArea"
        style="@style/bigText"
        android:gravity="center"
        android:layout_below="@+id/QuestionArea"
        android:layout_alignParentBottom="true"
        android:layout_width="fill_parent"
        android:layout_height="530sp"/>

</RelativeLayout>

AnswerAreaを設定するFragmentActivityの一部

protected void setAnswerPad(AbstractAnswerFragment pad)
{
    fragManager.beginTransaction()
        .replace(R.id.AnswerArea, pad, "AnswerArea")
        .commit();
    fragManager.executePendingTransactions();

    answerPadToAnswer=pad.getAnswerKey();
}

初めて(FragmentActivityから)QuestionAreaが設定されます。

    fragManager.beginTransaction()
    .replace(R.id.QuestionArea, getQuestionPreView(), "QuestionArea")
    .commit();

関数getPostView()およびgetPreView()

@Override
Fragment getQuestionPreView() {
    NumberDisplay display=(NumberDisplay)manager.findFragmentById(R.id.QuestionArea);
    display.setNumber(-1);
    return display;
}

@Override
Fragment getQuestionPostView() {
    NumberDisplay display=(NumberDisplay)manager.findFragmentById(R.id.QuestionArea);
    display.setNumber(answer);
    return display;
}
4

2 に答える 2

2

ほとんどの場合、問題は実行時に静的フラグメント(xmlレイアウトで宣言されたフラグメント)を変更しようとすることから発生しますが、これは実行すべきではありません。これらのフラグメントを置き換えたり削除したりするFragmentActivity場合は、代わりにラッパーレイアウト(のようなFrameLayout)をxmlレイアウトのそれらの場所に配置し、そのコンテナーを将来のフラグメントトランザクションに使用する必要があります。Androidエンジニアの1人からのこの回答を確認してください。

于 2012-11-24T06:16:05.130 に答える
1

これを機能させるには、いくつかの作業が必要でした。

  1. 重要なことは、メインの XML コードを に変更することでしたFrameLayout
  2. 以前はフラグメントを作成する必要がなかったのに、いくつかの小さなフラグメントを作成する必要がありました。

新しいメイン XML コード:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:orientation="vertical" >

    <com.pearsonartphoto.FontFitTextView
        android:id="@+id/PowerName"
        style="@style/bigText"
        android:background="@color/blue"
        android:gravity="center"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"/>

    <TextView android:id="@+id/Instructions"
        style="@style/medText"
        android:layout_width="fill_parent"
        android:layout_below="@id/PowerName"
        />

    <FrameLayout 
        android:gravity="center"
        android:id="@+id/QuestionArea"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/Instructions"/>

    <FrameLayout 
        android:id="@+id/AnswerArea"
        style="@style/bigText"
        android:gravity="center"
        android:layout_below="@+id/QuestionArea"
        android:layout_alignParentBottom="true"
        android:layout_width="fill_parent"
        android:layout_height="530sp"/>

</RelativeLayout>
于 2012-11-24T12:54:36.993 に答える