1

Ich muss eine benutzerdefinierte Lockscreen-Anwendung beenden. Es gibt eine funktionierende Version ohne ViewPager (nur eine Seite).ViewPager kann nicht über eine Ansicht eingestellt werden

Ich konnte das Fenster im Vollbildmodus einstellen, das die Benutzer nicht schließen konnten, indem ich die Root-Ansicht direkt zum winManager hinzufügte.

Ich habe eine andere Version mit einem ViewPager (2 Folien). Es funktioniert in einem normalen Anwendungsfall, aber wenn ich versuche, es in einer Stammansicht (wrapperView) zu erstellen, die ich dem winManager hinzufüge (wie in der anderen Version), stürzt die Anwendung ab. Der Unterschied liegt in der onCreate-Methode.

ScreenLock2.onCreate:

... 

/*Working version*/ 

    setContentView(R.layout.screen_lock_fragment) 
    ViewPager mPager = (ViewPager) findViewById(R.id.pager); 

/*Working version end*/ 


/*Not working version*/ 

    wrapperView = new RelativeLayout(getBaseContext()); 
    View.inflate(this, R.layout.screen_lock_fragment, wrapperView); 
    WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams(
        WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, 
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
          WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | 
          WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); 
    winManager = (WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE); 
    winManager.addView(wrapperView, localLayoutParams); 

    ViewPager mPager = (ViewPager) wrapperView.findViewById(R.id.pager); 

/*Not working version end*/ 

ScreenSlidePagerAdapter mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); 
mPager.setAdapter(mPagerAdapter); 

... 

ScreenLock2.ScreenSlidePagerAdapter Klasse:

public class ScreenSlidePagerAdapter extends FragmentPagerAdapter { 
    public ScreenSlidePagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return ScreenLockFragment.newInstance(position); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     return super.instantiateItem(mPager, position); 
    } 

    public int getItemPosition(Object object) { 
     return POSITION_NONE; 
    } 

    @Override 
    public int getCount() { 
     return 2; 
    } 
} 

ScreenLockFragment:

public class ScreenLockFragment extends Fragment { 
    int page; 

    public static ScreenLockFragment newInstance(int page) { 
     ScreenLockFragment fragmentFirst = new ScreenLockFragment(); 
     Bundle args = new Bundle(); 
     args.putInt("pageInt", page); 
     fragmentFirst.setArguments(args); 
     return fragmentFirst; 
    } 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     page = getArguments().getInt("pageInt", 1); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     ScreenLock2 screenLock2 = (ScreenLock2) getActivity(); 
     container = screenLock2.mPager; 
     switch (page) { 
      case 0: 
       rootView = (ViewGroup) inflater.inflate(R.layout.screen_lock, container, false); 
       break; 
      case 1: 
       rootView = (ViewGroup) inflater.inflate(R.layout.screen_lock_main, container, false); 
       break; 
     } 
     return rootView; 
    } 
} 

Die Fehlermeldung ist die folgende:

java.lang.IllegalArgumentException: No view found for id 0x7f0e00fc (com.dynauth.login:id/pager) for fragment ScreenLockFragment{172ec3e #0 id=0x7f0e00fc android:switcher:2131624188:1} 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1059) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) 
     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) 

Antwort

1

Ich fand die Lösung. Ich ersetzte den FragmentPagerAdapter durch einen Standard-PagerAdapter.