2014-07-26 10 views
5

Ứng dụng của tôi bắt đầu bằng AddressFragment. Từ NavigationDrawer tôi bắt đầu (giữa những người khác) một mới AddressFragment với:Làm thế nào để giữ chỉ một thể hiện của một đoạn, khi chuyển đổi với NavigationDrawer?

getSupportFragmentManager().beginTransaction() 
       .replace(R.id.container, new AddressFragment()) 
       .addToBackStack(null) 
       .commit(); 

Nhưng tôi thà chỉ quay trở lại trường hợp đầu tiên. Làm thế nào tôi có thể làm điều đó?

Hoặc tổng quát hơn, làm thế nào tôi có thể tìm hiểu xem liệu một thể hiện của một đoạn đã tồn tại chưa và sau đó bắt đầu, nếu có, nếu không tạo một?

Trả lời

8

Khi tạo đoạn đặt thẻ cho nó, sau đó bạn có thể tìm thấy nó thông qua các đoạn quản lý và thay thế/tạo cho phù hợp.

FragmentManager fManager = getFragmentManager(); 
FragmentTransaction fTransaction = fManager.beginTransaction(); 
Fragment fragment = fManager.findFragmentByTag("uniqueTag"); 

// If fragment doesn't exist yet, create one 
if (fragment == null) { 
    fTransaction.add(R.id.fragment_list, new ListFrag(), "uniqueTag"); 
} 
else { // re-use the old fragment 
    fTransaction.replace(R.id.fragment_list, fragment, "uniqueTag"); 
} 
2

Lần đầu tiên bạn tạo đoạn bằng thẻ.

Khi bạn muốn thay thế nó cố gắng để có được mảnh bằng thẻ và nếu nó trả về null bạn tạo một hình mới

4

Bước một:

Tối ưu hóa mã hiện tại để cho phép một Fragment có "TAG" riêng của mình

getSupportFragmentManager().beginTransaction() 
       .replace(R.id.container, new AddressFragment()) 
       .addToBackStack(**AddressFragment.class.getName()**) 
       .commit(); 

Bước hai:

Một nơi nào đó trong ứng dụng của bạn chảy, bạn sẽ cần để xác định xem một phân đoạn có tồn tại hay không:

public static boolean isFragmentInBackstack(final FragmentManager fragmentManager, final String fragmentTagName) { 
    for (int entry = 0; entry < fragmentManager.getBackStackEntryCount(); entry++) { 
     if (fragmentTagName.equals(fragmentManager.getBackStackEntryAt(entry).getName())) { 
      return true; 
     } 
    } 
    return false; 
} 

Bước ba:

thực hiện thao tác đoạn

if (exists) { 
    // Fragment exists, go back to that fragment 
    //// you can also use POP_BACK_STACK_INCLUSIVE flag, depending on flow 
    mFragmentManager.popBackStackImmediate(AddressFragment.class.getName(), 0); 

} else { 
    // Fragment doesn't exist 
    // STEP 1 + additional backstack management 
} 
+0

Tôi đã giải quyết bằng giải pháp để gắn thẻ phân đoạn chứ không phải ngăn xếp lại. Trông cũng thú vị, có thể thử một lần khác. –

+0

Hóa ra, Back đó cho sau về một lỗi, nếu bạn không bật backstack, khi chuyển sang một đoạn hiện có. Vì vậy, tôi đã thêm một popBackStackImmediate, khi tái sử dụng một đoạn hiện có. –

+0

Trong trường hợp popping ngăn xếp lại bạn sẽ mất "một ví dụ của một mảnh", như tác giả mong muốn – Androider

1

câu trả lời được thử nghiệm này, Hy vọng điều này sẽ giúp bạn Đầu Thực hiện các lĩnh vực trên toàn cầu trong MainActivity

private static final int TIME_INTERVAL = 2000; 
private long mBackPressed; 
private FragmentManager fm; 
private FragmentTransaction ft; 
private DrawerLayout drawer; 

Bây giờ trong onNavigationItemSelected() thực hiện như thế

@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
Fragment fragment = null; 
Class fragmentClass = null; 
switch (item.getItemId()) { 
case R.id.nav_home: 
fragmentClass = Fragment.class;//this is MainAvctivty extends AppCompatActivity 
break; 
case R.id.nav_f1: 
fragmentClass = FragmentOne.class; 
break; 
case R.id.nav_f2: 
fragmentClass = FragmentTwo.class; 
break; 
case R.id.nav_f3: 
fragmentClass = FragmentThree.class; 
break; 
case R.id.nav_f4: 
fragmentClass = FragmentFour.class; 
break; 
case R.id.nav_f5: 
fragmentClass = FragmentFive.class; 
break; 
default: 
fragmentClass = Fragment.class; 
} 
try { 
fragment = (Fragment) fragmentClass.newInstance(); 
} catch (Exception e) {e.printStackTrace();} 
//Insert the fragment by replacing any existing fragment 
fm = getSupportFragmentManager(); 
ft = fm.beginTransaction(); 
ft.replace(R.id.frame_container, fragment); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
ft.addToBackStack(null); 
ft.commit(); 
item.setChecked(true); 
setTitle(item.getTitle()); 
drawer.closeDrawers(); 
return true; 
} 

Bây giờ, hãy xử lý được nén lại như dưới đây

@Override 
public void onBackPressed() { 
if (drawer != null) { 
fm = getSupportFragmentManager(); 
ft = fm.beginTransaction(); 
if (drawer.isDrawerOpen(GravityCompat.START)) { 
drawer.closeDrawer(GravityCompat.START); 
} else if (fm.getBackStackEntryCount() > 0) { 
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
ft.commit(); 
} else if (mBackPressed + TIME_INTERVAL > System.currentTimeMillis()) { 
super.onBackPressed(); 
} else { 
Toast.makeText(this,"Press again to exit the app",Toast.LENGTH_SHORT).show(); 
} 
mBackPressed = System.currentTimeMillis(); 
} 
} 
Các vấn đề liên quan