2016-09-21 20 views
9

Tôi có hai lớp mảnh tên SessionTabBillingTab và tôi đang cố gắng để tạo ra thể hiện của những lớp sử dụngLàm thế nào để nhanh chóng lớp đoạn sử dụng tên lớp thay vì chỉ số

SessionTab sessionTab = (SessionTab) getSupportFragmentManager().getFragments().get(1); 

nhưng đôi khi chỉ số cho những lớp học được đảo ngược và sau đó nó gây ra ClassCastException

làm thế nào tôi có thể lấy ví dụ của những lớp mảnh bằng cách thông qua tên lớp thay vì chỉ mục hoặc bất kỳ cách nào để đảm bảo rằng chỉ số của những lớp vẫn như mọi cùng vì vậy nó không gây ClassCastException

+0

đăng phần còn lại của mã nếu bạn vẫn cần trợ giúp. –

Trả lời

6

Sử dụng một trong các phương pháp sau: findFragmentById()findFragmentByTag() phương pháp.

tham khảo: https://developer.android.com/reference/android/app/FragmentManager.html#findFragmentById(int)

Cập nhật:

ClassCastException được gọi khi bạn đang không đúc các lớp học phù hợp với nhau. Trong trường hợp của bạn, số FragmentManager của bạn đang trả về các đoạn khác nhau hơn SessionTab, do đó, ngoại lệ được ném.

Nếu bạn sử dụng findFragmentById() hoặc findFragmentByTag(), khi đó nó sẽ trả lại phân đoạn chính xác những gì bạn muốn và ngoại lệ sẽ không được ném.

4

Xác định một 'tag' cho Fragment khi thêm nó như

getFragmentManager().beginTransaction().add(new Fragment(),"your_tag"); 

Và trong khi tham khảo nó sử dụng

getFragmentManager().findFragmentByTag("your_tag"); 

Trong hầu hết các trường hợp, bạn muốn sử dụng YourFragment.class.getSimpleName() như thẻ của mình.

+0

Tôi không chắc chắn làm thế nào để thực hiện nó. Tôi không thể khởi tạo lớp học của mình bằng cách sử dụng –

+0

Tôi nghĩ đây là cách tốt nhất và sạch nhất để thực hiện nó. @AkashKumar bạn bị kẹt ở đâu? – codewing

+0

@ZorawarSachdev 'YourFragment.class.getSimpleName() 'cho các mảnh của lớp hoạt động cha mẹ không phải là tên lớp phân mảnh hiện tại –

1

Trước hết, nếu bạn nên hiểu ví dụ đó cho bất kỳ Phân đoạn nào bạn có thể lấy từ api lớp Java. Giống như bên dưới:

Class<?> class = Class.forName("example.package.BillingFragment"); 
Constructor<?> cons = class.getConstructor(BillingFragment.class); 
BillingFragment object = (BillingFragment) cons.newInstance(); 

Ví dụ về mã hiển thị, cách lấy Trường hợp từ bất kỳ lớp nào trong Java. Nhưng bạn nói một vài thứ khác. Nếu tôi hiểu đúng, bạn muốn lấy Fragment từ FragmentManager.

Bạn có thể làm điều đó, trong trường hợp nếu bạn đã xác định Phân đoạn trước đó! Ví dụ, bạn có dòng ứng dụng cơ sở, và sau đó bạn muốn thêm Fragment. Bạn có thể kiểm tra FragmentManager nếu có Fragments trong stack. Nhưng trong trường hợp của ngăn xếp rỗng, bạn nên thêm chúng:

String billingFragmentTag = BillingFragment.class.getSimpleName(); 

...... 

if (getFragmentManager.findFragmentByTag(billingFragmentTag) == null) { 
    BillingFragment fragment = new BillingFragment(); 
    String billingFragmentTag = BillingFragment.class.getSimpleName(); 

    FragmentTransaction fragTrans = getFragmentManager().beginTransaction(); 
      fragTrans.add(fragment, billingFragmentTag).commit(); 
} 

...... 

Vì vậy, sau này, bạn có thể kiểm tra nếu có Fragment của bạn trong ngăn xếp và móc ví dụ tích cực này. Điều này là chính xác và dòng chảy tiêu chuẩn cho việc sử dụng Fragments.

...... 

if (getFragmentManager.findFragmentByTag(billingFragmentTag) != null) { 
    BillingFragment fragment = getFragmentManager.findFragmentByTag(billingFragmentTag); 
    String billingFragmentTag = BillingFragment.class.getSimpleName(); 

    FragmentTransaction fragTrans = getFragmentManager().beginTransaction(); 
      fragTrans.add(fragment, billingFragmentTag).commit(); 
} 

.... 

Chào mừng bạn!

+0

tại sao bạn không chỉ làm đối tượng BillingFragment = new BillingFragment(); – codewing

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