找不到片段 LockscreenDefaultFragment {b73c8bb #0 id=0x7f0f0085} 的 id 0x7f0f0085 (lockscreen_viewpager) 的视图

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

每当我尝试将 activity(包括 viewpager)添加到 windowManager 中时,它就会崩溃并出现上述错误。我尝试了 viewpager 的 setId 之类的解决方案,并创建了自定义 viewpager 以延迟调用 setAdapter,但不幸的是它仍然崩溃。我怀疑是在未调用 setContentview 时导致此问题的适配器,但我不知道如何以及为什么。任何帮助,将不胜感激。

编辑 1:如果我们不使用 setContentView,那么 viewpager 适配器如何找到其中的视图?

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 扩展了 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();
}

锁定图层

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;
}

在尝试了很多方法和测试之后,将viewpager插入到windowmanager中,对我来说唯一可行的方法是将FragmentStatePagerAdapter更改为PagerAdapter,无论何时使用FragmentStatePagerAdapter,似乎总是会从根视图中搜索并获取片段最终会导致崩溃。