0

アプリケーションでFragmentStatePagerAdapterと付随するViewPagerが使用されています。私は3つの断片を持っています。の結果、上記の行をjava.lang.IllegalStateException:executePendingTransactionsへの再帰的エントリ、setUserVisibleHintで呼び出されたときにエラーが発生しない

SignUpActivity.pager.setCurrentItem(0)); 

:私は、第三の断片のonCreateView()で、FragmentActivityクラス(SignUpActivity)で定義されているViewPagerを呼び出して、次の行を経て、最初のページにViewPagers現在の項目を設定しようとしていました次のエラーが:私はsetUserVisibleHint()方法では、上記と同様のsetCurrentItem(0)ラインを実行したときに意図したとおり

java.lang.IllegalStateException: Recursive entry to executePendingTransactions 

しかし、実験を通して、ViewPagerは、0番目の断片を示しました。 ViewPagerが最初のケースで失敗したのはなぜですか?私はViewPagerが以前の呼び出しを終了するまで呼び出せないと仮定しています。

ViewPagerFragmentActivitysetCurrentItem(x)から希望のビューに呼び出すメカニズムをどのように作成できますか?

SignUpActivityコード(FragmentActivity):

public class SignUpActivity extends FragmentActivity { 
CustFSPA adapter; 
static ViewPager pager; 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.sign_up);/

    adapter = new CustFSPA(getSupportFragmentManager()); 
    pager = (ViewPager) findViewById(R.id.signUpPager); 
    pager.setAdapter(adapter); 
} 

public static class CustFSPA extends FragmentStatePagerAdapter{ 
    int numberFragments = 3; 
    static FragmentManager fragmentManager; 

    public CustFSPA(FragmentManager manager){ 
     super(manager); 
     fragmentManager = manager; 
    } 

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

    @Override 
    public Fragment getItem(int position){ 
     switch(position){ 
      case 0: 
       // will display SignUpFragmentFirst 
       return SignUpFragmentFirst.calledFromPager(); 
      case 1: 
       return SignUpFragmentSecond.calledFromPager(); 
      default: 
       return SignUpFragmentThird.calledFromPager(); 
     } 
    }  
} 

第三断片コード:

public class SignUpFragmentThird extends Fragment { 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    System.out.println("onCreate third"); 

} 

@Override 
public void onStart(){ 
    super.onStart(); 
    System.out.println("Starting 3rd"); 
} 

@Override 
public void onPause(){ 
    super.onPause(); 
    System.out.println("Paused 3rd"); 
} 

@Override 
public void onResume(){ 
    super.onResume(); 
    System.out.println("Resumed 3rd"); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
    System.out.println("onCreateView third"); 
    ViewPager pager = (ViewPager) getActivity().findViewById(R.id.signUpPager); 

    SignUpActivity.pager.setCurrentItem(0); <======= THIS WAS THE FIRST ATTEMPT WHICH FAILED AND RESULTED IN THE ERROR 

    View view = inflater.inflate(R.layout.sign_up_fragment_third, container, false); 
    return view; 
} 

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 
    if (isVisibleToUser) { 
     System.out.println("THIRD is visible to the user"); 
     SignUpActivity.pager.setCurrentItem(1); <========= SECOND ATTEMPT WHICH WOKRED SUCCESSFULLY 
    } else { 
     System.out.println("THIRD is not visible to the user"); 
    } 
} 

static SignUpFragmentThird calledFromPager(){ 
    System.out.println("third case def " + SignUpActivity.pager.getCurrentItem()); 
    System.out.println("calledFromPager third"); 
    SignUpFragmentThird fragment = new SignUpFragmentThird(); 
    return fragment; 
} 
} 

ありがとう(最初の二つの断片コードを提供する私のいかなる関連性が)

+0

なぜこのSignUpActivity.pager.setCurrentItem(0)を呼び出していますか? 3番目の断片に? –

+0

@ ZeeshanShabbir特定の条件を満たしていない場合、ユーザーは以前のビューに戻ってナビゲートされます。私はちょうど前の試みでsetCurrentItem()が動作しなかった理由を理解しようとしています – reyyez

+0

parentClassで操作を行うためにコールバックまたはsetTargetFragmentを作成できます。また、setUserVisibleHintはonCreateViewの前に呼び出します。 onCreateViewはonActivity Createの前にも呼び出すことができます。アクティビティがまだ作成されていない可能性があります。だからonViewCreatedでそのメソッドを呼び出してみてください – Nepster

答えて

0

あなたが設定することはできませんviewPagerを呼び出します。このリスナーは、ビューページのページをトラッキングします。親アクティビティでそれを実装する必要があります。

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
    public void onPageScrollStateChanged(int state) { 

    } 

    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

    } 

    public void onPageSelected(int position) { 
     Log.i("TAG", "position: " + position); 
     //Here you can change the position of the viewPager. 
     //you have three fragnment so when the position would be positon=2 then you can set viewPager to any view 
     switch(position) 
     case 2: 
      pager.setCurrentItem(0)); 
     break; 
    } 
}); 

希望します。

関連する問題