2017-09-13 1 views
0

私は、下部のタブメニューを切り替える4つの断片で、アプリケーション内に1つのアクティビティしか持っていません。だから、一度に画面上に常に4つの断片の1つです。シンプルに見えますが、フラグメントを切り替えることで新しいフラグメントオブジェクトを毎回再作成する必要があるのはなぜですか?私は自分でフラグメントへの参照を格納しようとする準備ができてオブジェクトを毎回選ぶことができフラグメントを切り替えることで、毎回フラグメントオブジェクトを作成しないようにするにはどうすればよいですか?

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
// Replace the contents of the container with the new fragment 
ft.replace(R.id.your_placeholder, new FooFragment()); 
// or ft.add(R.id.your_placeholder, new FooFragment()); 
// Complete the changes added above 
ft.commit(); 

が、私は、このようなフラグメントの使用スタイルの例に見られるので、それはそれと間違って何かあるかもしれない:これはAndroidのドキュメントからです?

+0

は私だけスワイプページを実装することにより、ViewPagerを知っている私の更新の答え –

答えて

1

ViewPagerでフラグメントを設定し、ViewPagerページを切り替えるだけです。

これを試してみてください:

viewPager = (ViewPager) findViewById(R.id.viewpager); 
    FragmentAdapter adapter = new FragmentAdapter(getSupportFragmentManager()); 
    adapter.addFragment(new ExplorerFragment(), "Fragment1", false); 
    adapter.addFragment(new NotificationFragment(), "Fragment2", false); 
    adapter.addFragment(new HistoryFragment(), "Fragment3", false); 
    adapter.addFragment(new AccountFragment(), "Fragment4", false); 
    viewPager.setAdapter(adapter); 

    bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
      int id = item.getItemId(); 
      switch (id){ 
       case R.id.action_explorer: 
        viewPager.setCurrentItem(0); 
        final Menu bottomMenu = bottomNavigationView.getMenu(); 
        final MenuItem targetMenuItem = bottomMenu.getItem(0); 
        targetMenuItem.setChecked(true); 
        break; 
       case R.id.action_notification: 
        viewPager.setCurrentItem(1); 
        final Menu bottomMenu1 = bottomNavigationView.getMenu(); 
        final MenuItem targetMenuItem1 = bottomMenu1.getItem(1); 
        targetMenuItem1.setChecked(true); 
        break; 
       case R.id.action_history: 
        viewPager.setCurrentItem(2); 
        final Menu bottomMenu2 = bottomNavigationView.getMenu(); 
        final MenuItem targetMenuItem2 = bottomMenu2.getItem(2); 
        targetMenuItem2.setChecked(true); 
        break; 
       case R.id.action_account: 
        viewPager.setCurrentItem(3); 
        final Menu bottomMenu4 = bottomNavigationView.getMenu(); 
        final MenuItem targetMenuItem4 = bottomMenu4.getItem(3); 
        targetMenuItem4.setChecked(true); 
        break; 
       case R.id.action_search: 
        break; 
      } 
      return true; 
     } 
    }); 

EDIT1:

public class NonSwipeableViewPager extends ViewPager { 

    public NonSwipeableViewPager(Context context) { 
     super(context); 
     setMyScroller(); 
    } 

    public NonSwipeableViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setMyScroller(); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent event) { 
     // Never allow swiping to switch between pages 
     return false; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     // Never allow swiping to switch between pages 
     return false; 
    } 

    //down one is added for smooth scrolling 

    private void setMyScroller() { 
     try { 
      Class<?> viewpager = ViewPager.class; 
      Field scroller = viewpager.getDeclaredField("mScroller"); 
      scroller.setAccessible(true); 
      scroller.set(this, new MyScroller(getContext())); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public class MyScroller extends Scroller { 
     public MyScroller(Context context) { 
      super(context, new DecelerateInterpolator()); 
     } 

     @Override 
     public void startScroll(int startX, int startY, int dx, int dy, int duration) { 
      super.startScroll(startX, startY, dx, dy, 350 /*1 secs*/); 
     } 
    } 
} 

してからXMLに:

<com.project.Components.NonSwipeableViewPager 
    android:id="@+id/viewpager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_above="@id/bottom_navigation"/> 
+0

を参照してください。どのような種類のアニメーションやスワイプジェスチャーを無効にして、すぐにフラグメントを置き換えることができるかどうか知っていますか? –

+0

また、ViewPagerは一度に限られた数のフラグメントしか保持していないことがわかりました。したがって、キャッシュが3つしかない場合、私の場合にエッジが見つかったフラグメントは、引き続き常に再作成されます。 –

+1

はい。カスタムViewPagerコンポーネントを作成するだけです。 @ArnieSchwarzvogelコードで投稿を編集します –

0

は一度、すべてのフラグメントを作成し、それを使用NonSwipeableViewPagerを作成する方法フラグメントオブジェクトをシングルトンとして作成してください。

シングルトン例:

class MyFragment extends Fragment{ 
    private static MyFragment instance; 

    public static MyFragment getInstance(){ 
    if(instance == null) 
     instance = new MyFragment(); 

    return instance; 
    } 
} 

今では新しいオブジェクトを毎回作成されませんMyFragment.getInstance();

で使用して、オブジェクトの断片を作成します。

0

あなたは交換しながら、あなたのフラグメントにTAGを追加し、後でFragmentManagerfindFragmentByTagを使用して、それを取得することができます。

FragmentManager fm = getSupportFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 
// Replace the contents of the container with the new fragment 
Fragment fooFrag = fm.findFragmentByTag("foo-frag-tag"); 

if(fooFrag == null) { 
    fooFrag = new FooFrag(); 
} 

ft.replace(R.id.your_placeholder, fooFrag, "foo-frag-tag"); 
// or ft.add(R.id.your_placeholder, new FooFragment()); 
// Complete the changes added above 
ft.commit(); 
+0

いいアイデアもあります。 –

+0

残念ながら、これはうまくいきません.FragmentManagerはフラグメントを単にキャッシュするだけではなく、まったく異なるストーリーであるputFragment()と組み合わせて使用​​されます –

関連する問題