如果您想了解android.databinding.OnRebindCallback的实例源码的相关知识,那么本文是一篇不可错过的文章,我们将对androiddatabinding原理进行全面详尽的解
如果您想了解android.databinding.OnRebindCallback的实例源码的相关知识,那么本文是一篇不可错过的文章,我们将对android databinding原理进行全面详尽的解释,并且为您提供关于AbstractMethodError: abstract method "androidx.databinding.ViewDataBinding androidx.databind...、Android 官方 DataBinding(四):BindingAdapter、android.app.IStopUserCallback的实例源码、android.app.SharedElementCallback的实例源码的有价值的信息。
本文目录一览:- android.databinding.OnRebindCallback的实例源码(android databinding原理)
- AbstractMethodError: abstract method "androidx.databinding.ViewDataBinding androidx.databind...
- Android 官方 DataBinding(四):BindingAdapter
- android.app.IStopUserCallback的实例源码
- android.app.SharedElementCallback的实例源码
android.databinding.OnRebindCallback的实例源码(android databinding原理)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBinding = DataBindingUtil.setContentView(this,R.layout.activity_animation); mBinding.addOnRebindCallback(new OnRebindCallback() { @Override public boolean onPreBind(ViewDataBinding binding) { ViewGroup view = (ViewGroup) binding.getRoot(); TransitionManager.beginDelayedTransition(view); return true; } }); mBinding.setPresenter(new Presenter()); }
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBinding = DataBindingUtil.setContentView(this,R.layout.activity_animation); mBinding.addOnRebindCallback(new OnRebindCallback() { @Override public boolean onPreBind(ViewDataBinding binding) { ViewGroup view = (ViewGroup) binding.getRoot(); TransitionManager.beginDelayedTransition(view); return true; } }); mBinding.setPresenter(new Presenter()); }
AbstractMethodError: abstract method "androidx.databinding.ViewDataBinding androidx.databind...
混淆导致的数据绑定库错误
问题摘要
AbstractMethodError: abstract method "androidx.databinding.ViewDataBinding androidx.databinding.DataBinderMapper.getDataBinder(androidx.databinding.DataBindingComponent, android.view.View, int)"
堆栈如下:
java.lang.AbstractMethodError: abstract method "androidx.databinding.ViewDataBinding androidx.databinding.DataBinderMapper.getDataBinder(androidx.databinding.DataBindingComponent, android.view.View, int)"
at androidx.databinding.MergedDataBinderMapper.getDataBinder(MergedDataBinderMapper.java:74)
at androidx.databinding.DataBindingUtil.bind(DataBindingUtil.java:199)
at androidx.databinding.DataBindingUtil.inflate(DataBindingUtil.java:130)
at androidx.databinding.DataBindingUtil.inflate(DataBindingUtil.java:95)
at cn.sintoon.common.adapter.SinRecyclerViewBaseAdapter.onCreateViewHolder(Unknown Source:11)
at cn.sintoon.common.adapter.SinRecyclerViewBaseAdapter.onCreateViewHolder(Unknown Source:0)
at androidx.recyclerview.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6794)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5975)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924)
at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3336)
at android.view.View.measure(View.java:23454)
at androidx.constraintlayout.widget.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1227)
at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1572)
at android.view.View.measure(View.java:23454)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
at android.view.View.measure(View.java:23454)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834)
at androidx.appcompat.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:403)
at android.view.View.measure(View.java:23454)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:23454)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1565)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:726)
at android.view.View.measure(View.java:23454)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:847)
at android.view.View.measure(View.java:23454)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2954)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1753)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2041)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1636)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7946)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1092)
at android.view.Choreographer.doCallbacks(Choreographer.java:893)
at android.view.Choreographer.doFrame(Choreographer.java:812)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1078)
at android.os.Handler.handleCallback(Handler.java:907)
出现场景
封装了一个类库,向外提供一个封装好的 RecyclerAdapter,使用 DataBinding 。生成类库时开启了混淆,在使用时,抛出异常。
问题原因
将 androidx.databinding.DataBindingComponent
混淆掉了。
如何修复
修改混淆规则。不混淆这个类。
-keep class androidx.databinding.DataBindingComponent {*;}
排查过程
根据错误堆栈看,是找不到这个方法,初步怀疑就是被混淆掉了方法,然后直接使用不混淆的测试,的确没有异常了。确认是混淆的问题。
然后在 /build/outputs/mapping/ 目录下查看 mapping.txt 文件,发现果然是将这类混淆掉了。
# compiler: R8
# compiler_version: 1.4.77
# min_api: 1
androidx.databinding.DataBindingComponent -> a.a.a:
mapping.txt 这个文件提供混淆前后类、方法、类成员等的对照表。
总结
在基础类库中使用了数据绑定库要配置混淆规则。
参考 Proguard 混淆规则
Android 官方 DataBinding(四):BindingAdapter
(1)和附录 1,2,3 一样,毫无例外,先写一个数据模型 User.java:
package zhangphil.test;
import android.databinding.BaseObservable;
import android.databinding.ObservableField;
import android.databinding.ObservableInt;
/**
* Created by Phil on 2017/8/17.
*/
public class User extends BaseObservable {
public final ObservableInt id = new ObservableInt();
public final ObservableField<String> name = new ObservableField<>();
public final ObservableField<String> url = new ObservableField<>();
}
(2)写 activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="user"
type="zhangphil.test.User" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{String.valueOf(user.id)}"
android:textColor="@android:color/holo_red_light" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}"
android:textColor="@android:color/holo_red_light" />
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
app:imageUrl="@{user.url}" />
</LinearLayout>
</layout>
注意这里 ImageView 的属性配置。
(3)任意定义一个类,比如叫做 Util.java,在这个类里面的方法通过 BindingAdapter,imageUrl 和 loadImage 方法绑定:
package zhangphil.test;
import android.databinding.BindingAdapter;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
import com.bumptech.glide.request.RequestOptions;
/**
* Created by Phil on 2017/8/18.
*/
public class Util {
@BindingAdapter({"imageUrl"})
public static void loadImage(ImageView view, String u) {
RequestOptions options = new RequestOptions()
.centerCrop()
.placeholder(R.mipmap.ic_launcher_round)
.error(R.mipmap.ic_launcher)
.priority(Priority.HIGH)
.diskCacheStrategy(DiskCacheStrategy.NONE);
Glide.with(view.getContext()).applyDefaultRequestOptions(options).load(u).transition(new DrawableTransitionOptions().crossFade(1000)).into(view);
}
}
(注:Glide 是 v4.0.0)
(4)上层 MainActivity.java:
package zhangphil.test;
import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import zhangphil.test.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User();
binding.setUser(user);
user.id.set(1);
user.name.set("zhangphil");
//user.url.set("http://avatar.csdn.net/9/7/A/1_zhangphil.jpg");
user.url.set("https://www.baidu.com/img/bd_logo1.png");
}
}
代码运行结果:

在 activity_main.xml 里面的 ImageView,由于定义了 app:imageUrl="@{user.url}"
这使得 user.url 这个数据字段成为方法 imageUrl 的被观察者,BindingAdapter 两者绑定在一起,user.url 的动态变化,直接导致 imageUrl 的调用。同时,user.url 将作为一个字符串变量传递给 imageUrl 方法,在 imageUrl 方法里面,反向的将 Glide 加载的图片赋值给绑定的 ImageView。
附录:
1,《Android 官方 DataBinding 简例(一)》链接:http://blog.csdn.net/zhangphil/article/details/77322530
2,《Android 官方 DataBinding(二):动态数据更新 notifyPropertyChanged》链接:http://blog.csdn.net/zhangphil/article/details/77328688
3,《Android 官方 DataBinding(三):RecyclerView 使用 ViewDataBinding 更新数据》链接:http://blog.csdn.net/zhangphil/article/details/77367432
android.app.IStopUserCallback的实例源码
public int stopUser(int userHandle,IStopUserCallback.Stub stub) { synchronized (mPidsSelfLocked) { int N = mPidsSelfLocked.size(); while (N-- > 0) { ProcessRecord r = mPidsSelfLocked.valueAt(N); if (r.userId == userHandle) { killProcess(r.pid); } } } try { stub.userStopped(userHandle); } catch (remoteexception e) { e.printstacktrace(); } return 0; }
public int stopUser(int userHandle,IStopUserCallback.Stub stub) { synchronized (mPidsSelfLocked) { int N = mPidsSelfLocked.size(); while (N-- > 0) { ProcessRecord r = mPidsSelfLocked.valueAt(N); if (r.userId == userHandle) { killProcess(r.pid); } } } try { stub.userStopped(userHandle); } catch (remoteexception e) { e.printstacktrace(); } return 0; }
public int stopUser(int userHandle,IStopUserCallback.Stub stub) { synchronized (mPidsSelfLocked) { int N = mPidsSelfLocked.size(); while (N-- > 0) { ProcessRecord r = mPidsSelfLocked.valueAt(N); if (r.userId == userHandle) { killProcess(r.pid); } } } try { stub.userStopped(userHandle); } catch (remoteexception e) { e.printstacktrace(); } return 0; }
android.app.SharedElementCallback的实例源码
private void setupTransitions() { // grab the position that the search icon transitions in *from* // & use it to configure the return transition setEnterSharedElementCallback(new SharedElementCallback() { @Override public void onSharedElementStart( List<String> sharedElementNames,List<View> sharedElements,List<View> sharedElementSnapshots) { if (sharedElements != null && !sharedElements.isEmpty()) { View searchIcon = sharedElements.get(0); if (searchIcon.getId() != R.id.searchback) return; int centerX = (searchIcon.getLeft() + searchIcon.getRight()) / 2; CircularReveal hideResults = (CircularReveal) TransitionUtils.findTransition( (TransitionSet) getwindow().getReturnTransition(),CircularReveal.class,R.id.results_container); if (hideResults != null) { hideResults.setCenter(new Point(centerX,0)); } } } }); }
private void setupTransitions() { // grab the position that the search icon transitions in *from* // & use it to configure the return transition setEnterSharedElementCallback(new SharedElementCallback() { @Override public void onSharedElementStart( List<String> sharedElementNames,0)); } } } }); }
@TargetApi(21) private void setCallback(final int chosenPosition) { DataManager.getInstance().setPosition(chosenPosition); ((AppCompatActivity) context).setExitSharedElementCallback(new SharedElementCallback() { @Override public void onMapSharedElements(List<String> names,Map<String,View> sharedElements) { int pos = DataManager.getInstance().getPosition(); if (chosenPosition != pos && names.size() > 0) { sharedElements.put(names.get(0),contentViewCache.get(pos)); } ((AppCompatActivity) context).setExitSharedElementCallback((SharedElementCallback) null); } }); }
@TargetApi(21) private void setSharedElementCallback(final View view) { SharedElementCallback callback = new SharedElementCallback() { @Override public void onMapSharedElements(List<String> names,View> sharedElements) { names.clear(); sharedElements.clear(); names.add(view.getTransitionName()); sharedElements.put(view.getTransitionName(),view); } }; setEnterSharedElementCallback(callback); }
@Override void handleElementOnClick(final View view) { final int itemPosition = getRecyclerView().getChildAdapterPosition(view); Videoondemand item = getElements().get(itemPosition); if (activity instanceof VODActivity) { ((VODActivity) activity).startNewVOD(item); } else { Intent intent = VODActivity.createVODIntent(item,getContext()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { intent.putExtra(getContext().getString(R.string.stream_preview_url),item.getMediumPreview()); intent.putExtra(getContext().getString(R.string.stream_preview_alpha),hasVodBeenWatched(item.getVideoId()) ? VOD_WATCHED_IMAGE_ALPHA : 1.0f); final View sharedView = view.findViewById(R.id.image_stream_preview); sharedView.setTransitionName(getContext().getString(R.string.stream_preview_transition)); final ActivityOptionsCompat options = ActivityOptionsCompat. makeSceneTransitionAnimation(activity,sharedView,getContext().getString(R.string.stream_preview_transition)); activity.setExitSharedElementCallback(new SharedElementCallback() { @SuppressLint("NewApi") @Override public void onSharedElementEnd(List<String> sharedElementNames,List<View> sharedElementSnapshots) { super.onSharedElementEnd(sharedElementNames,sharedElements,sharedElementSnapshots); sharedView.animate().alpha(VOD_WATCHED_IMAGE_ALPHA).setDuration(300).start(); activity.setExitSharedElementCallback(null); } }); activity.startActivity(intent,options.toBundle()); } else { getContext().startActivity(intent); activity.overridePendingTransition(R.anim.slide_in_bottom_anim,R.anim.fade_out_semi_anim); } } }
private void setup() { String name = getIntent().getStringExtra(KEY_ID); if (name != null) { setEnterSharedElementCallback(new SharedElementCallback() { @Override public void onMapSharedElements(List<String> names,View> sharedElements) { sharedElements.put(ELEMENT_NAME,mImageView); } }); } }
@Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_rv,null); mRecyclerView = (RecyclerView) v.findViewById(R.id.recycler_view); int spacingInPixels = getResources().getDimensionPixelSize(R.dimen.spacing_card); mRecyclerView.addItemdecoration(new SpacesItemdecoration(spacingInPixels)); mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(),1)); mRecyclerView.setHasFixedSize(true); setUpList(); getActivity().setExitSharedElementCallback(new SharedElementCallback() { @Override public Parcelable onCaptureSharedElementSnapshot(View sharedElement,Matrix viewToGlobalMatrix,RectF screenBounds) { int bitmapWidth = Math.round(screenBounds.width()); int bitmapHeight = Math.round(screenBounds.height()); Bitmap bitmap = null; if (bitmapWidth > 0 && bitmapHeight > 0) { Matrix matrix = new Matrix(); matrix.set(viewToGlobalMatrix); matrix.postTranslate(-screenBounds.left,-screenBounds.top); bitmap = Bitmap.createBitmap(bitmapWidth,bitmapHeight,Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); canvas.concat(matrix); sharedElement.draw(canvas); } return bitmap; } }); return v; }
@Override public View onCreateView(LayoutInflater inflater,null); mRecyclerView = (RecyclerView) v.findViewById(R.id.recycler_view); int spacingInPixels = getResources().getDimensionPixelSize(R.dimen.spacing_card); mRecyclerView.addItemdecoration(new SpacesItemdecoration(spacingInPixels)); mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(),2)); mRecyclerView.setHasFixedSize(true); setUpList(); getActivity().setExitSharedElementCallback(new SharedElementCallback() { @Override public Parcelable onCaptureSharedElementSnapshot(View sharedElement,Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); canvas.concat(matrix); sharedElement.draw(canvas); } return bitmap; } }); return v; }
private static SharedElementCallback createCallback(SharedElementCallback21 callback) { SharedElementCallback newListener = null; if (callback != null) { newListener = new SharedElementCallbackImpl(callback); } return newListener; }
private void setupTransitions() { // grab the position that the search icon transitions in *from* // & use it to configure the return transition if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { setEnterSharedElementCallback(new SharedElementCallback() { @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onSharedElementStart( List<String> sharedElementNames,List<View> sharedElementSnapshots) { if (sharedElements != null && !sharedElements.isEmpty()) { View searchIcon = sharedElements.get(0); if (searchIcon.getId() != R.id.searchback) return; int centerX = (searchIcon.getLeft() + searchIcon.getRight()) / 2; CircularReveal hideResults = (CircularReveal) TransitionUtils.findTransition( (TransitionSet) getwindow().getReturnTransition(),R.id.results_container); if (hideResults != null) { hideResults.setCenter(new Point(centerX,0)); } } } }); // focus the search view once the transition finishes getwindow().getEnterTransition().addListener( new TransitionUtils.TransitionListenerAdapter() { @Override public void ontransitionend(Transition transition) { searchView.requestFocus(); ImeUtils.showIme(searchView); } }); } else { searchView.requestFocus(); ImeUtils.showIme(searchView); } }
public static SharedElementCallback createSharedElementReenterCallback( @NonNull Context context) { final String shottransitionName = context.getString(R.string.transition_shot); final String shotBackgroundTransitionName = context.getString(R.string.transition_shot_background); return new SharedElementCallback() { /** * We're performing a slightly unusual shared element transition i.e. from one view * (image in the grid) to two views (the image & also the background of the details * view,to produce the expand effect). After changing orientation,the transition * system seems unable to map both shared elements (only seems to map the shot,not * the background) so in this situation we manually map the background to the * same view. */ @Override public void onMapSharedElements(List<String> names,View> sharedElements) { if (sharedElements.size() != names.size()) { // Couldn't map all shared elements final View sharedShot = sharedElements.get(shottransitionName); if (sharedShot != null) { // has shot so add shot background,mapped to same view sharedElements.put(shotBackgroundTransitionName,sharedShot); } } } }; }
static void clearSharedElementsOnReturn(@NonNull final BaseActivity activity) { activity.setEnterSharedElementCallback(new SharedElementCallback() { @Override public void onMapSharedElements(final List<String> names,final Map<String,View> sharedElements) { super.onMapSharedElements(names,sharedElements); if (activity.isFinishingAfterTransition()) { names.clear(); sharedElements.clear(); } } }); }
private void initTransitions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { postponeEnterTransition(); setEnterSharedElementCallback(new SharedElementCallback() { @SuppressLint("NewApi") @Override public void onMapSharedElements(List<String> names,View> sharedElements) { super.onMapSharedElements(names,sharedElements); if (mAdapter.getRegisteredFragment(mPosition) != null) { names.clear(); sharedElements.clear(); View view = ((ImageFragment) mAdapter.getRegisteredFragment(mPosition)).mImage; names.add(view.getTransitionName()); sharedElements.put(view.getTransitionName(),view); } } }); } // mPager.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { // @SuppressLint("NewApi") // public boolean onPreDraw() { // mPager.getViewTreeObserver().removeOnPreDrawListener(this); // startPostponedEnterTransition(); // return true; // } // }); }
private void initTransitions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { setExitSharedElementCallback(new SharedElementCallback() { @SuppressLint("NewApi") @Override public void onMapSharedElements(List<String> names,View> sharedElements) { super.onMapSharedElements(names,sharedElements); if (!isReenterTransition) { return; } isReenterTransition = false; names.clear(); sharedElements.clear(); final PostFragment postFragment = (PostFragment) mAdapter.getRegisteredFragment(mPager.getCurrentItem()); final RecyclerView recyclerView = postFragment.mRecyclerView; View sharedView = ((PostimagesRecyclerViewAdapter.ViewHolder) recyclerView.findViewHolderForPosition(mImagePosition)).getimage(); names.add(sharedView.getTransitionName()); sharedElements.put(sharedView.getTransitionName(),sharedView); } }); Fade fadeExit = new Fade(); fadeExit.addTarget(R.id.text_post_title); fadeExit.addTarget(R.id.button_show_gallery); fadeExit.addTarget(R.id.recycler_post_images); fadeExit.addTarget(R.id.image_post_author); fadeExit.addTarget(R.id.bottom_shadow_post); fadeExit.addTarget(R.id.toolbar); getwindow().setExitTransition(fadeExit); } }
static SharedElementCallback createSharedElementReenterCallback( @NonNull Context context) { final String shottransitionName = context.getString(R.string.transition_shot); final String shotBackgroundTransitionName = context.getString(R.string.transition_shot_background); return new SharedElementCallback() { /** * We're performing a slightly unusual shared element transition i.e. from one view * (image in the grid) to two views (the image & also the background of the details * view,sharedShot); } } } }; }
private void setupHero() { String name = getIntent().getStringExtra(KEY_ID); mHero = null; if (name != null) { mHero = (ImageView) findViewById(getIdForKey(name)); setEnterSharedElementCallback(new SharedElementCallback() { @Override public void onMapSharedElements(List<String> names,View> sharedElements) { sharedElements.put("hero",mHero); } }); } }
private static SharedElementCallback createCallback(SharedElementCallback21 sharedelementcallback21) { SharedElementCallbackImpl sharedelementcallbackimpl = null; if (sharedelementcallback21 != null) { sharedelementcallbackimpl = new SharedElementCallbackImpl(sharedelementcallback21); } return sharedelementcallbackimpl; }
private static SharedElementCallback createCallback(SharedElementCallback21 callback) { SharedElementCallback newListener = null; if (callback != null) { newListener = new SharedElementCallbackImpl(callback); } return newListener; }
private static SharedElementCallback createCallback(SharedElementCallback21 callback) { SharedElementCallback newListener = null; if (callback != null) { newListener = new SharedElementCallbackImpl(callback); } return newListener; }
private void setupHero() { String name = getIntent().getStringExtra(KEY_ID); mHero = null; if (name != null) { mHero = (ImageView) findViewById(getIdForKey(name)); setEnterSharedElementCallback(new SharedElementCallback() { @Override public void onMapSharedElements(List<String> names,mHero); } }); } }
private static SharedElementCallback createCallback(SharedElementCallback21 callback) { if (callback != null) { return new SharedElementCallbackImpl(callback); } return null; }
@Override void handleElementOnClick(final View view) { int itemPosition = getRecyclerView().getChildAdapterPosition(view); final ChannelInfo item = getElements().get(itemPosition); final StreamerInfoViewHolder vh = (StreamerInfoViewHolder) getRecyclerView().getChildViewHolder(view); final PreviewTarget previewTarget = getTargets().get(vh.getTargetsKey()); // Create intent for opening StreamerInfo activity. Send the StreamerInfo object with // the intent,and flag it to make sure it creates a new task on the history stack final Intent intent = new Intent(getContext(),ChannelActivity.class); intent.putExtra(getContext().getResources().getString(R.string.channel_info_intent_object),item); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { View sharedView = view.findViewById(R.id.profilelogoImageView); sharedView.setTransitionName(getContext().getString(R.string.streamerInfo_transition)); final ActivityOptionsCompat options = ActivityOptionsCompat. makeSceneTransitionAnimation(activity,getContext().getString(R.string.streamerInfo_transition)); activity.setExitSharedElementCallback(new SharedElementCallback() { @SuppressLint("NewApi") @Override public void onSharedElementEnd(List<String> sharedElementNames,List<View> sharedElementSnapshots) { super.onSharedElementEnd(sharedElementNames,sharedElementSnapshots); if (!sharedElements.isEmpty() && sharedElements.get(0) != null && previewTarget != null) { View element = sharedElements.get(0); Animation anim = new RoundImageAnimation(element.getWidth()/2,(ImageView) element,previewTarget.getPreview()); anim.setDuration(200); anim.setInterpolator(new DecelerateInterpolator()); view.startAnimation(anim); } activity.setExitSharedElementCallback(null); } }); activity.startActivity(intent,options.toBundle()); } else { getContext().startActivity(intent); if(activity != null) { activity.overridePendingTransition(R.anim.slide_in_right_anim,R.anim.fade_out_semi_anim); } } }
private static SharedElementCallback createCallback(SharedElementCallback21 callback) { if (callback != null) { return new SharedElementCallbackImpl(callback); } return null; }
public static SharedElementCallback getCallback(RoundingImageTransitionValues values) { return new BaseSharedElementCallback(values); }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AppCompatDelegate.setCompatVectorFromresourcesEnabled(true); final boolean useNavDrawer = Config.get().navDrawerModeEnabled(); if (useNavDrawer) { setContentView(R.layout.activity_main_drawer); } else { setContentView(R.layout.activity_main); } ButterKnife.bind(this); setSupportActionBar(mToolbar); setupPages(); setupPager(); if (useNavDrawer) { setupNavDrawer(); } else { setupTabs(); } // Restore last selected page,tab/nav-drawer-item if (Config.get().persistSelectedPage()) { int lastPage = PreferenceManager.getDefaultSharedPreferences(MainActivity.this) .getInt("last_selected_page",0); if (lastPage > mPager.getAdapter().getCount() - 1) { lastPage = 0; } mPager.setCurrentItem(lastPage); if (mNavView != null) { invalidateNavViewSelection(lastPage); } } dispatchFragmentUpdateTitle(!useNavDrawer); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { setExitSharedElementCallback( new SharedElementCallback() { @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public void onMapSharedElements(List<String> names,View> sharedElements) { if (isReentering) { WallpapersFragment frag = (WallpapersFragment) getFragmentManager().findFragmentByTag("page:" + mPager.getCurrentItem()); final RecyclerView recyclerView = frag.getRecyclerView(); View item = recyclerView.findViewWithTag("view_" + reenterPos); View image = item.findViewById(R.id.image); names.clear(); names.add(image.getTransitionName()); sharedElements.clear(); sharedElements.put(image.getTransitionName(),image); isReentering = false; } } }); } processIntent(getIntent()); }
@NonNull private DesignerNewsstoryHolder createDesignerNewsstoryHolder(ViewGroup parent) { final DesignerNewsstoryHolder holder = new DesignerNewsstoryHolder(layoutInflater.inflate( R.layout.designer_news_story_item,parent,false),pocketIsInstalled); holder.itemView.setonClickListener( new View.OnClickListener() { @Override public void onClick(View v) { final Story story = (Story) getItem(holder.getAdapterPosition()); CustomtabactivityHelper.openCustomTab(host,DesignerNewsstory.getCustomTabIntent(host,story,null).build(),Uri.parse(story.url)); } } ); holder.comments.setonClickListener(new View.OnClickListener() { @Override public void onClick(View commentsView) { final Intent intent = new Intent(); intent.setClass(host,DesignerNewsstory.class); intent.putExtra(DesignerNewsstory.EXTRA_STORY,(Story) getItem(holder.getAdapterPosition())); ReflowText.addExtras(intent,new ReflowText.ReflowableTextView(holder.title)); setGridItemContentTransitions(holder.itemView); // on return,fade the pocket & comments buttons in host.setExitSharedElementCallback(new SharedElementCallback() { @Override public void onSharedElementStart(List<String> sharedElementNames,List<View> sharedElements,List<View> sharedElementSnapshots) { host.setExitSharedElementCallback(null); notifyItemChanged(holder.getAdapterPosition(),HomeGridItemAnimator.STORY_COMMENTS_RETURN); } }); final ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(host,Pair.create((View) holder.title,host.getString(R.string.transition_story_title)),Pair.create(holder.itemView,host.getString(R.string.transition_story_title_background)),host.getString(R.string.transition_story_background))); host.startActivity(intent,options.toBundle()); } }); if (pocketIsInstalled) { holder.pocket.setimageAlpha(178); // grumble... no xml setter,grumble... holder.pocket.setonClickListener(new View.OnClickListener() { @Override public void onClick(final View view) { PocketUtils.addToPocket(host,((Story) getItem(holder.getAdapterPosition())).url); // notify changed with a payload asking RV to run the anim notifyItemChanged(holder.getAdapterPosition(),HomeGridItemAnimator.ADD_TO_POCKET); } }); } return holder; }
@NonNull private DesignerNewsstoryHolder createDesignerNewsstoryHolder(ViewGroup parent) { final DesignerNewsstoryHolder holder = new DesignerNewsstoryHolder(layoutInflater.inflate( R.layout.designer_news_story_item,pocketIsInstalled); holder.itemView.setonClickListener( v -> { final Story story = (Story) getItem(holder.getAdapterPosition()); CustomtabactivityHelper.openCustomTab(host,Uri.parse(story.url)); } ); holder.comments.setonClickListener(commentsView -> { final Intent intent = new Intent(); intent.setClass(host,DesignerNewsstory.class); intent.putExtra(DesignerNewsstory.EXTRA_STORY,(Story) getItem(holder.getAdapterPosition())); ReflowText.addExtras(intent,new ReflowText.ReflowableTextView(holder.title)); setGridItemContentTransitions(holder.itemView); // on return,fade the pocket & comments buttons in host.setExitSharedElementCallback(new SharedElementCallback() { @Override public void onSharedElementStart(List<String> sharedElementNames,List<View> sharedElements,List<View> sharedElementSnapshots) { host.setExitSharedElementCallback(null); notifyItemChanged(holder.getAdapterPosition(),HomeGridItemAnimator.STORY_COMMENTS_RETURN); } }); final ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(host,host.getString(R.string.transition_story_background))); host.startActivity(intent,options.toBundle()); }); if (pocketIsInstalled) { holder.pocket.setimageAlpha(178); // grumble... no xml setter,grumble... holder.pocket.setonClickListener(view -> { PocketUtils.addToPocket(host,((Story) getItem(holder.getAdapterPosition())).url); // notify changed with a payload asking RV to run the anim notifyItemChanged(holder.getAdapterPosition(),HomeGridItemAnimator.ADD_TO_POCKET); }); } return holder; }
public void setEnterSharedElementCallback(SharedElementCallback callback) { mHostActivity.setEnterSharedElementCallback(callback); }
public void setExitSharedElementCallback(SharedElementCallback callback) { mHostActivity.setExitSharedElementCallback(callback); }
public void setEnterSharedElementCallback(SharedElementCallback callback) { mHostActivity.setEnterSharedElementCallback(callback); }
public void setExitSharedElementCallback(SharedElementCallback callback) { mHostActivity.setExitSharedElementCallback(callback); }
public void setEnterSharedElementCallback(SharedElementCallback callback) { mHostActivity.setEnterSharedElementCallback(callback); }
public void setExitSharedElementCallback(SharedElementCallback callback) { mHostActivity.setExitSharedElementCallback(callback); }
public void setEnterSharedElementCallback(SharedElementCallback callback) { mHostActivity.setEnterSharedElementCallback(callback); }
public void setExitSharedElementCallback(SharedElementCallback callback) { mHostActivity.setExitSharedElementCallback(callback); }
public void setEnterSharedElementCallback(SharedElementCallback callback) { mHostActivity.setEnterSharedElementCallback(callback); }
public void setExitSharedElementCallback(SharedElementCallback callback) { mHostActivity.setExitSharedElementCallback(callback); }
public void setEnterSharedElementCallback(SharedElementCallback callback) { mHostActivity.setEnterSharedElementCallback(callback); }
public void setExitSharedElementCallback(SharedElementCallback callback) { mHostActivity.setExitSharedElementCallback(callback); }
public void setEnterSharedElementCallback(SharedElementCallback callback) { mHostActivity.setEnterSharedElementCallback(callback); }
关于android.databinding.OnRebindCallback的实例源码和android databinding原理的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于AbstractMethodError: abstract method "androidx.databinding.ViewDataBinding androidx.databind...、Android 官方 DataBinding(四):BindingAdapter、android.app.IStopUserCallback的实例源码、android.app.SharedElementCallback的实例源码的相关知识,请在本站寻找。
本文标签: