web-dev-qa-db-ja.com

フラグメント内のViewPagerタブの変更を検出

複数のフラグメントを持つViewPagerがあります。 1つのFragmentでオーディオを再生します。別のフラグメントにスワイプすると、オーディオの再生が停止します。別のフラグメントがViewPagerに表示されていることを検出するにはどうすればよいですか?

onStoponHiddenChangedをオーバーライドしようとしました。失敗。オーバーライドするには、「もうアクティブではありません」メソッドが必要です。いや?

65
l33t

少し掘り下げたところ、ViewPagerはsetUserVisibleHintsetMenuVisibilityの両方を呼び出すことがわかりました。 setUserVisibleHintのドキュメント の状態なので、setUserVisibleHintをオーバーライドします。

このフラグメントのUIが現在ユーザーに表示されているかどうかについてのヒントをシステムに設定します。このヒントはデフォルトでtrueに設定されており、フラグメントインスタンスの状態を保存および復元しても持続します。アプリはこれをfalseに設定して、フラグメントのUIがスクロールして表示されないようにするか、そうでなければユーザーに直接表示されないようにします。これは、フラグメントライフサイクルの更新やローダーの順序付け動作などの操作に優先順位を付けるためにシステムによって使用される場合があります。

このコードをフラグメントに入れてみてください:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    // Make sure that we are currently visible
    if (this.isVisible()) {
        // If we are becoming invisible, then...
        if (!isVisibleToUser) {
            Log.d("MyFragment", "Not visible anymore.  Stopping audio.");
            // TODO stop audio playback
        }
    }
}
137
louielouie