From ae7bb7198a6c7c1a0a942dc308256e861ff651b7 Mon Sep 17 00:00:00 2001 From: Bartosz Kosarzycki Date: Wed, 23 Jul 2014 10:21:11 +0200 Subject: [PATCH] Android Annotations support - inflate view from existing view It can be used in @AfterViews method @AfterViews protected void afterViews() { Binder.InflateResult inflateResult = Binder.inflateViewFromExistingView(this, findViewById(R.id.drawer_layout), R.layout.activity_init); Binder.bindView(this, inflateResult, mViewModel); } --- .../src/gueei/binding/Binder.java | 4 ++ .../src/gueei/binding/IKernel.java | 12 ++++- .../src/gueei/binding/kernel/KernelBase.java | 46 +++++++++++++++---- 3 files changed, 51 insertions(+), 11 deletions(-) diff --git a/Core/AndroidBinding/src/gueei/binding/Binder.java b/Core/AndroidBinding/src/gueei/binding/Binder.java index d6a542f..aabada4 100644 --- a/Core/AndroidBinding/src/gueei/binding/Binder.java +++ b/Core/AndroidBinding/src/gueei/binding/Binder.java @@ -48,6 +48,10 @@ public static BindingMap getBindingMapForView(View view){ public static InflateResult inflateView(Context context, int layoutId, ViewGroup parent, boolean attachToRoot){ return _kernel.inflateView(context, layoutId, parent, attachToRoot); } + + public static InflateResult inflateViewFromExistingView(Context context, View view, int layoutId){ + return _kernel.inflateViewFromExistingView(context, view, layoutId); + } public static View bindView(Context context, InflateResult inflatedView, Object model){ return _kernel.bindView(context, inflatedView, model); diff --git a/Core/AndroidBinding/src/gueei/binding/IKernel.java b/Core/AndroidBinding/src/gueei/binding/IKernel.java index 18879d6..9053db3 100644 --- a/Core/AndroidBinding/src/gueei/binding/IKernel.java +++ b/Core/AndroidBinding/src/gueei/binding/IKernel.java @@ -40,7 +40,17 @@ public interface IKernel { * @return Inflate Result. */ public InflateResult inflateView(Context context, int layoutId, ViewGroup parent, boolean attachToRoot); - /** + + /** + * Inflate, and parse the binding information with Android binding + * @param context + * @param view inflate from this view instance + * @param layoutId The xml layout definition (it's not INFLATED FROM this definition) + * @return Inflate Result. + */ + public InflateResult inflateViewFromExistingView(Context context, View view, int layoutId); + + /** * Returns the binded root view of the inflated view * @param context * @param inflatedView The inflated result from inflateView diff --git a/Core/AndroidBinding/src/gueei/binding/kernel/KernelBase.java b/Core/AndroidBinding/src/gueei/binding/kernel/KernelBase.java index 4b02629..1ae5be1 100644 --- a/Core/AndroidBinding/src/gueei/binding/kernel/KernelBase.java +++ b/Core/AndroidBinding/src/gueei/binding/kernel/KernelBase.java @@ -5,17 +5,8 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import gueei.binding.AttributeBinder; -import gueei.binding.AttributeCollection; +import gueei.binding.*; import gueei.binding.Binder.InflateResult; -import gueei.binding.BindingLog; -import gueei.binding.BindingMap; -import gueei.binding.IBindableView; -import gueei.binding.IKernel; -import gueei.binding.ISyntaxResolver; -import gueei.binding.ViewAttribute; -import gueei.binding.ViewFactory; -import gueei.binding.ViewTag; import gueei.binding.bindingProviders.AbsSpinnerViewProvider; import gueei.binding.bindingProviders.AdapterViewProvider; import gueei.binding.bindingProviders.CompoundButtonProvider; @@ -33,6 +24,8 @@ import gueei.binding.listeners.MulticastListenerCollection; import gueei.binding.listeners.ViewMulticastListener; +import java.util.ArrayList; + public abstract class KernelBase implements IKernel { public KernelBase() { @@ -112,6 +105,39 @@ public InflateResult inflateView(Context context, int layoutId, ViewGroup parent return result; } + @Override + public InflateResult inflateViewFromExistingView(Context context, View view, int layoutId) { + LayoutInflater inflater = LayoutInflater.from(context).cloneInContext(context); + ViewFactory factory = new ViewFactory(inflater); + inflater.setFactory(factory); + InflateResult result = new InflateResult(); + inflater.inflate(layoutId, null, false); + result.rootView = view; + result.processedViews = getReattachedViews(factory.getProcessedViews(), result.rootView); + + return result; + } + + private ArrayList getReattachedViews(ArrayList cloneViews, View rootView) { + ArrayList originalControls = new ArrayList(); + + for (View cloneView : cloneViews) { + + int cloneId = cloneView.getId(); + if (cloneId == -1) + android.util.Log.e("ANDROID-BINDING","ALL BINDABLE CONTROLS IN ANDROID-BINDING MUST HAVE AN ID!"); + + View view = rootView.findViewById(cloneId); + if (view != null) { + BindingMap bm = Binder.getBindingMapForView(cloneView); + Binder.putBindingMapToView(view, bm); + originalControls.add(view); + } + } + + return originalControls; + } + @Override public View bindView(Context context, InflateResult inflatedView, Object model) { for(View v: inflatedView.processedViews){