-
-
Save JakeWharton/2621173 to your computer and use it in GitHub Desktop.
/* Base fragment to ensure the parent activity implements a contract interface. */ | |
public abstract class ContractFragment<T> extends Fragment { | |
private T mContract; | |
@Override | |
public void onAttach(Activity activity) { | |
try { | |
mContract = (T)activity; | |
} catch (ClassCastException e) { | |
throw new IllegalStateException(activity.getClass().getSimpleName() | |
+ " does not implement " + getClass().getSimpleName() + "'s contract interface.", e); | |
} | |
super.onAttach(activity); | |
} | |
@Override | |
public void onDetach() { | |
super.onDetach(); | |
mContract = null; | |
} | |
public final T getContract() { | |
return mContract; | |
} | |
} | |
/* Example fragment showing usage of ContractFragment. */ | |
public class MyCoolFragment extends ContractFragment<MyCoolFragment.Contract> { | |
public interface Contract { | |
void sayHi(String message); | |
} | |
public void somethingHappened() { | |
getContract().sayHi("Hi, Mom!"); | |
} | |
} |
An example is in the EU4U sample code from The Busy Coder's Guide to Android Development
https://commonsware.com/Android
onAttach(Activity activity)
is now deprecated in favour of onAttach(Context context)
. Does that impact this pattern? Especially considering the use of ContextWrapper
.
Hey guys! I use this concept so heavily that I packaged my base ContractFragmet
and ContractDialogFragment
implementations into a small library. I also extended this pattern to support parent fragment implementations of the contract as well. You can find instructions on how to add this in gradle here:
https://github.com/marksalpeter/contract-fragment
Let me know what you think :)
Shocked to see mContract
in @JakeWharton's code. I thought he is totally against Hungarian notation..
Oh I see, that was 7 years ago. Forgivable! :--)
Isn't it easier and more straightforward to use Otto? Could you comment on the use cases where to use this instead of an event bus?