5

しばらく探していましたが、報告されたバグのほとんど (かなりの数があります) は、android.support.design.widget.TextInputLayoutこのバグとは少し異なっていると思います。少なくとも、私は他のほとんどのバグを解決しましたが、これには苦労しています。私は現在、このようなFragmentいくつかの活動を行っていますTextInputLayout

<android.support.design.widget.TextInputLayout
    android:id="@+id/input1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/hint1"
        android:inputType="numberSigned" />
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
    android:id="@+id/input2
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/hint2"
        android:inputType="numberSigned"/>
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
    android:id="@+id/input3"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/hint3"
        android:inputType="numberSigned">
</android.support.design.widget.TextInputLayout>

そして、いくつかの外部条件 (重要ではない) を満たした後、前述のフラグメントを非表示にする別のフラグメント (100% 画面) を開いて表示します。この新しいフラグメントが、その特定のケースで必要ないくつかの追加フィールドを要求することに疑問を持っている場合に備えて。これは、新しい の作成を処理するコードですFragment

Fragment2 fragment2 = new Fragment2();
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction()
                                .replace(((ViewGroup) getView().getParent()).getId(), fragment2);
transaction.addToBackStack(Fragment1.class.getSimpleName());
transaction.commit();

しかし問題は、最初のフラグメントに戻るとき(戻るボタンを押す、ツールバー/アクションバーのホームボタンなど)です。私のすべてがTextInputLayoutsそれらに挿入されたテキストを失います。EditTextこれは非常に厄介で、マテリアル デザインへの移行の前に行ったように、 のみで作業している場合には発生しませんでした。

FragmentTransactionさらに、 を使用してフラグメントを置き換える代わりに、新しい を開始すると、これは起こりませんActivity。残念ながら、これは私たちが本当に望んでいるものではありません。そして、この種の回避策を実行する必要はありません。

何か案は?これは誰かに起こりましたか?

4

1 に答える 1

6

私の「答え」を投稿することは、実際には回避策であり、すべての人にとって有用または満足できるものではないかもしれませんが、少なくとも私には役に立ちました。

これは明らかに新しい のバグであり、 で置換または削除を行うときに をTextInputLayoutうまく処理できません。以前は本当に良い仕事をしました。savedInstanceStateFragmentTransactionEditText

私がやったのはFragmentTransaction#replace()、(フラグメントの削除に問題を追跡したため)を使用するのではなく、 と の組み合わせを使用することでしFragmentTransaction#hide()FragmentTransaction#add()。これはまったく同じ視覚効果と動作を提供し、前述のバグの問題はありません。明らかに、フラグメントを削除しないという固有の欠点があります。フラグメントリソースを解放したり、他の目的に使用したりすることはできません。これは、メモリが不足しているか、フラグメントが怪物である場合に問題を引き起こす可能性があります。しかし、少なくとも私の場合、問題は発生しませんでした。

要約すると、これが最終的にフラグメント トランザクションとして使用するものです。

Fragment2 fragment2 = new Fragment2();
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.add(((ViewGroup) getView().getParent()).getId(), fragment2);
transaction.hide(Fragment1.this);
transaction.addToBackStack(Fragment1.class.getSimpleName());
transaction.commit();

それがあなたの何人かを助けることを願っています!

于 2015-07-23T14:48:51.023 に答える