GVKun编程网logo

android.databinding.OnRebindCallback的实例源码(android databinding原理)

32

如果您想了解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原理)

android.databinding.OnRebindCallback的实例源码(android databinding原理)

项目:Android-Code-Demos    文件:AnimationActivity.java   
@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());
}
项目:DataBindingSample    文件:AnimationActivity.java   
@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

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

Android 官方 DataBinding(四):BindingAdapter

Android 官方 DataBinding(四):BindingAdapter

简单初识 BindingAdapter,写一个简单的例子,说明 BindingAdapter 的工作机制。简单期间,可以粗浅认为 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的实例源码

android.app.IStopUserCallback的实例源码

项目:VirtualHook    文件:VActivityManagerService.java   
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;
}
项目:TPlayer    文件:VActivityManagerService.java   
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;
}
项目:container    文件:VActivityManagerService.java   
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的实例源码

android.app.SharedElementCallback的实例源码

项目:android-proguards    文件:SearchActivity.java   
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));
                }
            }
        }
    });
}
项目:plaid    文件:SearchActivity.java   
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));
                }
            }
        }
    });
}
项目:tumbviewer    文件:PhotoPostVH.java   
@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);
        }
    });
}
项目:tumbviewer    文件:ImageViewerActivity.java   
@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);
}
项目:Pocket-Plays-for-Twitch    文件:VODAdapter.java   
@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);
        }
    }
}
项目:AndroidCollection    文件:ActivityTransition.java   
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);
            }
        });
    }
}
项目:AndroidOpen    文件:RecentFragment.java   
@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;
}
项目:AndroidOpen    文件:AllFragment.java   
@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;
}
项目:permissionsModule    文件:ActivityCompat21.java   
private static SharedElementCallback createCallback(SharedElementCallback21 callback) {
    SharedElementCallback newListener = null;
    if (callback != null) {
        newListener = new SharedElementCallbackImpl(callback);
    }
    return newListener;
}
项目:S1-Next    文件:SearchActivity.java   
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);
    }
}
项目:android-proguards    文件:FeedAdapter.java   
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);
                }
            }
        }
    };
}
项目:PainlessMusicPlayer    文件:TransitionUtils.java   
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();
            }
        }
    });
}
项目:tuchong-daily-android    文件:ImagePagerActivity.java   
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;
//          }
//      });
    }
项目:tuchong-daily-android    文件:MainActivity.java   
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);
    }

}
项目:plaid    文件:FeedAdapter.java   
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);
                }
            }
        }
    };
}
项目:ApkLauncher    文件:ActivityTransition.java   
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);
            }
        });
    }
}
项目:MyCTFWriteUps    文件:ActivityCompat21.java   
private static SharedElementCallback createCallback(SharedElementCallback21 sharedelementcallback21)
{
    SharedElementCallbackImpl sharedelementcallbackimpl = null;
    if (sharedelementcallback21 != null)
    {
        sharedelementcallbackimpl = new SharedElementCallbackImpl(sharedelementcallback21);
    }
    return sharedelementcallbackimpl;
}
项目:adt-leanback-support    文件:ActivityCompat21.java   
private static SharedElementCallback createCallback(SharedElementCallback21 callback) {
    SharedElementCallback newListener = null;
    if (callback != null) {
        newListener = new SharedElementCallbackImpl(callback);
    }
    return newListener;
}
项目:IntranetEpitechV2    文件:ActivityCompat21.java   
private static SharedElementCallback createCallback(SharedElementCallback21 callback) {
    SharedElementCallback newListener = null;
    if (callback != null) {
        newListener = new SharedElementCallbackImpl(callback);
    }
    return newListener;
}
项目:Felix-on-android    文件:ActivityTransition.java   
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);
            }
        });
    }
}
项目:letv    文件:ActivityCompat21.java   
private static SharedElementCallback createCallback(SharedElementCallback21 callback) {
    if (callback != null) {
        return new SharedElementCallbackImpl(callback);
    }
    return null;
}
项目:Pocket-Plays-for-Twitch    文件:ChannelsAdapter.java   
@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);
        }
    }
}
项目:boohee_v5.6    文件:ActivityCompat21.java   
private static SharedElementCallback createCallback(SharedElementCallback21 callback) {
    if (callback != null) {
        return new SharedElementCallbackImpl(callback);
    }
    return null;
}
项目:OmegaRoundingImageView    文件:RoundingImageTransitionUtil.java   
public static SharedElementCallback getCallback(RoundingImageTransitionValues values) {
    return new BaseSharedElementCallback(values);
}
项目:polar-dashboard    文件:MainActivity.java   
@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());
}
项目:android-proguards    文件:FeedAdapter.java   
@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;
}
项目:plaid    文件:FeedAdapter.java   
@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;
}
项目:ApkLauncher    文件:Target_Activity.java   
public void setEnterSharedElementCallback(SharedElementCallback callback) {
    mHostActivity.setEnterSharedElementCallback(callback);
}
项目:ApkLauncher    文件:Target_Activity.java   
public void setExitSharedElementCallback(SharedElementCallback callback) {
    mHostActivity.setExitSharedElementCallback(callback);
}
项目:ApkLauncher    文件:Target_ActivityGroup.java   
public void setEnterSharedElementCallback(SharedElementCallback callback) {
    mHostActivity.setEnterSharedElementCallback(callback);
}
项目:ApkLauncher    文件:Target_ActivityGroup.java   
public void setExitSharedElementCallback(SharedElementCallback callback) {
    mHostActivity.setExitSharedElementCallback(callback);
}
项目:ApkLauncher    文件:Target_tabactivity.java   
public void setEnterSharedElementCallback(SharedElementCallback callback) {
    mHostActivity.setEnterSharedElementCallback(callback);
}
项目:ApkLauncher    文件:Target_tabactivity.java   
public void setExitSharedElementCallback(SharedElementCallback callback) {
    mHostActivity.setExitSharedElementCallback(callback);
}
项目:ApkLauncher    文件:Target_ListActivity.java   
public void setEnterSharedElementCallback(SharedElementCallback callback) {
    mHostActivity.setEnterSharedElementCallback(callback);
}
项目:ApkLauncher    文件:Target_ListActivity.java   
public void setExitSharedElementCallback(SharedElementCallback callback) {
    mHostActivity.setExitSharedElementCallback(callback);
}
项目:ApkLauncher    文件:Target_FragmentActivity.java   
public void setEnterSharedElementCallback(SharedElementCallback callback) {
    mHostActivity.setEnterSharedElementCallback(callback);
}
项目:ApkLauncher    文件:Target_FragmentActivity.java   
public void setExitSharedElementCallback(SharedElementCallback callback) {
    mHostActivity.setExitSharedElementCallback(callback);
}
项目:ApkLauncher    文件:Target_PreferenceActivity.java   
public void setEnterSharedElementCallback(SharedElementCallback callback) {
    mHostActivity.setEnterSharedElementCallback(callback);
}
项目:ApkLauncher    文件:Target_PreferenceActivity.java   
public void setExitSharedElementCallback(SharedElementCallback callback) {
    mHostActivity.setExitSharedElementCallback(callback);
}
项目:ApkLauncher    文件:Target_ActionBaractivity.java   
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的实例源码的相关知识,请在本站寻找。

本文标签: