Skip to content

Instantly share code, notes, and snippets.

@mataanin
Last active August 29, 2015 14:07
Show Gist options
  • Save mataanin/9e676bf05ab0648e315a to your computer and use it in GitHub Desktop.
Save mataanin/9e676bf05ab0648e315a to your computer and use it in GitHub Desktop.
NPE on ButterKnife view references safe callbacks for Fragments.
public abstract class BaseFragment extends Fragment implements ViewableFragment {
private boolean mHasViews;
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(getFragmentLayoutId(), null);
ButterKnife.inject(this, root);
return root
}
@Override public void onViewStateRestored(Bundle state) {
super.onViewStateRestored(state);
mHasViews = true;
}
@Override public void onDestroyView() {
super.onDestroyView();
ButterKnife.reset(this);
mHasViews = false;
}
@Override public boolean hasViews() {
return mHasViews;
}
}
public class OnPreDrawListenerWrapper implements ViewTreeObserver.OnPreDrawListener {
private final ViewTreeObserver.OnPreDrawListener mListener;
private WeakReference<Fragment> mFragment;
public OnPreDrawListenerWrapper(Fragment fragment, ViewTreeObserver.OnPreDrawListener listener) {
mFragment = new WeakReference<>(fragment);
mListener = listener;
}
@Override public boolean onPreDraw() {
if (canExecute()) {
return mListener.onPreDraw();
}
return true;
}
private boolean canExecute() {
return mFragmentRef.get() != null && mFragmentRef.get().hasViews();
}
}
public class RunnableWrapper implements Runnable {
private final WeakReference<ViewableFragment> mFragmentRef;
private final Runnable mRunnable;
public RunnableWrapper(ViewableFragment fragment, Runnable runnable) {
mFragmentRef = new WeakReference<>(fragment);
mRunnable = runnable;
}
@Override public void run() {
if (canExecute()) {
mRunnable.run();
}
}
private boolean canExecute() {
return mFragmentRef.get() != null && mFragmentRef.get().hasViews();
}
}
public interface ViewableFragment {
boolean hasViews();
}
@Laimiux
Copy link

Laimiux commented Oct 3, 2014

Why View root = inflater.inflate(getFragmentLayoutId(), null); and not inflater.inflate(getFragmentLayoutId(), container, false); ?

@mataanin
Copy link
Author

mataanin commented Oct 3, 2014

The earliest possible.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment