Skip to content

Instantly share code, notes, and snippets.

@mataanin
Last active August 29, 2015 14:07
Show Gist options
  • Select an option

  • Save mataanin/9e676bf05ab0648e315a to your computer and use it in GitHub Desktop.

Select an option

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

Laimiux commented Oct 3, 2014

Copy link
Copy Markdown

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

@mataanin

mataanin commented Oct 3, 2014

Copy link
Copy Markdown
Author

The earliest possible.

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