2017-03-27 14 views
0

私は、フラグメントのタッチリスナーの中央コントローラとして機能することで、フラグメントトランジションを処理するBaseActivityを持っています。フラグメントの1つはカスタムListviewで、タップするとBaseActivityに新しいフラグメントが表示されます。これは、アクティビティが最初から作成されたときに機能しますが、アクティビティが破棄されたとき(Devオプション「アクティビティを保持しない」またはメモリのクリーンアップを介して)に問題があります。カスタムListviewは、アクティビティが破棄された後にリスナーに応答しません。

アクティビティが破損して起動したときにフラグメントのリスナーを設定していますが、リストビューをタップすると新しいフラグメントに切り替わらないことをログから確認しました。また、フォーカスの問題であるかどうかを確認しようとしましたが、android:descendantFocusability="blocksDescendants"をListviewレイアウトXMLに入れても問題は解決しません。

リスナーはフラグメントを作成するときに設定され、リスナーは起動時にインスタンス化される最初のフラグメントです。どんな洞察にも感謝します!

+0

ここで、フラグメントリスナーを設定していますか? 'onCreateView'? –

+0

フラグメントリスナーは、onCreateView、yesに設定されています。フラグメントリストビューOnitemClickListenerは、フラグメントの作成時にBaseActivityが設定する実装されたリスナーを呼び出します。 – infinityLoop

+0

私は読んだ方が簡単だと答えましたが、おそらくそこから作業することができます –

答えて

1

私はあなたのお手伝いをするために答えを追加します。まず最初に、あなたはリスナーがフラグメントのonAttachの内側に設定されるべきであるということである。

@Override 
public void onAttach(Context context) { 
    // here, your context is also your activity 
    super.onAttach(context); 
    if (context instanceof YourListener) { 
     this.fragmentListener = (YourListener) context; 
    } 
} 

これを変更し、何かが変化しているかどうかを確認してください!

+0

これはうまくいくようですが、私はFragmentとそれをonAttachに設定するときのListenerの設定の違いを理解していません。私のアプリがガベージコレクトされている場合は、フラグメントの作成を行って、フラグメントの正しいインスタンス化を再開する必要がありますか? – infinityLoop

+0

「アクティビティを保持しない」がオンの場合、ライフサイクルが変更されます。また、リスナーを 'onAttach'内に割り当てるための推奨方法もあります。参照先はhttps://developer.android.com/guide/components/fragments.htmlです。 さまざまなライフサイクルについても確認してください。http://vardhan-justlikethat.blogspot.com.br/2014/05/fragment-lifecycle-with-respect-to-its.htmlそれが役に立てば幸い! :) –

関連する問題