2013-02-22 35 views
30

Tôi có một ListFragment trong MainActivity của tôi. Đây là cách tôi đặt đối tượng mảnh của mình.Có cách nào để lấy phân đoạn từ trên cùng của ngăn xếp không?

FragmentManager fragmentManager = activity.getSupportFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
Fragment newFragment = new MyFragment(); 
fragmentTransaction.replace(R.id.framecontainer, newFragment, "tag"); 
fragmentTransaction.addToBackStack(null); 
fragmentTransaction.commit(); 

Vấn đề là khi báo chí sử dụng lại nút, tôi phải, ít nhất, thay đổi thanh tác vụ và trình đơn bằng cách gọi

getActionBar().setTitle(title); 
getActionBar().setDisplayHomeAsUpEnabled(isEnabled); 
invalidateOptionsMenu(); 

tôi phải biết những loại mảnh được hiện đang hiển thị , để tôi biết cách đặt thanh hành động. Tôi lưu trữ các tùy chọn thiết lập trong phân đoạn như các đối số.

String title = fragment.getArguments().getString("KEY_TITLE"); 
boolean isEnabled = fragment.getArguments().getBoolean("KEY_ISENABLED"); 

tôi làm tìm kiếm các câu hỏi có liên quan, và tôi nhận ra rằng tôi có thể nhận được các mảnh vỡ bằng cách gọi

MyFragment fragment = (MyFragment) getSupportFragmentManager() 
     .findFragmentByTag("tag"); 

Tuy nhiên, tôi phải lưu trữ tất cả các từ khóa trong một ngăn xếp tùy chỉnh, và gọi pop () mọi lúc khi người dùng nhấn nút quay lại trong onBackPressed().

Vì vậy, câu hỏi của tôi là có cách nào để tôi có được phân đoạn hiển thị hiện tại từ ngăn xếp trực tiếp không?

Lưu ý: Xin lưu ý rằng các loại phân đoạn khác nhau, không chỉ riêng MyFragment.

Trả lời

52

Một số điều như thế này sẽ giúp hình hoạt động của bạn này trên backpress:

private Fragment getCurrentFragment(){ 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    String fragmentTag = fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1).getName(); 
    Fragment currentFragment = fragmentManager.findFragmentByTag(fragmentTag); 
    return currentFragment; 
} 

@Override 
public void onBackPressed() { 
    Fragment fragmentBeforeBackPress = getCurrentFragment(); 
    // Perform the usual back action 
    super.onBackPressed(); 
    Fragment fragmentAfterBackPress = getCurrentFragment(); 
} 

Hope this helps.

+6

Có vẻ như rằng nếu tôi làm điều đó theo cách của bạn, tôi phải thiết * * fragmentTransaction.addToBackStack (tag) **; Nếu không, tôi sẽ nhận được một NullPointerException. Vì vậy, ** fragmentManager.getBackStackEntryAt (fragmentManager.getBackStackEntryCount() - 1) .getName(); ** không đề cập đến tên thẻ –

+1

Yea ... bạn sẽ phải kiểm tra các giá trị rỗng và toán sai ((getBackStackEntryCount-1)> 0 và như vậy).Tôi đã viết điều này quá nhanh. Ngoài ra, các phân đoạn được thêm vào mà không có thẻ sẽ xuất hiện dưới dạng null. – petey

+0

nó sẽ vẫn hoạt động nếu tôi sử dụng addToBackStack (null)? – umerk44

20
FragmentManager.findFragmentById(fragmentsContainerId) 

function trả về liên kết đến đầu Fragment trong backstack. Ví dụ sử dụng:

fragmentManager.addOnBackStackChangedListener(new OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      Fragment fr = fragmentManager.findFragmentById(R.id.fragmentsContainer); 
      if(fr!=null){ 
       Log.e("fragment=", f.getClass().getSimpleName()); 
      } 
     } 
    }); 
+0

Điều này có vẻ kỳ quái ... nhưng có hiệu quả với tôi :). Các tài liệu nói rằng nó tìm kiếm backstack, vì vậy hy vọng nó luôn luôn tìm kiếm từ trên cùng của ngăn xếp, trong tất cả các phiên bản của Android (ngón tay vượt qua). – delrocco

+0

Tôi đã tìm kiếm điều này từ rất lâu. Cảm ơn bạn đã thanh toán bù trừ cách người nghe này hoạt động – mikebertiean

1

Đã có câu trả lời được đánh dấu là chính xác và thông tin bổ sung của tôi sẽ không khác với điều đó. NHƯNG, tôi gặp rắc rối khi sử dụng máy thu để cố gắng tìm ra nếu đoạn từ nơi người nhận đến từ đoạn trên cùng hiện tại trên ngăn xếp. Bạn có thể dễ dàng chạy trong rất nhiều NPE và Index ngoài giới hạn. Vì vậy, tôi đã viết điều này, có thể nó giúp ai đó.

private boolean isFragmentOnTop(Activity parentActivity, final String fragmentName){ 
     FragmentManager fmManager = parentActivity.getFragmentManager(); 
     if(fmManager.getBackStackEntryCount() == 0){ 
      LOG.i("BackStack entry count is 0: " + this); 
      return false; 
     } 
     String fragmentNameOnStackTop = ""; 
     final FragmentManager.BackStackEntry topEntry = fmManager.getBackStackEntryAt(fmManager.getBackStackEntryCount() -1); 
     if(topEntry != null) { 
      fragmentNameOnStackTop = topEntry.getName(); 
     } 
     LOG.d("Got fragments name: " + fragmentNameOnStackTop); 
     return fragmentNameOnStackTop != null ? fragmentNameOnStackTop.equals(fragmentName) : false; 
    } 

Lưu ý rằng điều này phù hợp với hoạt động có một số đoạn. Hãy lưu ý nếu bạn đang sử dụng bằng cách sử dụng ViewPager một người quản lý trẻ em.

Và đừng quên để thiết lập fragmentName trong FragmentTransaction.addToBackStack(fragmentName)

0

phương thức này để có được đoạn từ đỉnh stack:

public Fragment getTopFragment() { 
    if (getSupportFragmentManager().getBackStackEntryCount() == 0) { 
     return null; 
    } 
    String fragmentTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName(); 
    return getSupportFragmentManager().findFragmentByTag(fragmentTag); 
} 
Các vấn đề liên quan