From 3f5b8ec9b993cae2810734c190dd0d7466a6dc6b Mon Sep 17 00:00:00 2001 From: Vandolf Estrellado Date: Mon, 24 Jul 2017 12:13:29 -0400 Subject: [PATCH] Migrated sample project view bindings to butterknife. Closes #11 --- .../ui/common/BaseFragment.java | 44 +++++++++++++++++++ .../example_1/fragment/Example1Fragment.java | 32 ++++---------- .../fragment_a/Example2AFragment.java | 32 ++++---------- .../fragment_b/Example2BFragment.java | 32 ++++---------- .../child_fragment/Example3ChildFragment.java | 32 ++++---------- .../Example3ParentFragment.java | 26 ++++------- .../ui/main/MainFragment.java | 40 ++++------------- 7 files changed, 93 insertions(+), 145 deletions(-) diff --git a/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/common/BaseFragment.java b/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/common/BaseFragment.java index a0f459f..5adf5e0 100644 --- a/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/common/BaseFragment.java +++ b/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/common/BaseFragment.java @@ -19,10 +19,15 @@ import android.app.Fragment; import android.app.FragmentManager; import android.content.Context; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.View; import javax.inject.Inject; import javax.inject.Named; +import butterknife.ButterKnife; +import butterknife.Unbinder; import dagger.android.AndroidInjection; import dagger.android.AndroidInjector; import dagger.android.DispatchingAndroidInjector; @@ -53,12 +58,51 @@ public abstract class BaseFragment extends Fragment implements HasFragmentInject @Inject DispatchingAndroidInjector fragmentInjector; + @Nullable + private Unbinder viewUnbinder; + @Override public void onAttach(Context context) { AndroidInjection.inject(this); super.onAttach(context); } + @Override + public void onViewStateRestored(Bundle savedInstanceState) { + super.onViewStateRestored(savedInstanceState); + View view = getView(); + if (view != null) { + /* + * Bind the views here instead of in onViewCreated so that view state changed listeners + * are not invoked automatically without user interaction. + * + * If we bind before this method (e.g. onViewCreated), then any checked changed + * listeners bound by ButterKnife will be invoked during fragment recreation (since + * Android itself saves and restores the views' states. + * + * The lifecycle order is as follows (same if added via xml or java or if retain + * instance is true): + * + * onAttach + * onCreateView + * onViewCreated + * onActivityCreated + * onViewStateRestored + * onResume + */ + viewUnbinder = ButterKnife.bind(this, getView()); + } + } + + @Override + public void onDestroyView() { + if (viewUnbinder != null) { + viewUnbinder.unbind(); + } + super.onDestroyView(); + } + + @Override public final AndroidInjector fragmentInjector() { return fragmentInjector; diff --git a/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_1/fragment/Example1Fragment.java b/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_1/fragment/Example1Fragment.java index a4b7599..831c44c 100644 --- a/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_1/fragment/Example1Fragment.java +++ b/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_1/fragment/Example1Fragment.java @@ -17,7 +17,6 @@ package com.vestrel00.daggerbutterknifemvp.ui.example_1.fragment; import android.os.Bundle; -import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -31,10 +30,13 @@ import javax.inject.Inject; +import butterknife.BindView; +import butterknife.OnClick; + /** * A fragment that contains a button that does something. */ -public final class Example1Fragment extends BaseFragment implements View.OnClickListener { +public final class Example1Fragment extends BaseFragment { @Inject SingletonUtil singletonUtil; @@ -45,7 +47,8 @@ public final class Example1Fragment extends BaseFragment implements View.OnClick @Inject PerFragmentUtil perFragmentUtil; - private TextView someText; + @BindView(R.id.some_text) + TextView someText; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -53,27 +56,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, return inflater.inflate(R.layout.example_1_fragment, container, false); } - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - // TODO (Butterknife) replace with butterknife view binding - someText = (TextView) view.findViewById(R.id.some_text); - view.findViewById(R.id.do_something).setOnClickListener(this); - } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.do_something: - onDoSomethingClicked(); - break; - default: - throw new IllegalArgumentException("Unhandled view " + v.getId()); - } - } - - private void onDoSomethingClicked() { + @OnClick(R.id.do_something) + void onDoSomethingClicked() { String something = singletonUtil.doSomething(); something += "\n" + perActivityUtil.doSomething(); something += "\n" + perFragmentUtil.doSomething(); diff --git a/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_2/fragment_a/Example2AFragment.java b/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_2/fragment_a/Example2AFragment.java index d924a18..9445d92 100644 --- a/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_2/fragment_a/Example2AFragment.java +++ b/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_2/fragment_a/Example2AFragment.java @@ -17,7 +17,6 @@ package com.vestrel00.daggerbutterknifemvp.ui.example_2.fragment_a; import android.os.Bundle; -import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -31,10 +30,13 @@ import javax.inject.Inject; +import butterknife.BindView; +import butterknife.OnClick; + /** * A fragment that contains a button that does something. */ -public final class Example2AFragment extends BaseFragment implements View.OnClickListener { +public final class Example2AFragment extends BaseFragment { @Inject SingletonUtil singletonUtil; @@ -45,7 +47,8 @@ public final class Example2AFragment extends BaseFragment implements View.OnClic @Inject PerFragmentUtil perFragmentUtil; - private TextView someText; + @BindView(R.id.some_text) + TextView someText; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -53,27 +56,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, return inflater.inflate(R.layout.example_2_fragment_a, container, false); } - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - // TODO (Butterknife) replace with butterknife view binding - someText = (TextView) view.findViewById(R.id.some_text); - view.findViewById(R.id.do_something).setOnClickListener(this); - } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.do_something: - onDoSomethingClicked(); - break; - default: - throw new IllegalArgumentException("Unhandled view " + v.getId()); - } - } - - private void onDoSomethingClicked() { + @OnClick(R.id.do_something) + void onDoSomethingClicked() { String something = singletonUtil.doSomething(); something += "\n" + perActivityUtil.doSomething(); something += "\n" + perFragmentUtil.doSomething(); diff --git a/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_2/fragment_b/Example2BFragment.java b/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_2/fragment_b/Example2BFragment.java index 18f52c3..3c134fc 100644 --- a/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_2/fragment_b/Example2BFragment.java +++ b/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_2/fragment_b/Example2BFragment.java @@ -17,7 +17,6 @@ package com.vestrel00.daggerbutterknifemvp.ui.example_2.fragment_b; import android.os.Bundle; -import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -31,10 +30,13 @@ import javax.inject.Inject; +import butterknife.BindView; +import butterknife.OnClick; + /** * A fragment that contains a button that does something. */ -public final class Example2BFragment extends BaseFragment implements View.OnClickListener { +public final class Example2BFragment extends BaseFragment { @Inject SingletonUtil singletonUtil; @@ -45,7 +47,8 @@ public final class Example2BFragment extends BaseFragment implements View.OnClic @Inject PerFragmentUtil perFragmentUtil; - private TextView someText; + @BindView(R.id.some_text) + TextView someText; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -53,27 +56,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, return inflater.inflate(R.layout.example_2_fragment_b, container, false); } - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - // TODO (Butterknife) replace with butterknife view binding - someText = (TextView) view.findViewById(R.id.some_text); - view.findViewById(R.id.do_something).setOnClickListener(this); - } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.do_something: - onDoSomethingClicked(); - break; - default: - throw new IllegalArgumentException("Unhandled view " + v.getId()); - } - } - - private void onDoSomethingClicked() { + @OnClick(R.id.do_something) + void onDoSomethingClicked() { String something = singletonUtil.doSomething(); something += "\n" + perActivityUtil.doSomething(); something += "\n" + perFragmentUtil.doSomething(); diff --git a/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_3/child_fragment/Example3ChildFragment.java b/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_3/child_fragment/Example3ChildFragment.java index e9f2400..9bc30c9 100644 --- a/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_3/child_fragment/Example3ChildFragment.java +++ b/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_3/child_fragment/Example3ChildFragment.java @@ -17,7 +17,6 @@ package com.vestrel00.daggerbutterknifemvp.ui.example_3.child_fragment; import android.os.Bundle; -import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -32,10 +31,13 @@ import javax.inject.Inject; +import butterknife.BindView; +import butterknife.OnClick; + /** * A fragment that contains a button that does something. */ -public final class Example3ChildFragment extends BaseFragment implements View.OnClickListener { +public final class Example3ChildFragment extends BaseFragment { @Inject SingletonUtil singletonUtil; @@ -49,7 +51,8 @@ public final class Example3ChildFragment extends BaseFragment implements View.On @Inject PerChildFragmentUtil perChildFragmentUtil; - private TextView someText; + @BindView(R.id.some_text) + TextView someText; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -57,27 +60,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, return inflater.inflate(R.layout.example_3_child_fragment, container, false); } - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - // TODO (Butterknife) replace with butterknife view binding - someText = (TextView) view.findViewById(R.id.some_text); - view.findViewById(R.id.do_something).setOnClickListener(this); - } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.do_something: - onDoSomethingClicked(); - break; - default: - throw new IllegalArgumentException("Unhandled view " + v.getId()); - } - } - - private void onDoSomethingClicked() { + @OnClick(R.id.do_something) + void onDoSomethingClicked() { String something = singletonUtil.doSomething(); something += "\n" + perActivityUtil.doSomething(); something += "\n" + perFragmentUtil.doSomething(); diff --git a/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_3/parent_fragment/Example3ParentFragment.java b/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_3/parent_fragment/Example3ParentFragment.java index 5fd2789..3965d8d 100644 --- a/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_3/parent_fragment/Example3ParentFragment.java +++ b/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/example_3/parent_fragment/Example3ParentFragment.java @@ -32,10 +32,13 @@ import javax.inject.Inject; +import butterknife.BindView; +import butterknife.OnClick; + /** * A fragment that contains a button that does something. */ -public final class Example3ParentFragment extends BaseFragment implements View.OnClickListener { +public final class Example3ParentFragment extends BaseFragment { @Inject SingletonUtil singletonUtil; @@ -46,7 +49,8 @@ public final class Example3ParentFragment extends BaseFragment implements View.O @Inject PerFragmentUtil perFragmentUtil; - private TextView someText; + @BindView(R.id.some_text) + TextView someText; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -61,24 +65,10 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { if (savedInstanceState == null) { addChildFragment(R.id.child_fragment_container, new Example3ChildFragment()); } - - // TODO (Butterknife) replace with butterknife view binding - someText = (TextView) view.findViewById(R.id.some_text); - view.findViewById(R.id.do_something).setOnClickListener(this); - } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.do_something: - onDoSomethingClicked(); - break; - default: - throw new IllegalArgumentException("Unhandled view " + v.getId()); - } } - private void onDoSomethingClicked() { + @OnClick(R.id.do_something) + void onDoSomethingClicked() { String something = singletonUtil.doSomething(); something += "\n" + perActivityUtil.doSomething(); something += "\n" + perFragmentUtil.doSomething(); diff --git a/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/main/MainFragment.java b/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/main/MainFragment.java index 8c535bb..08e6079 100644 --- a/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/main/MainFragment.java +++ b/app/src/main/java/com/vestrel00/daggerbutterknifemvp/ui/main/MainFragment.java @@ -27,6 +27,8 @@ import javax.inject.Inject; +import butterknife.OnClick; + /** * Displays a set of buttons for the other activities. *

@@ -45,7 +47,7 @@ * The activity only acts as the host to 1 or more fragments for inter-fragment communication. All * views and logic are in fragments. */ -public final class MainFragment extends BaseFragment implements View.OnClickListener { +public final class MainFragment extends BaseFragment { @Inject MainFragmentListener listener; @@ -56,42 +58,18 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, return inflater.inflate(R.layout.main_fragment, container, false); } - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - // TODO (Butterknife) replace with butterknife view binding - view.findViewById(R.id.example_1).setOnClickListener(this); - view.findViewById(R.id.example_2).setOnClickListener(this); - view.findViewById(R.id.example_3).setOnClickListener(this); - } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.example_1: - onExample1Clicked(); - break; - case R.id.example_2: - onExample2Clicked(); - break; - case R.id.example_3: - onExample3Clicked(); - break; - default: - throw new IllegalArgumentException("Unhandled view " + v.getId()); - } - } - - private void onExample1Clicked() { + @OnClick(R.id.example_1) + void onExample1Clicked() { listener.onExample1Clicked(); } - private void onExample2Clicked() { + @OnClick(R.id.example_2) + void onExample2Clicked() { listener.onExample2Clicked(); } - private void onExample3Clicked() { + @OnClick(R.id.example_3) + void onExample3Clicked() { listener.onExample3Clicked(); } }