Created
December 4, 2013 08:24
-
-
Save datayja/7784056 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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