0

既に作成されたフラグメントにバンドルを割り当てる方法はありますか? 私はこのようなことを試しました:

Bundle mArgumentos = new Bundle();
mArgumentos.putString("id", id);
this.setArguments(mArgumentos);

しかし、エラーが発生します: Fragment already active.

onBackPressed() メソッドをオーバーライドせずにこれを達成できるかどうか疑問に思っています。

これに関する私の目的は、新しいアイテムを登録するためのフォームがあるためです。ここから、アイテムの新しい ID を使用して別のフラグメント (fragment_B と呼びます) に移動できます (新しい ID を割り当てるバンドルを使用して fragment_B を呼び出します)。ユーザーが戻るボタンを押すと、前のフォームに戻りますが、id がありません (これは、フォームが空などの前の状態になるためです)。

フォームが保存されていない場合、明らかにユーザーは fragment_B に移動できません。したがって、ユーザーはフォームを保存し、ボタンを押して、新しい ID で fragment_B に移動します。

FragmentB fragment = new FragmentB();

Bundle mArgumentos = new Bundle();
mArgumentos.putString("id",id);

fragment.setArguments(mArgumentos);

FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();

ft.replace(android.R.id.tabcontent, fragment, tag);
ft.addToBackStack(tag);
ft.commit();

助言がありますか?。

編集: ここに画像の説明を入力

フラグメントは同じアクティビティにありません。新しいアイテムを作成して保存ボタンを押すと、「編集モード」になるはずです。これは、アイテムを作成した後、戻って編集できることを意味します。編集と作成に同じフラグメントを使用しているだけです。そのため、アイテムを作成するときに、ボタンを押して fragment_B に移動し、戻るボタンを押すと、このアイテムの「編集モード」のようになります。これは、fragment_B から前に、作成されたアイテムの ID を渡す必要があることを意味します。そのため、onBackpress メソッドをオーバーライドせずにこれを実行できるかどうかを知りたいのです。

編集2:

これを達成する方法が他にない場合は、次のように onBackpress メソッドをオーバーライドすることを考えていました。

//get the fragment where I'm staying on.
Fragment fragmentActual = this.getSupportFragmentManager().findFragmentById(android.R.id.tabcontent);

//get the tag of the fragment
String fragmentTag = fragmentActual.getTag().toString();

if (fragmentTag.equals("tagFragmentB")){
    Fragment fragmentA = new FragmentA();

Bundle mArguments = fragmentActual.getArguments();
String id = mArguments.getString("id");

    if(id != null){

        fragmentA .setArguments(mArguments);

        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction ft = manager.beginTransaction();

        ft.replace(android.R.id.tabcontent, fragment, "fragmentA");
        ft.addToBackStack("fragmentA");
        ft.commit();
    }

}else{
    super.onBackPressed();
}

これは機能していますが、お気づきのとおり、これによりユーザーによって呼び出されたフラグメントの順序が変更され、ユーザーには表示されないはずです。したがって、これにより、ユーザーが行った呼び出しを取得するために、より多くのコードを配置する必要があります。

私はこれが初めてなので、「Androidの考え方」がないかもしれません。私が望むことを行うためのより良い方法があれば、私はすべてに対してオープンです. ユーザーが戻るボタンを押したからといって、将来的に問題が発生しないように、正しく考えたいだけです。

4

1 に答える 1

0

私の特定の状況では、次のように機能しました。フォームに入力して保存し、fragmentBに移動して最後に戻るボタンを押すと、フォームの情報が保持されることに気付きました。だから私は自分のフォームに非表示のetidTextを入れました:

<EditText
    android:id="@+id/textEditHiddenId"
    android:visibility="gone"
    android:inputType="number" />

保存ボタンが押されると、この editText の内容を設定します。

etIdHidden.setText(id);

http://developer.android.com/guide/components/fragments.htmlによると、アクティビティが作成されると、onCreateView の後にメソッド onResume が呼び出されます。したがって、このメソッドで textEditHiddenId の値を取得します。

@Override
public void onResume() {
    super.onResume();
    String id= etIdHidden.getText().toString();

    if(id.equals("")==false){
        mArgumentos=new Bundle();
        mArgumentos.putString("id", ""+id);

    }

};

最初は textEditHiddenId のコンテンツは空ですが、戻るボタンが押されて onResume メソッドが呼び出されると、コンテンツが初期化され、Bundle をオーバーライドできます。

これまでで最も簡単なソリューション..

于 2013-07-10T15:16:03.127 に答える