Search code examples
androidandroid-viewpagerandroid-adapterandroid-windowmanager

No view found for id 0x7f0f0085 (lockscreen_viewpager) for fragment LockscreenDefaultFragment{b73c8bb #0 id=0x7f0f0085}


Whenever i tried to add in the activity( include viewpager) into windowManager, it will crash and the above error appeared. I tried the solution like setId for viewpager and create custom viewpager to lazy call the setAdapter but unfortunately it still crash. From what i suspect is the adapter that cause this problem when setContentview is not called but i have no idea on how and why. Any help would be appreciated.

EDIT 1: If we didn't use setContentView, then how can the viewpager adapter find the view inside it?

LockScreenActivity

  @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    lockView = View.inflate(this, R.layout.activity_lockscreen, null);

    mViewPager = (ViewPager) lockView.findViewById(R.id.lockscreen_viewpager);
    mPageAdapter = new LockscreenAdapter(getSupportFragmentManager());
    mViewPager.setPageTransformer(true, new ZoomOutPageTransformer(mViewPager));
    mViewPager.setAdapter(mPageAdapter);
    mViewPager.setCurrentItem(1);
    mViewPager.addOnPageChangeListener(this);

    mLockUtil = LockLayer.getInstance(this);
    mLockUtil.setLockView(lockView);
    mLockUtil.lock();


    ImageView wallpaper = (ImageView) lockView.findViewById(R.id.activity_lockscreen_wallpaper);
    final WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
    BitmapDrawable wallpaperDrawable = ((BitmapDrawable) wallpaperManager.getDrawable());
    if (wallpaperDrawable != null) {
        try {
            wallpaper.setImageBitmap(wallpaperDrawable.getBitmap());
        } catch (IOError ignored) {
        }
    }
}

LockscreenAdapter extends FragmentStatePagerAdapter

 private List<Fragment> mItems = new ArrayList<>();

public LockscreenAdapter(FragmentManager fm) {
    super(fm);
    populate();
}

private void populate() {
    mItems.clear();
    mItems.add(LockscreenDefaultFragment.newInstance(LockscreenFragment.PAGE_DEFAULT));
    mItems.add(LockscreenFragment.newInstance(LockscreenFragment.PAGE_LOCK));
    mItems.add(LockscreenDefaultFragment.newInstance(LockscreenFragment.PAGE_DEFAULT));
}

@Override
public Fragment getItem(int position) {
    return mItems.get(position);
}

@Override
public int getCount() {
    return mItems.size();
}

LockLayer

public static synchronized LockLayer getInstance(Activity act){
    if(mLockLayer == null){
        mLockLayer = new LockLayer(act);
    }
    return mLockLayer;
}

private LockLayer(Activity act) {
    mActivty = act;
    init();
}

private void init(){
    isLocked = false;
    mWindowManager = mActivty.getWindowManager();
    mLockViewLayoutParams = new LayoutParams();
    mLockViewLayoutParams.width = LayoutParams.MATCH_PARENT;
    mLockViewLayoutParams.height = LayoutParams.MATCH_PARENT;
    mLockViewLayoutParams.type = LayoutParams.TYPE_SYSTEM_ERROR;
}
public synchronized void lock() {
    if(mLockView!=null && !isLocked){
        mWindowManager.addView(mLockView, mLockViewLayoutParams);
    }
    isLocked = true;
}
public synchronized void unlock() {
    if(mWindowManager!=null && isLocked){
        mWindowManager.removeView(mLockView);
    }
    isLocked = false;
}
public synchronized void setLockView(View v){
    mLockView = v;
}

Solution

  • After tried many ways and testing, to insert viewpager into windowmanager, the only way that work for me is to change the FragmentStatePagerAdapter into PagerAdapter, whenever using the FragmentStatePagerAdapter, it seems will always search and get the fragment from root view which eventually will cause the crash.