1

私のAndroidアプリケーションでは、ViewPagerと5個のフラグメントがあります。以前はviewPager.setCurrentItem()を使用してナビゲートしましたが、ナビゲーションアニメーションの要件が変更されました。以前のフラグメントが呼び出されたときの例では、戻る(左から右へのアニメーション)を表示せず、代わりに次のフラグメント(右から左へのアニメーション)への移動をユーザーに示します。例えば、同じデータを何度も挿入しなければならない場合、新しいフラグメントを作成する代わりに、作成した既存のフラグメントを再利用しました。つまり、viewPager.setCurrentItem()がフラグメントを呼び出している場合(例:we今は20番目の断片であり、10番目の断片と呼んでいます)、それは戻って左から右のアニメーションを示します。アンドロイド:「onCreatedView」は、「setUserVisibleHint」が呼び出されないときに毎回呼びます。

ここではviewPager.setCurrentItem()メソッドを使用してナビゲートしていません。代わりにFragmentTransactionを使用しています。しかし、ViewPagerからフラグメントを削除しても、最小限の作業でこれを完了することはできませんでした。(この要件が出現した時点でプロジェクトが終了しました)

FragmentTransactionを使用すると、今すぐ新しい問題が発生します。私たちが戻ってきたら、いつも呼ばれているフレグネのonCreateView!これはviewPager.setCurrentItem()を使用しているときには発生しませんでした。一度だけ実行する必要があるコードの多くは、このonCreateViewにあります。

もう1つの問題は、最初のフラグメントでのみ呼び出されるsetUserVisibleHint()で、これは最初の実行時にも発生します。このメソッドには、fragmnetが表示されるたびに実行されるべきすべてのコードがあります。

以下は、私たちの問題を示すコード例です。

MainActivity.java

public class MainActivity extends FragmentActivity { 

    private ViewPager viewPager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     viewPager=(ViewPager)findViewById(R.id.viewPager); 
     viewPager.setAdapter(new MyPagerAdapter2(getSupportFragmentManager())); 
     viewPager.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (viewPager.getCurrentItem() == 0) { 
        return true; 
       } 

       if (viewPager.getCurrentItem() == 1) { 
        return true; 
       } 

       if (viewPager.getCurrentItem() == 2) { 
        return true; 
       } 

       if (viewPager.getCurrentItem() == 3) { 
        return true; 
       } 

       if (viewPager.getCurrentItem() == 4) { 
        return true; 
       } 

       return false; 
      } 
     }); 



    } 

    private class MyPagerAdapter2 extends FragmentPagerAdapter { 

     public MyPagerAdapter2(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int pos) { 
      switch(pos) { 

       case 0: return FirstFragment1.newInstance("FirstFragment_1"); 
       case 1: return SecondFragment1.newInstance("SecondFragment_1"); 
       case 2: return ThirdFragment1.newInstance("ThirdFragment_1"); 
       case 3: return FourthFragment1.newInstance("FourthFragment_1"); 
       case 4: return FifthFragment1.newInstance("FifthFragment_1"); 
       default: return FirstFragment1.newInstance("DefaultFragment_1"); 
      } 
     } 

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

    public void setCurrentItem(int which) { 
     if(viewPager != null && which >= 0 && which <= 4) { 
      viewPager.setCurrentItem(which); 
     } 
    } 
} 

FirstFragment1.java

public class FirstFragment1 extends Fragment { 

    TextView textView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.first_frag_1, container, false); 

     TextView tv = (TextView) v.findViewById(R.id.tvFragFirst); 
     tv.setText("FRAGMENT 01"); 

     textView=(TextView)v.findViewById(R.id.textView1); 
     textView.setText("Fragment Name : - 01"); 

     Log.d("FRAGMENT_01", "ON_CREATE"); 

     Button button1 = (Button) v.findViewById(R.id.nextButton); 
     button1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (getActivity() != null) { 

        FragmentManager fragmentManager=getFragmentManager(); 
        FragmentTransaction transaction = fragmentManager.beginTransaction(); 
        transaction.setCustomAnimations(R.anim.from_right, R.anim.to_left); 
        transaction.replace(R.id.firstFragment, new SecondFragment1()); 
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
        transaction.addToBackStack(null); 
        transaction.commit(); 
       } 
      } 
     }); 

     return v; 
    } 

    public static FirstFragment1 newInstance(String text) { 

     FirstFragment1 f = new FirstFragment1(); 
     Bundle b = new Bundle(); 
     b.putString("msg", text); 

     f.setArguments(b); 

     return f; 
    } 

    @Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 
     if (isVisibleToUser) { 
      Activity a = getActivity(); 
      if (a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); 

     // textView.setText("Fragment Name : - 01"); 
      Log.d("FRAGMENT_01", "VISIBLE_HINT"); 

     } 
    } 

} 

SecondFragment1.java

public class SecondFragment1 extends Fragment { 

    TextView textView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.second_frag_1, container, false); 

     TextView tv = (TextView) v.findViewById(R.id.tvFragSecond); 
     tv.setText("FRAGMENT 03"); 

     textView=(TextView)v.findViewById(R.id.textView2); 
     textView.setText("Fragment Name : - 02"); 

     Log.d("FRAGMENT_02", "ON_CREATE"); 

     Button button=(Button)v.findViewById(R.id.printButton); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       if(getActivity() != null) { 

        FragmentManager fragmentManager=getFragmentManager(); 
        FragmentTransaction transaction = fragmentManager.beginTransaction(); 
        transaction.setCustomAnimations(R.anim.from_right, R.anim.to_left); 
        transaction.replace(R.id.secondFrag, new FirstFragment1()); 
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
        transaction.addToBackStack(null); 
        transaction.commit(); 
       } 

      } 
     }); 

     Button button1=(Button)v.findViewById(R.id.nextButton); 
     button1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (getActivity() != null) { 

        FragmentManager fragmentManager=getFragmentManager(); 
        FragmentTransaction transaction = fragmentManager.beginTransaction(); 
        transaction.setCustomAnimations(R.anim.from_right, R.anim.to_left); 
        transaction.replace(R.id.secondFrag, new ThirdFragment1()); 
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
        transaction.addToBackStack(null); 
        transaction.commit(); 
       } 
      } 
     }); 

     return v; 
    } 

    public static SecondFragment1 newInstance(String text) { 

     SecondFragment1 f = new SecondFragment1(); 
     Bundle b = new Bundle(); 
     b.putString("msg", text); 

     f.setArguments(b); 

     return f; 
    } 

    @Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 
     if(isVisibleToUser) { 
      Activity a = getActivity(); 
      if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); 

      Log.d("FRAGMENT_02","VISIBLE_HINT"); 


     } 
    } 

} 

として私たちのコードでは、以下でフラグメント間を移動するために使用しています。 (コード下の2番目に最初のfragmnetからのナビゲートを示す)

FragmentManager fragmentManager=getFragmentManager(); 
        FragmentTransaction transaction = fragmentManager.beginTransaction(); 
        transaction.setCustomAnimations(R.anim.from_right, R.anim.to_left); 
        transaction.replace(R.id.firstFragment, new SecondFragment1()); 
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
        transaction.addToBackStack(null); 
        transaction.commit(); 

は、我々のコードを見てみると、私たちはどのように我々はonCreateViewは一度だけ呼び出され、setUserVisibleHintが毎回呼ばれていることを確認することができ、同様ViewPagerを追加した検討フラグメントが表示されますか?あなたが望むすべてのコードの

答えて

0

入れはのonCreate()したい方法とコードがonCreateView()メソッドに毎回呼ばれるべきで毎回呼び出されるべきではありません。

+0

のonCreate()の呼び出しにフラグメントが – Barrier

+0

表示されていることを毎回取得していることにより、任意のフラグメントでアプリを起動した場合、それは文句を言わない、何度も何度も呼び出されること。 –

+0

私はビューページをスワイプしていません。私は、フラグメントフローを変更するためにボタンをクリックします。 – Barrier

1

setUserVisibleHintを使用すると問題が発生します.try viewPager.setOffscreenPageLimit(5);そして、setMenuVisibilityメソッドを使用して、あなたのviewpagerをスワイプしたときに通知

@Override 
public void setMenuVisibility(boolean menuVisible) { 
    super.setMenuVisibility(menuVisible); 
    if(menuVisible && isResumed()){ 
     // do your work here 
    } 
    if(!isResumed()){ 
     // do your work when Activity is created 
    } 
} 
関連する問題