5

Tôi có một MainActivity (FragmentActivity) có một FragmentTabHost.FragmentTabHost & Fragments - Làm cách nào để chuyển dữ liệu giữa các tab?

public class FragmentTabs extends FragmentActivity { 
    private FragmentTabHost mTabHost; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.fragment_tabs); 
     mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost); 
     mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); 

     mTabHost.addTab(mTabHost.newTabSpec("classA").setIndicator("Class A"), 
      ClassA.class, null); 
     mTabHost.addTab(mTabHost.newTabSpec("classB").setIndicator("Class B"), 
      ClassB.class, null); 
     mTabHost.addTab(mTabHost.newTabSpec("classC").setIndicator("Class C"), 
      ClassC.class, null); 
    } 
} 

ClassA, ClassB và ClassC đều Những mảnh vỡ (android.support.v4.app.Fragment).

Tôi cần chuyển dữ liệu (và phương thức gọi) trên Phân đoạn. Làm thế nào tôi có thể nhận được một tài liệu tham khảo của từng mảnh vỡ, như thế này:.

ClassA mClassAFragment = ???; 

Tôi đã cố gắng sử dụng getSupportFragmentManager() findFragmentByTag() và tôi cũng đã cố gắng khám phá những khả năng của mTabHost. Không có gì có thể nhận được chúng.

Bạn có thể đề xuất cách để thực hiện việc này hoặc đề xuất phương pháp thay thế không?

Trả lời

11

OP tại đây. Để giải quyết vấn đề này, tôi đã quá tải phương pháp onAttachFragment trong FragmentActivity tôi:

public class FragmentTabs extends FragmentActivity { 
    private FragmentTabHost mTabHost; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
    } 

    @Override 
    public void onAttachFragment(Fragment fragment) { 
    super.onAttachFragment(fragment); 

    if (fragment.getClass() == ClassA.class) { 
     ClassA mClassAFragment = (ClassA)fragment 
      ... 
     } 
    } 
} 
+0

Lời khuyên tuyệt vời. Tôi nghĩ rằng đó là một cách tiếp cận khá tốt để làm điều đó như thế này. – Siggy

+1

Tôi nghĩ bạn nên thực hiện so sánh '.equals()' cho các lớp phân đoạn thay vì một phép so sánh trực tiếp '=='. – alexgophermix

+2

Hoặc intanceof sẽ còn tốt hơn: 'instance fragmentof ClassA' – kgautron

3

Bạn có thể lấy mảnh của bạn như thế này:

YourFragment frag = (YourFragment) getSupportFragmentManager() 
        .findFragmentById(R.id.fragmentid)); 

Để gửi dữ liệu đến một đoạn bạn có thể làm theo phương pháp này, việc tạo ra một giao dịch mới và gửi dữ liệu thông qua một gói.

Bundle arguments = new Bundle(); 
arguments.putString("some id string", "your data"); 
YourFragment fragment = new YourFragment(); 
fragment.setArguments(arguments); 
getSupportFragmentManager().beginTransaction().add(R.id.fragmentid, fragment).commit(); 
+8

Không tệ. Thật không may findFragmentById() không hoạt động với FragmentTabHost vì các đoạn được tạo ra chỉ khi chúng là tab hiện đang được chọn. I E. ClassB và ClassC không tồn tại cho đến khi tôi chọn chúng. Tôi sẽ đánh dấu câu trả lời của bạn là câu trả lời, bởi vì tôi nghĩ nó khá gần và rất hữu ích. Tôi sẽ cung cấp câu trả lời của riêng tôi để biết thêm thông tin. –

1

này có thể được thực hiện bằng cách lập luận thứ 3 của android.support.v4.app.FragmentTabHost.addTab (TabSpec, Class, Bundle args), thì args thể được lấy ra qua android.support.v4.app.Fragment.getArguments()

public class Tab1Fragment extends BaseFragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // do something with the arguments 
    Log.i("DEBUG", "" + getArguments()); 
    // ... 
} 

}

+0

Thật không may, không. Đây rõ ràng là ý định ban đầu nhưng 'getArguments()' luôn trả về null ở đó. Một sự xấu hổ, thực sự ... –

Các vấn đề liên quan