アプリケーションで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
が以前の呼び出しを終了するまで呼び出せないと仮定しています。
ViewPager
をFragmentActivity
とsetCurrentItem(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;
}
}
ありがとう(最初の二つの断片コードを提供する私のいかなる関連性が)
なぜこのSignUpActivity.pager.setCurrentItem(0)を呼び出していますか? 3番目の断片に? –
@ ZeeshanShabbir特定の条件を満たしていない場合、ユーザーは以前のビューに戻ってナビゲートされます。私はちょうど前の試みでsetCurrentItem()が動作しなかった理由を理解しようとしています – reyyez
parentClassで操作を行うためにコールバックまたはsetTargetFragmentを作成できます。また、setUserVisibleHintはonCreateViewの前に呼び出します。 onCreateViewはonActivity Createの前にも呼び出すことができます。アクティビティがまだ作成されていない可能性があります。だからonViewCreatedでそのメソッドを呼び出してみてください – Nepster