Skip to content

Instantly share code, notes, and snippets.

@datayja
Created December 4, 2013 08:24
Show Gist options
  • Save datayja/7784056 to your computer and use it in GitHub Desktop.
Save datayja/7784056 to your computer and use it in GitHub Desktop.
package bar.foo.example.lib.android;
import android.app.ActionBar;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.Context;
import java.lang.ref.WeakReference;
public class FragmentsTabListener<T extends Fragment> implements ActionBar.TabListener {
private final Context context;
private final String fragmentTag;
private final Class<T> fragmentClass;
private final WeakReference<OnFragmentTabChangeListener> changeListener;
private final FragmentChangeNotifier changeNotifier;
private T fragment;
public FragmentsTabListener(final Context context, final String fragmentTag, final Class<T> fragmentClass) {
this(context, fragmentTag, fragmentClass, null);
}
public FragmentsTabListener(final Context context, final String fragmentTag, final Class<T> fragmentClass, final OnFragmentTabChangeListener changeListener) {
this.context = context;
this.fragmentTag = fragmentTag;
this.fragmentClass = fragmentClass;
if (changeListener != null) {
this.changeListener = new WeakReference<>(changeListener);
changeNotifier = new EnabledFragmentChangeNotifier();
} else {
this.changeListener = null;
changeNotifier = new NullFragmentChangeNotifier();
}
}
@Override
@SuppressWarnings("unchecked")
public void onTabSelected(final ActionBar.Tab tab, final FragmentTransaction ft) {
if (fragment == null) {
fragment = (T) Fragment.instantiate(context, fragmentClass.getName());
changeNotifier.notifyFragmentTabCreated(fragment);
ft.replace(
android.R.id.content,
fragment,
fragmentTag
);
} else {
ft.attach(fragment);
}
changeNotifier.notifyFragmentTabAttached(fragment);
}
@Override
public void onTabUnselected(final ActionBar.Tab tab, final FragmentTransaction ft) {
if (fragment != null) {
ft.detach(fragment);
changeNotifier.notifyFragmentTabDetached(fragment);
}
}
@Override
public void onTabReselected(final ActionBar.Tab tab, final FragmentTransaction ft) {
// Do nothing
}
public interface OnFragmentTabChangeListener {
public <T extends Fragment> void onFragmentTabCreated(T newFragment);
public <T extends Fragment> void onFragmentTabAttached(T fragment);
public <T extends Fragment> void onFragmentTabDetached(T fragment);
}
private interface FragmentChangeNotifier {
public <T extends Fragment> void notifyFragmentTabCreated(T newFragment);
public <T extends Fragment> void notifyFragmentTabAttached(T fragment);
public <T extends Fragment> void notifyFragmentTabDetached(T fragment);
}
private class EnabledFragmentChangeNotifier implements FragmentChangeNotifier {
@Override
public <T extends Fragment> void notifyFragmentTabCreated(final T newFragment) {
if (hasChangeListener()) {
changeListener.get().onFragmentTabCreated(newFragment);
}
}
@Override
public <T extends Fragment> void notifyFragmentTabAttached(final T fragment) {
if (hasChangeListener()) {
changeListener.get().onFragmentTabAttached(fragment);
}
}
@Override
public <T extends Fragment> void notifyFragmentTabDetached(final T fragment) {
if (hasChangeListener()) {
changeListener.get().onFragmentTabDetached(fragment);
}
}
private boolean hasChangeListener() {
return changeListener.get() != null;
}
}
private class NullFragmentChangeNotifier implements FragmentChangeNotifier {
@Override
public <T extends Fragment> void notifyFragmentTabCreated(final T newFragment) {
}
@Override
public <T extends Fragment> void notifyFragmentTabAttached(final T fragment) {
}
@Override
public <T extends Fragment> void notifyFragmentTabDetached(final T fragment) {
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment